mirror of
https://github.com/adtools/clib2.git
synced 2025-12-08 14:59:05 +00:00
Compare commits
1 Commits
BEFORE_CON
...
V1_168
| Author | SHA1 | Date | |
|---|---|---|---|
| baf7257d89 |
@ -1,13 +0,0 @@
|
|||||||
# The "checkoutlist" file is used to support additional version controlled
|
|
||||||
# administrative files in $CVSROOT/CVSROOT, such as template files.
|
|
||||||
#
|
|
||||||
# The first entry on a line is a filename which will be checked out from
|
|
||||||
# the corresponding RCS file in the $CVSROOT/CVSROOT directory.
|
|
||||||
# The remainder of the line is an error message to use if the file cannot
|
|
||||||
# be checked out.
|
|
||||||
#
|
|
||||||
# File format:
|
|
||||||
#
|
|
||||||
# [<whitespace>]<filename>[<whitespace><error message>]<end-of-line>
|
|
||||||
#
|
|
||||||
# comment lines begin with '#'
|
|
||||||
@ -1,15 +0,0 @@
|
|||||||
# The "commitinfo" file is used to control pre-commit checks.
|
|
||||||
# The filter on the right is invoked with the repository and a list
|
|
||||||
# of files to check. A non-zero exit of the filter program will
|
|
||||||
# cause the commit to be aborted.
|
|
||||||
#
|
|
||||||
# The first entry on a line is a regular expression which is tested
|
|
||||||
# against the directory that the change is being committed to, relative
|
|
||||||
# to the $CVSROOT. For the first match that is found, then the remainder
|
|
||||||
# of the line is the name of the filter to run.
|
|
||||||
#
|
|
||||||
# If the repository name does not match any of the regular expressions in this
|
|
||||||
# file, the "DEFAULT" line is used, if it is specified.
|
|
||||||
#
|
|
||||||
# If the name "ALL" appears as a regular expression it is always used
|
|
||||||
# in addition to the first matching regex or "DEFAULT".
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
# Set this to "no" if pserver shouldn't check system users/passwords
|
|
||||||
#SystemAuth=no
|
|
||||||
|
|
||||||
# Put CVS lock files in this directory rather than directly in the repository.
|
|
||||||
#LockDir=/var/lock/cvs
|
|
||||||
|
|
||||||
# Set `TopLevelAdmin' to `yes' to create a CVS directory at the top
|
|
||||||
# level of the new working directory when using the `cvs checkout'
|
|
||||||
# command.
|
|
||||||
#TopLevelAdmin=no
|
|
||||||
|
|
||||||
# Set `LogHistory' to `all' or `TOEFWUPCGMAR' to log all transactions to the
|
|
||||||
# history file, or a subset as needed (ie `TMAR' logs all write operations)
|
|
||||||
#LogHistory=TOEFWUPCGMAR
|
|
||||||
|
|
||||||
# Set `RereadLogAfterVerify' to `always' (the default) to allow the verifymsg
|
|
||||||
# script to change the log message. Set it to `stat' to force CVS to verify# that the file has changed before reading it (this can take up to an extra
|
|
||||||
# second per directory being committed, so it is not recommended for large
|
|
||||||
# repositories. Set it to `never' (the previous CVS behavior) to prevent
|
|
||||||
# verifymsg scripts from changing the log message.
|
|
||||||
#RereadLogAfterVerify=always
|
|
||||||
@ -1,19 +0,0 @@
|
|||||||
# This file affects handling of files based on their names.
|
|
||||||
#
|
|
||||||
# The -m option specifies whether CVS attempts to merge files.
|
|
||||||
#
|
|
||||||
# The -k option specifies keyword expansion (e.g. -kb for binary).
|
|
||||||
#
|
|
||||||
# Format of wrapper file ($CVSROOT/CVSROOT/cvswrappers or .cvswrappers)
|
|
||||||
#
|
|
||||||
# wildcard [option value][option value]...
|
|
||||||
#
|
|
||||||
# where option is one of
|
|
||||||
# -f from cvs filter value: path to filter
|
|
||||||
# -t to cvs filter value: path to filter
|
|
||||||
# -m update methodology value: MERGE or COPY
|
|
||||||
# -k expansion mode value: b, o, kkv, &c
|
|
||||||
#
|
|
||||||
# and value is a single-quote delimited value.
|
|
||||||
# For example:
|
|
||||||
#*.gif -k 'b'
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
# The "editinfo" file is used to allow verification of logging
|
|
||||||
# information. It works best when a template (as specified in the
|
|
||||||
# rcsinfo file) is provided for the logging procedure. Given a
|
|
||||||
# template with locations for, a bug-id number, a list of people who
|
|
||||||
# reviewed the code before it can be checked in, and an external
|
|
||||||
# process to catalog the differences that were code reviewed, the
|
|
||||||
# following test can be applied to the code:
|
|
||||||
#
|
|
||||||
# Making sure that the entered bug-id number is correct.
|
|
||||||
# Validating that the code that was reviewed is indeed the code being
|
|
||||||
# checked in (using the bug-id number or a seperate review
|
|
||||||
# number to identify this particular code set.).
|
|
||||||
#
|
|
||||||
# If any of the above test failed, then the commit would be aborted.
|
|
||||||
#
|
|
||||||
# Actions such as mailing a copy of the report to each reviewer are
|
|
||||||
# better handled by an entry in the loginfo file.
|
|
||||||
#
|
|
||||||
# One thing that should be noted is the the ALL keyword is not
|
|
||||||
# supported. There can be only one entry that matches a given
|
|
||||||
# repository.
|
|
||||||
@ -1,27 +0,0 @@
|
|||||||
# The "loginfo" file controls where "cvs commit" log information
|
|
||||||
# is sent. The first entry on a line is a regular expression which must match
|
|
||||||
# the directory that the change is being made to, relative to the
|
|
||||||
# $CVSROOT. If a match is found, then the remainder of the line is a filter
|
|
||||||
# program that should expect log information on its standard input.
|
|
||||||
#
|
|
||||||
# If the repository name does not match any of the regular expressions in this
|
|
||||||
# file, the "DEFAULT" line is used, if it is specified.
|
|
||||||
#
|
|
||||||
# If the name ALL appears as a regular expression it is always used
|
|
||||||
# in addition to the first matching regex or DEFAULT.
|
|
||||||
#
|
|
||||||
# You may specify a format string as part of the
|
|
||||||
# filter. The string is composed of a `%' followed
|
|
||||||
# by a single format character, or followed by a set of format
|
|
||||||
# characters surrounded by `{' and `}' as separators. The format
|
|
||||||
# characters are:
|
|
||||||
#
|
|
||||||
# s = file name
|
|
||||||
# V = old version number (pre-checkin)
|
|
||||||
# v = new version number (post-checkin)
|
|
||||||
# t = tag or branch name
|
|
||||||
#
|
|
||||||
# For example:
|
|
||||||
#DEFAULT (echo ""; id; echo %s; date; cat) >> $CVSROOT/CVSROOT/commitlog
|
|
||||||
# or
|
|
||||||
#DEFAULT (echo ""; id; echo %{sVv}; date; cat) >> $CVSROOT/CVSROOT/commitlog
|
|
||||||
@ -1,26 +0,0 @@
|
|||||||
# Three different line formats are valid:
|
|
||||||
# key -a aliases...
|
|
||||||
# key [options] directory
|
|
||||||
# key [options] directory files...
|
|
||||||
#
|
|
||||||
# Where "options" are composed of:
|
|
||||||
# -i prog Run "prog" on "cvs commit" from top-level of module.
|
|
||||||
# -o prog Run "prog" on "cvs checkout" of module.
|
|
||||||
# -e prog Run "prog" on "cvs export" of module.
|
|
||||||
# -t prog Run "prog" on "cvs rtag" of module.
|
|
||||||
# -u prog Run "prog" on "cvs update" of module.
|
|
||||||
# -d dir Place module in directory "dir" instead of module name.
|
|
||||||
# -l Top-level directory only -- do not recurse.
|
|
||||||
#
|
|
||||||
# NOTE: If you change any of the "Run" options above, you'll have to
|
|
||||||
# release and re-checkout any working directories of these modules.
|
|
||||||
#
|
|
||||||
# And "directory" is a path to a directory relative to $CVSROOT.
|
|
||||||
#
|
|
||||||
# The "-a" option specifies an alias. An alias is interpreted as if
|
|
||||||
# everything on the right of the "-a" had been typed on the command line.
|
|
||||||
#
|
|
||||||
# You can encode a module within a module by using the special '&'
|
|
||||||
# character to interpose another module into the current module. This
|
|
||||||
# can be useful for creating a module that consists of many directories
|
|
||||||
# spread out over the entire source repository.
|
|
||||||
@ -1,12 +0,0 @@
|
|||||||
# The "notify" file controls where notifications from watches set by
|
|
||||||
# "cvs watch add" or "cvs edit" are sent. The first entry on a line is
|
|
||||||
# a regular expression which is tested against the directory that the
|
|
||||||
# change is being made to, relative to the $CVSROOT. If it matches,
|
|
||||||
# then the remainder of the line is a filter program that should contain
|
|
||||||
# one occurrence of %s for the user to notify, and information on its
|
|
||||||
# standard input.
|
|
||||||
#
|
|
||||||
# "ALL" or "DEFAULT" can be used in place of the regular expression.
|
|
||||||
#
|
|
||||||
# For example:
|
|
||||||
#ALL mail -s "CVS notification" %s
|
|
||||||
@ -1,13 +0,0 @@
|
|||||||
# The "rcsinfo" file is used to control templates with which the editor
|
|
||||||
# is invoked on commit and import.
|
|
||||||
#
|
|
||||||
# The first entry on a line is a regular expression which is tested
|
|
||||||
# against the directory that the change is being made to, relative to the
|
|
||||||
# $CVSROOT. For the first match that is found, then the remainder of the
|
|
||||||
# line is the name of the file that contains the template.
|
|
||||||
#
|
|
||||||
# If the repository name does not match any of the regular expressions in this
|
|
||||||
# file, the "DEFAULT" line is used, if it is specified.
|
|
||||||
#
|
|
||||||
# If the name "ALL" appears as a regular expression it is always used
|
|
||||||
# in addition to the first matching regex or "DEFAULT".
|
|
||||||
@ -1,20 +0,0 @@
|
|||||||
# The "taginfo" file is used to control pre-tag checks.
|
|
||||||
# The filter on the right is invoked with the following arguments:
|
|
||||||
#
|
|
||||||
# $1 -- tagname
|
|
||||||
# $2 -- operation "add" for tag, "mov" for tag -F, and "del" for tag -d
|
|
||||||
# $3 -- repository
|
|
||||||
# $4-> file revision [file revision ...]
|
|
||||||
#
|
|
||||||
# A non-zero exit of the filter program will cause the tag to be aborted.
|
|
||||||
#
|
|
||||||
# The first entry on a line is a regular expression which is tested
|
|
||||||
# against the directory that the change is being committed to, relative
|
|
||||||
# to the $CVSROOT. For the first match that is found, then the remainder
|
|
||||||
# of the line is the name of the filter to run.
|
|
||||||
#
|
|
||||||
# If the repository name does not match any of the regular expressions in this
|
|
||||||
# file, the "DEFAULT" line is used, if it is specified.
|
|
||||||
#
|
|
||||||
# If the name "ALL" appears as a regular expression it is always used
|
|
||||||
# in addition to the first matching regex or "DEFAULT".
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
# The "verifymsg" file is used to allow verification of logging
|
|
||||||
# information. It works best when a template (as specified in the
|
|
||||||
# rcsinfo file) is provided for the logging procedure. Given a
|
|
||||||
# template with locations for, a bug-id number, a list of people who
|
|
||||||
# reviewed the code before it can be checked in, and an external
|
|
||||||
# process to catalog the differences that were code reviewed, the
|
|
||||||
# following test can be applied to the code:
|
|
||||||
#
|
|
||||||
# Making sure that the entered bug-id number is correct.
|
|
||||||
# Validating that the code that was reviewed is indeed the code being
|
|
||||||
# checked in (using the bug-id number or a seperate review
|
|
||||||
# number to identify this particular code set.).
|
|
||||||
#
|
|
||||||
# If any of the above test failed, then the commit would be aborted.
|
|
||||||
#
|
|
||||||
# Actions such as mailing a copy of the report to each reviewer are
|
|
||||||
# better handled by an entry in the loginfo file.
|
|
||||||
#
|
|
||||||
# One thing that should be noted is the the ALL keyword is not
|
|
||||||
# supported. There can be only one entry that matches a given
|
|
||||||
# repository.
|
|
||||||
@ -1,19 +0,0 @@
|
|||||||
In order to build the library, you need a 'C' compiler (obvious, isn't it?) and
|
|
||||||
a set of header files for the networking API definitions. The networking header
|
|
||||||
files go into a directory "netinclude" which has to sit in the same directory as
|
|
||||||
the source code and the "include" directory you find in there. I'm not currently
|
|
||||||
supplying these header files here. Drop me a line, and I'll take care of that.
|
|
||||||
|
|
||||||
The SAS/C flavour (smakefile) should get the library built using the "large data"
|
|
||||||
model. This rules out the use of residentable programs as the startup code I'm
|
|
||||||
using is very primitive (startup.o) and doesn't tinker with A4 relative data
|
|
||||||
addressing (and how this may be set up).
|
|
||||||
|
|
||||||
There are two makefiles for GCC, each a different flavour. There is "GNUmakefile.68k",
|
|
||||||
which will build the library for GCC on the 68k platform ("classic" Amiga). This
|
|
||||||
builds all variants of the library, for large data, small data, resident, whatever
|
|
||||||
model. It's a lot of work and I don't recommend you do this on a plain 68k machine.
|
|
||||||
It will literally (!) take hours. The other makefile flavour is for AmigaOS4 using
|
|
||||||
the PowerPC hosted GCC system ("GNUmakefile.os4"). This builds only the large data
|
|
||||||
version of the library, but this is usually all you need. Small data support is
|
|
||||||
currently not implemented but might follow in the future.
|
|
||||||
@ -1,235 +0,0 @@
|
|||||||
An ISO 'C' (1994) compliant runtime library for the Amiga
|
|
||||||
=========================================================
|
|
||||||
|
|
||||||
1. What is this?
|
|
||||||
|
|
||||||
This is my attempt to get Samba 2.2.x ported to the Amiga. My first Amiga
|
|
||||||
port required SAS/C and a number of strange tricks had to be pulled to get
|
|
||||||
it to support the kind of environment Samba needed. But with the
|
|
||||||
introduction of Samba 2.2.x many of those tricks did not work any more,
|
|
||||||
which is why I decided to attack the problem at the root, namely the
|
|
||||||
runtime library.
|
|
||||||
|
|
||||||
Because it was no longer possible to build Samba with SAS/C on the new
|
|
||||||
Amiga platform, the idea came up to move development to the GNU 'C'
|
|
||||||
compiler. This turned out to be a challenge due to its somewhat
|
|
||||||
underdeveloped runtime library and header files. Eventually, I decided to
|
|
||||||
rewrite that library from scratch.
|
|
||||||
|
|
||||||
|
|
||||||
2. What does it do?
|
|
||||||
|
|
||||||
Using "'C' - A reference manual" as a reference I wrote a set of header
|
|
||||||
files, then proceeded to implement each single function referenced in them.
|
|
||||||
With few exceptions in the area of wide character support, the result
|
|
||||||
should be a feature complete implementation of the ISO 'C' (1994) runtime
|
|
||||||
library.
|
|
||||||
|
|
||||||
Because Samba needs a few POSIX-like routines to be supported, the library
|
|
||||||
functionality is complemented by a set of routines described in "Advanced
|
|
||||||
programming in the Unix environent". This set is not complete, however. It
|
|
||||||
will have to grow even further to accomodate for Samba's needs, but this is
|
|
||||||
a good start. I specifically added hooks for integrating socket I/O at a
|
|
||||||
later point of time.
|
|
||||||
|
|
||||||
This is not a portable implementation of the library in the sense that you
|
|
||||||
could move it from one 'C' compiler on one operating system to another.
|
|
||||||
This is an Amiga specific implementation.
|
|
||||||
|
|
||||||
The library supports floating point math, which is limited to IEEE single
|
|
||||||
and double precision or M68881 inline math. There is no support for the
|
|
||||||
fast floating point (FFP) format or exclusive IEEE single precision. You
|
|
||||||
either get double precision (IEEE math) or extended precision (M68881
|
|
||||||
inline math). What it is that you get is determined at compile time. Use
|
|
||||||
the IEEE_FLOATING_POINT_SUPPORT preprocessor symbol to activate IEEE math
|
|
||||||
code and the M68881_FLOATING_POINT_SUPPORT symbol for M68881 inline math.
|
|
||||||
|
|
||||||
Not unlike SAS/C, you can configure a minimum stack size the program is to
|
|
||||||
use when it starts up. This is controlled via the '__stack_size' variable
|
|
||||||
(see "stdlib_main.c").
|
|
||||||
|
|
||||||
I added some amiga.lib and debug.lib functionality to the library, but
|
|
||||||
don't count on it to be complete.
|
|
||||||
|
|
||||||
|
|
||||||
3. What does it not do?
|
|
||||||
|
|
||||||
This library is a departure from the typical 'C' runtime environments of
|
|
||||||
the past which had to run on all AmigaOS releases, down to Kickstart 1.1.
|
|
||||||
This very library was designed to take advantage of the routines available
|
|
||||||
since Kickstart 2.04 was introduced and virtually nobody ever put to use.
|
|
||||||
This helps to cut the code size, and it also helps to keep bugs out of the
|
|
||||||
library by falling back onto well-tested implementations. However, the
|
|
||||||
catch is that the code won't run under Kickstart 1.3 and below. But then
|
|
||||||
these operating system releases have been obsolete for more than a decade,
|
|
||||||
and you can always go back to a compiler environment which supports them.
|
|
||||||
|
|
||||||
Practically all library routines are implemented in a sort of na<6E>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'<27>runtime library, this one performs its
|
|
||||||
^C checking in the I/O routines. Typically once upon entry and in every
|
|
||||||
iteration of the loop there might be it will quickly poll the ^C signal and
|
|
||||||
drop into raise(SIGINT) in case the signal is set. This is just about the
|
|
||||||
safest method to solve the problem and should be much more robust than the
|
|
||||||
ixemul approach of 'interrupt anywhere - crash anywhere' using the task
|
|
||||||
switch/launch hooks to test for signals.
|
|
||||||
|
|
||||||
By default all library routines follow the ISO 'C' conventions in that
|
|
||||||
where implementation defined behaviour is permitted, the AmigaOS rules are
|
|
||||||
followed. For example, unlink() will by default operate like DeleteFile()
|
|
||||||
and rename() will return with an error code set if the name of the
|
|
||||||
file/directory to be renamed would collide with an existing directory
|
|
||||||
entry. However, your program can set a global variable '__unix_semantics'
|
|
||||||
which will cause some routines to perform like their Unix counterparts.
|
|
||||||
This is necessary for Samba to work but not a generally desirable feature.
|
|
||||||
You have some Unix-like behaviour, but the environment itself is not
|
|
||||||
completely Unix- or POSIX-compliant. And it shouldn't be. Don't make the
|
|
||||||
mistake of trying to mold the environment into a POSIX emulation. It
|
|
||||||
doesn't work; AmigaOS is not Unix.
|
|
||||||
|
|
||||||
|
|
||||||
7. The startup code
|
|
||||||
|
|
||||||
There are three program startup files provided. The most simplistic is in
|
|
||||||
'startup.c' which I use for SAS/C. It just invokes the setup routine which
|
|
||||||
eventually calls main() and drops straight into exit().
|
|
||||||
|
|
||||||
The ncrt0.S file was adapted from the libnix startup code which sets up the
|
|
||||||
base relative data area, if necessary (the SMALL_DATA preprocessor symbol
|
|
||||||
must be defined).
|
|
||||||
|
|
||||||
The nrcrt0.S file was adapted from libnix startup code, too, and sets up
|
|
||||||
the base relative data area for programs to be made resident. Note that the
|
|
||||||
geta4() stub is missing here; it wouldn't work in a resident program
|
|
||||||
anyway.
|
|
||||||
|
|
||||||
The ncrt0.S and nrcrt0.S files are considerably smaller and less complex
|
|
||||||
than the libnix code they are based on. This is because in this library
|
|
||||||
design all the more complex tasks are performed in the stdlib_main.c file
|
|
||||||
rather than in assembly language.
|
|
||||||
|
|
||||||
|
|
||||||
8. Documentation
|
|
||||||
|
|
||||||
Well, you're reading it. There isn't anything much yet. You can consult the book
|
|
||||||
"'C' - A reference manual" and you could look at the Open Group's Single Unix
|
|
||||||
Specification at <http://www.opengroup.org/onlinepubs/007904975>.
|
|
||||||
|
|
||||||
|
|
||||||
9. Legal status
|
|
||||||
|
|
||||||
Because this library is in part based upon free software it would be uncourteous
|
|
||||||
not to make it free software itself. The BSD license would probably be
|
|
||||||
appropriate here.
|
|
||||||
|
|
||||||
The PowerPC math library is based in part on work by Sun Microsystems:
|
|
||||||
|
|
||||||
====================================================
|
|
||||||
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
|
||||||
|
|
||||||
Developed at SunPro, a Sun Microsystems, Inc. business.
|
|
||||||
Permission to use, copy, modify, and distribute this
|
|
||||||
software is freely granted, provided that this notice
|
|
||||||
is preserved.
|
|
||||||
====================================================
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
10. Contacting the author
|
|
||||||
|
|
||||||
The basic work was done by Olaf Barthel during two weeks in July 2002. You
|
|
||||||
can reach me at:
|
|
||||||
|
|
||||||
Olaf Barthel
|
|
||||||
Gneisenaustr. 43
|
|
||||||
D-31275 Lehrte
|
|
||||||
|
|
||||||
Or via e-mail:
|
|
||||||
|
|
||||||
olsen@sourcery.han.de
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
This is a collection of programs I'm using to test the library. These
|
|
||||||
are functional tests: the library is supposed to do something, and produce
|
|
||||||
a particular result. For example, "printf_test" exercises a bunch of
|
|
||||||
output formatting rules. Currently, there is only an smakefile for SAS/C
|
|
||||||
to build these programs with.
|
|
||||||
@ -1,74 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#define LINEBUFLENGTH 180
|
|
||||||
|
|
||||||
#define STRIP_LF(str) (str[strlen(str)-1]=0)
|
|
||||||
void invert_str(char * in)
|
|
||||||
{
|
|
||||||
char t;
|
|
||||||
while(t=*in)
|
|
||||||
{
|
|
||||||
*in++=~t;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int i, char *c[])
|
|
||||||
{
|
|
||||||
char dest_fname[80], in_linebuffer[LINEBUFLENGTH];
|
|
||||||
FILE * fileout, * filein;
|
|
||||||
|
|
||||||
if(i>1)
|
|
||||||
{
|
|
||||||
sprintf(dest_fname, "%s.c", c[1]);
|
|
||||||
|
|
||||||
fileout=fopen(dest_fname, "w");
|
|
||||||
filein =fopen(c[1], "r");
|
|
||||||
|
|
||||||
if(fileout && filein)
|
|
||||||
{
|
|
||||||
fgets(in_linebuffer, LINEBUFLENGTH, filein);
|
|
||||||
STRIP_LF(in_linebuffer);
|
|
||||||
invert_str(in_linebuffer);
|
|
||||||
fputs("char *s_leading=\"", fileout);
|
|
||||||
fputs(in_linebuffer, fileout);
|
|
||||||
fputs("\";\n", fileout);
|
|
||||||
|
|
||||||
fputs("char *s_messages[]={\n", fileout);
|
|
||||||
|
|
||||||
while(fgets(in_linebuffer, LINEBUFLENGTH, filein))
|
|
||||||
{
|
|
||||||
STRIP_LF(in_linebuffer);
|
|
||||||
invert_str(in_linebuffer);
|
|
||||||
|
|
||||||
fputs("\"", fileout);
|
|
||||||
fputs(in_linebuffer, fileout);
|
|
||||||
fputs("\",\n", fileout);
|
|
||||||
}
|
|
||||||
fputs("};\n", fileout);
|
|
||||||
fputs("unsigned s_mess_num = sizeof(s_messages)/sizeof(char *);\n", fileout);
|
|
||||||
fclose(filein);
|
|
||||||
fclose(fileout);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
What's this stuff for ? I use it in SP_Engine to hide the usual bunch of "secret
|
|
||||||
messages". As you can see, the strings are simply not'ed .
|
|
||||||
This source shows both flaws: fgets() and the missing buffer flush. You can
|
|
||||||
change the while() statement with
|
|
||||||
|
|
||||||
while(!feof(filein))
|
|
||||||
{
|
|
||||||
fgets(in_linebuffer, LINEBUFLENGTH, filein);
|
|
||||||
....
|
|
||||||
|
|
||||||
This way you'll workaround the first problem.
|
|
||||||
The second issue manifests itself this way: the last two fputs() followed by the
|
|
||||||
fclose() don't do anything: no "};\n" and no "unsigned....." lines are output to
|
|
||||||
'fileout'. With SAS, it works perfectly. Converting the source to dos.library
|
|
||||||
calls also works perfectly. I wonder if there's some kind of strange interaction
|
|
||||||
with the dos/shell updates.
|
|
||||||
*/
|
|
||||||
@ -1,41 +0,0 @@
|
|||||||
/*
|
|
||||||
* $Id: fgets_test.c,v 1.1.1.1 2004-07-26 16:36:07 obarthel Exp $
|
|
||||||
*
|
|
||||||
* :ts=4
|
|
||||||
*/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc,char ** argv)
|
|
||||||
{
|
|
||||||
char line[256];
|
|
||||||
size_t len;
|
|
||||||
FILE * in;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for(i = 1 ; i < argc ; i++)
|
|
||||||
{
|
|
||||||
in = fopen(argv[i],"rb");
|
|
||||||
if(in != NULL)
|
|
||||||
{
|
|
||||||
while(fgets(line,sizeof(line),in) != NULL)
|
|
||||||
{
|
|
||||||
len = strlen(line);
|
|
||||||
while(len > 0 && (line[len-1] == '\n' || line[len-1] == '\r'))
|
|
||||||
line[--len] = '\0';
|
|
||||||
|
|
||||||
printf("%s\n",line);
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(in);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
@ -1,44 +0,0 @@
|
|||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#define FILE_SIZE 2048
|
|
||||||
#define WRITE_SIZE 32
|
|
||||||
|
|
||||||
char FileData[FILE_SIZE];
|
|
||||||
|
|
||||||
void CreateFile(char *filename)
|
|
||||||
{
|
|
||||||
FILE *file;
|
|
||||||
|
|
||||||
if (file = fopen(filename,"w")) {
|
|
||||||
memset(FileData,'0',FILE_SIZE);
|
|
||||||
memset(FileData,'-',WRITE_SIZE);
|
|
||||||
fwrite(FileData,1,FILE_SIZE,file);
|
|
||||||
fclose(file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ReadWriteFile(char *filename)
|
|
||||||
{
|
|
||||||
FILE *file;
|
|
||||||
|
|
||||||
if (file = fopen(filename,"r+")) {
|
|
||||||
fseek(file,0,SEEK_SET);
|
|
||||||
fread(FileData,1,FILE_SIZE,file);
|
|
||||||
fseek(file,0,SEEK_SET);
|
|
||||||
memset(FileData,'1',WRITE_SIZE);
|
|
||||||
fwrite(FileData,1,WRITE_SIZE,file);
|
|
||||||
fclose(file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
if (argc > 1) {
|
|
||||||
CreateFile(argv[1]);
|
|
||||||
ReadWriteFile(argv[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@ -1,12 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int __debug_level = 2;
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
double val = 0.0001;
|
|
||||||
|
|
||||||
printf("%g\n", val);
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
@ -1,195 +0,0 @@
|
|||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
double x;
|
|
||||||
|
|
||||||
void
|
|
||||||
print_format_int(const char * format_string,int parameter1,int parameter2)
|
|
||||||
{
|
|
||||||
printf("\"");
|
|
||||||
printf(format_string,parameter1);
|
|
||||||
printf("\"\t");
|
|
||||||
|
|
||||||
printf("Value = % d, Format = \"%s\"\n",parameter1,format_string);
|
|
||||||
|
|
||||||
printf("\"");
|
|
||||||
printf(format_string,parameter2);
|
|
||||||
printf("\"\t");
|
|
||||||
|
|
||||||
printf("Value = % d, Format = \"%s\"\n",parameter2,format_string);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
print_format_char(const char * format_string,char parameter)
|
|
||||||
{
|
|
||||||
printf("\"");
|
|
||||||
printf(format_string,parameter);
|
|
||||||
printf("\"\t");
|
|
||||||
|
|
||||||
printf("Value = '%c', Format = \"%s\"\n",parameter,format_string);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
print_format_string(const char * format_string,const char *parameter1,const char *parameter2)
|
|
||||||
{
|
|
||||||
printf("\"");
|
|
||||||
printf(format_string,parameter1);
|
|
||||||
printf("\"\t");
|
|
||||||
|
|
||||||
printf("Value = \"%s\", Format = \"%s\"\n",parameter1,format_string);
|
|
||||||
|
|
||||||
printf("\"");
|
|
||||||
printf(format_string,parameter2);
|
|
||||||
printf("\"\t");
|
|
||||||
|
|
||||||
printf("Value = \"%s\", Format = \"%s\"\n",parameter2,format_string);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
print_format_float(const char * format_string,double parameter1,double parameter2)
|
|
||||||
{
|
|
||||||
printf("\"");
|
|
||||||
printf(format_string,parameter1);
|
|
||||||
printf("\"\t");
|
|
||||||
|
|
||||||
printf("Value = % f, Format = \"%s\"\n",parameter1,format_string);
|
|
||||||
|
|
||||||
printf("\"");
|
|
||||||
printf(format_string,parameter2);
|
|
||||||
printf("\"\t");
|
|
||||||
|
|
||||||
printf("Value = % f, Format = \"%s\"\n",parameter2,format_string);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main(void)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
unsigned long foo[2] = { 0x41f00000, 0 };
|
|
||||||
|
|
||||||
memcpy(&x,foo,sizeof(x));
|
|
||||||
|
|
||||||
printf("%.20g\n",x);
|
|
||||||
*/
|
|
||||||
|
|
||||||
print_format_int("%12d",45,-45);
|
|
||||||
print_format_int("%012d",45,-45);
|
|
||||||
print_format_int("% 012d",45,-45);
|
|
||||||
print_format_int("%+12d",45,-45);
|
|
||||||
print_format_int("%+012d",45,-45);
|
|
||||||
print_format_int("%-12d",45,-45);
|
|
||||||
print_format_int("%- 12d",45,-45);
|
|
||||||
print_format_int("%-+12d",45,-45);
|
|
||||||
print_format_int("%12.4d",45,-45);
|
|
||||||
print_format_int("%-12.4d",45,-45);
|
|
||||||
print_format_int("%12.0d",45,-45);
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
print_format_int("%14u",45,-45);
|
|
||||||
print_format_int("%014u",45,-45);
|
|
||||||
print_format_int("%#14u",45,-45);
|
|
||||||
print_format_int("%#014u",45,-45);
|
|
||||||
print_format_int("%-14u",45,-45);
|
|
||||||
print_format_int("%-#14u",45,-45);
|
|
||||||
print_format_int("%14.4u",45,-45);
|
|
||||||
print_format_int("%-14.4u",45,-45);
|
|
||||||
print_format_int("%14.0u",45,-45);
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
print_format_int("%14o",45,-45);
|
|
||||||
print_format_int("%014o",45,-45);
|
|
||||||
print_format_int("%#14o",45,-45);
|
|
||||||
print_format_int("%#014o",45,-45);
|
|
||||||
print_format_int("%-14o",45,-45);
|
|
||||||
print_format_int("%-#14o",45,-45);
|
|
||||||
print_format_int("%14.4o",45,-45);
|
|
||||||
print_format_int("%-14.4o",45,-45);
|
|
||||||
print_format_int("%14.0o",45,-45);
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
print_format_int("%12x",45,-45);
|
|
||||||
print_format_int("%012x",45,-45);
|
|
||||||
print_format_int("%#12X",45,-45);
|
|
||||||
print_format_int("%#012X",45,-45);
|
|
||||||
print_format_int("%-12x",45,-45);
|
|
||||||
print_format_int("%-#12x",45,-45);
|
|
||||||
print_format_int("%12.4x",45,-45);
|
|
||||||
print_format_int("%-12.4x",45,-45);
|
|
||||||
print_format_int("%12.0x",45,-45);
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
print_format_char("%12c",'*');
|
|
||||||
print_format_char("%012c",'*');
|
|
||||||
print_format_char("%-12c",'*');
|
|
||||||
print_format_char("%12.0c",'*');
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
print_format_string("%12s","zap","longish");
|
|
||||||
print_format_string("%12.5s","zap","longish");
|
|
||||||
print_format_string("%012s","zap","longish");
|
|
||||||
print_format_string("%-12s","zap","longish");
|
|
||||||
print_format_string("%12.0s","zap","longish");
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
print_format_float("%10.2f",12.678,-12.678);
|
|
||||||
print_format_float("%010.2f",12.678,-12.678);
|
|
||||||
print_format_float("% 010.2f",12.678,-12.678);
|
|
||||||
print_format_float("%+10.2f",12.678,-12.678);
|
|
||||||
print_format_float("%+010.2f",12.678,-12.678);
|
|
||||||
print_format_float("%-10.2f",12.678,-12.678);
|
|
||||||
print_format_float("%- 10.2f",12.678,-12.678);
|
|
||||||
print_format_float("%-+10.4f",12.678,-12.678);
|
|
||||||
print_format_float("%f",12.678,-12.678);
|
|
||||||
print_format_float("%10f",12.678,-12.678);
|
|
||||||
print_format_float("%10.0f",12.678,-12.678);
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
print_format_float("%10.2e",12.678,-12.678);
|
|
||||||
print_format_float("%010.2e",12.678,-12.678);
|
|
||||||
print_format_float("% 010.2e",12.678,-12.678);
|
|
||||||
print_format_float("%+10.2E",12.678,-12.678);
|
|
||||||
print_format_float("%+010.2E",12.678,-12.678);
|
|
||||||
print_format_float("%-10.2e",12.678,-12.678);
|
|
||||||
print_format_float("%- 10.2e",12.678,-12.678);
|
|
||||||
print_format_float("%-+10.2e",12.678,-12.678);
|
|
||||||
print_format_float("%e",12.678,-12.678);
|
|
||||||
print_format_float("%10e",12.678,-12.678);
|
|
||||||
print_format_float("%10.0e",12.678,-12.678);
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
print_format_float("%10.2g",12.678,-12.678);
|
|
||||||
print_format_float("%010.2g",12.678,-12.678);
|
|
||||||
print_format_float("% 010.2g",12.678,-12.678);
|
|
||||||
print_format_float("%+10.2G",12.678,-12.678);
|
|
||||||
print_format_float("%+010.2G",12.678,-12.678);
|
|
||||||
print_format_float("%-10.2g",12.678,-12.678);
|
|
||||||
print_format_float("%- 10.2g",12.678,-12.678);
|
|
||||||
print_format_float("%-+10.2g",12.678,-12.678);
|
|
||||||
print_format_float("%g",12.678,-12.678);
|
|
||||||
print_format_float("%10g",12.678,-12.678);
|
|
||||||
print_format_float("%10.0g",12.678,-12.678);
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
print_format_float("%10.2g",0.678,-0.678);
|
|
||||||
print_format_float("%010.2g",0.678,-0.678);
|
|
||||||
print_format_float("% 010.2g",0.678,-0.678);
|
|
||||||
print_format_float("%+10.2G",0.678,-0.678);
|
|
||||||
print_format_float("%+010.2G",0.678,-0.678);
|
|
||||||
print_format_float("%-10.2g",0.678,-0.678);
|
|
||||||
print_format_float("%- 10.2g",0.678,-0.678);
|
|
||||||
print_format_float("%-+10.2g",0.678,-0.678);
|
|
||||||
print_format_float("%g",0.678,-0.678);
|
|
||||||
print_format_float("%10g",0.678,-0.678);
|
|
||||||
print_format_float("%10.0g",0.678,-0.678);
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
@ -1,124 +0,0 @@
|
|||||||
#
|
|
||||||
# $Id: smakefile,v 1.1 2004-08-06 11:51:50 obarthel Exp $
|
|
||||||
#
|
|
||||||
# :ts=8
|
|
||||||
#
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
.c.o:
|
|
||||||
@echo "Compiling $<"
|
|
||||||
@sc nover $(CFLAGS) $<
|
|
||||||
|
|
||||||
.asm.o:
|
|
||||||
@echo "Assembling $<"
|
|
||||||
@asm $(AFLAGS) $<
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
# You might want to change this to the directory where your operating system
|
|
||||||
# header files are stored. On my system, that's "V:include", but you might
|
|
||||||
# get lucky with "sc:include" instead, which is the default for SAS/C.
|
|
||||||
INCLUDE_DIR = V:include
|
|
||||||
#INCLUDE_DIR = sc:include
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
# This is where the header files, the startup code and the c.lib files are
|
|
||||||
# stored; see below how this prefix is used.
|
|
||||||
LIB = /library/
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
OPTIMIZE = optimize opttime optschedule optinline
|
|
||||||
#DEBUG = debug=line noopt define=CHECK_FOR_NULL_POINTERS
|
|
||||||
#DEBUG = debug=line
|
|
||||||
#DEBUG = debug=line define=NDEBUG
|
|
||||||
DEBUG = debug=sf noopt
|
|
||||||
#DEBUG = debug=sf noopt define=CHECK_FOR_NULL_POINTERS
|
|
||||||
#PROFILE = profile
|
|
||||||
DATA = data=faronly
|
|
||||||
#CODE = code=far
|
|
||||||
CPU = cpu=060
|
|
||||||
MATH = define=IEEE_FLOATING_POINT_SUPPORT math=IEEE
|
|
||||||
SUPPORT = define=UNIX_PATH_SEMANTICS define=SOCKET_SUPPORT define=USERGROUP_SUPPORT \
|
|
||||||
define=__C_MACROS__
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
CFLAGS = \
|
|
||||||
resopt \
|
|
||||||
nover \
|
|
||||||
memorysize=huge \
|
|
||||||
idlen=64 \
|
|
||||||
commentnest \
|
|
||||||
nostackcheck \
|
|
||||||
stringmerge \
|
|
||||||
errorrexx \
|
|
||||||
$(PROFILE) $(OPTIMIZE) $(CODE) $(DATA) $(CPU) $(MATH) \
|
|
||||||
$(SUPPORT) $(DEBUG)
|
|
||||||
|
|
||||||
AFLAGS = \
|
|
||||||
-d -m2
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
all: setup test fgets_test iotest sscanf_test printf_test stack_size_test translate_test cleanup
|
|
||||||
|
|
||||||
clean:
|
|
||||||
-delete \#?.o \#?.map test fgets_test iotest sscanf_test printf_test stack_size_test translate_test
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
setup:
|
|
||||||
@echo "Setting up include: assignment"
|
|
||||||
@assign include: $(LIB)include V:include
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
@echo "Cleaning up include: assignment"
|
|
||||||
@assign include: sc:include
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
test: test.o
|
|
||||||
@echo "Linking $@"
|
|
||||||
@slink $(LIB)startup.o test.o to $@ lib $(LIB)c.lib addsym \
|
|
||||||
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
|
|
||||||
|
|
||||||
fgets_test: fgets_test.o
|
|
||||||
@echo "Linking $@"
|
|
||||||
@slink $(LIB)startup.o fgets_test.o to $@ lib $(LIB)c.lib addsym \
|
|
||||||
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
|
|
||||||
|
|
||||||
iotest: iotest.o
|
|
||||||
@echo "Linking $@"
|
|
||||||
@slink $(LIB)startup.o iotest.o to $@ lib $(LIB)c.lib addsym \
|
|
||||||
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
|
|
||||||
|
|
||||||
sscanf_test: sscanf_test.o
|
|
||||||
@echo "Linking $@"
|
|
||||||
@slink $(LIB)startup.o sscanf_test.o to $@ lib $(LIB)c.lib addsym \
|
|
||||||
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
|
|
||||||
|
|
||||||
printf_test: printf_test.o
|
|
||||||
@echo "Linking $@"
|
|
||||||
@slink $(LIB)startup.o printf_test.o to $@ lib $(LIB)c.lib addsym \
|
|
||||||
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
|
|
||||||
|
|
||||||
stack_size_test: stack_size_test.o
|
|
||||||
@echo "Linking $@"
|
|
||||||
@slink $(LIB)startup.o stack_size_test.o to $@ lib $(LIB)c.lib addsym \
|
|
||||||
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
|
|
||||||
|
|
||||||
translate_test: translate_test.o
|
|
||||||
@echo "Linking $@"
|
|
||||||
@slink $(LIB)startup.o translate_test.o to $@ lib $(LIB)c.lib addsym \
|
|
||||||
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
mkid:
|
|
||||||
mkid \#?.(c|h|asm|i) include/\#?.(c|h|asm|i) include/sys/\#?.(c|h|asm|i)
|
|
||||||
|
|
||||||
update:
|
|
||||||
mkid -v -u
|
|
||||||
@ -1,84 +0,0 @@
|
|||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int
|
|
||||||
main(void)
|
|
||||||
{
|
|
||||||
int first, second, num;
|
|
||||||
int n,a,b,c;
|
|
||||||
char str[4];
|
|
||||||
|
|
||||||
num = sscanf("6", "%d %d", &first, &second);
|
|
||||||
|
|
||||||
printf("%d %d\n", num, first);
|
|
||||||
|
|
||||||
a = b = c = 0;
|
|
||||||
n = sscanf("","%*d,%d,%d",&a,&b,&c);
|
|
||||||
printf("n = %d, a = %d, b = %d, c = %d\n",n,a,b,c);
|
|
||||||
|
|
||||||
a = b = c = 0;
|
|
||||||
n = sscanf("1,2,3","%*d,%d,%d",&a,&b,&c);
|
|
||||||
printf("n = %d, a = %d, b = %d, c = %d\n",n,a,b,c);
|
|
||||||
|
|
||||||
a = b = c = 0;
|
|
||||||
n = sscanf("1,2","%*d,%d,%d",&a,&b,&c);
|
|
||||||
printf("n = %d, a = %d, b = %d, c = %d\n",n,a,b,c);
|
|
||||||
|
|
||||||
a = b = c = 0;
|
|
||||||
n = sscanf("asdf","*d,d,d",&a,&b,&c);
|
|
||||||
printf("n = %d, a = %d, b = %d, c = %d\n",n,a,b,c);
|
|
||||||
|
|
||||||
memset(str,0,sizeof(str));
|
|
||||||
n = sscanf("asdf","%[abc]",str);
|
|
||||||
printf("n = %d, str = '%s'\n",n,str);
|
|
||||||
|
|
||||||
memset(str,0,sizeof(str));
|
|
||||||
n = sscanf("asdbbfc","%[abc]",str);
|
|
||||||
printf("n = %d, str = '%s'\n",n,str);
|
|
||||||
|
|
||||||
memset(str,0,sizeof(str));
|
|
||||||
n = sscanf("","%[abc]",str);
|
|
||||||
printf("n = %d, str = '%s'\n",n,str);
|
|
||||||
|
|
||||||
memset(str,0,sizeof(str));
|
|
||||||
n = sscanf("abcdef","%[abc]",str);
|
|
||||||
printf("n = %d, str = '%s'\n",n,str);
|
|
||||||
|
|
||||||
a = b = c = 0;
|
|
||||||
n = sscanf("-","%d",&a);
|
|
||||||
printf("n = %d, a = %d\n",n,a);
|
|
||||||
|
|
||||||
a = b = c = 0;
|
|
||||||
n = sscanf("-4,-","%d,%d",&a,&b);
|
|
||||||
printf("n = %d, a = %d, b = %d\n",n,a,b);
|
|
||||||
|
|
||||||
memset(str,0,sizeof(str));
|
|
||||||
n = sscanf("1 abc","%d %4c",&a,str);
|
|
||||||
printf("n = %d, a = %d, str = '%s'\n",n,a,str);
|
|
||||||
|
|
||||||
memset(str,0,sizeof(str));
|
|
||||||
n = sscanf("abc","%4c",&a,str);
|
|
||||||
printf("n = %d, str = '%s'\n",n,str);
|
|
||||||
|
|
||||||
a = 0;
|
|
||||||
n = sscanf("17","%i",&a);
|
|
||||||
printf("n = %d, a = %d\n",n,a);
|
|
||||||
|
|
||||||
a = 0;
|
|
||||||
n = sscanf("017","%i",&a);
|
|
||||||
printf("n = %d, a = %d\n",n,a);
|
|
||||||
|
|
||||||
a = 0;
|
|
||||||
n = sscanf("0x17","%i",&a);
|
|
||||||
printf("n = %d, a = %d\n",n,a);
|
|
||||||
|
|
||||||
a = 0;
|
|
||||||
n = sscanf("0x80000000","%i",&a);
|
|
||||||
printf("n = %d, a = %u\n",n,a);
|
|
||||||
|
|
||||||
memset(str,0,sizeof(str));
|
|
||||||
n = sscanf("1,e","%*d,%[abc]",str);
|
|
||||||
printf("n = %d, str = '%s'\n",n,str);
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
@ -1,31 +0,0 @@
|
|||||||
/* gcc -mstackextend -o stack_extension_test stack_extension_test.c */
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
void
|
|
||||||
recursive_function(char *data,int data_size,int level)
|
|
||||||
{
|
|
||||||
char local_data[10000];
|
|
||||||
char line[10];
|
|
||||||
int c;
|
|
||||||
|
|
||||||
data_size += sizeof(local_data);
|
|
||||||
level++;
|
|
||||||
|
|
||||||
printf("recursion level=%d, size=%d; continue? ",level,data_size);
|
|
||||||
|
|
||||||
fgets(line,sizeof(line),stdin);
|
|
||||||
c = toupper(line[0]);
|
|
||||||
|
|
||||||
if(c == 'Y')
|
|
||||||
recursive_function(local_data,data_size,level);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc,char ** argv)
|
|
||||||
{
|
|
||||||
recursive_function(NULL,0,0);
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
@ -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);
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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);
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user