mirror of
https://github.com/adtools/clib2.git
synced 2025-12-08 14:59:05 +00:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
203e8f4e08 |
235
documentation/README
Normal file
235
documentation/README
Normal file
@@ -0,0 +1,235 @@
|
|||||||
|
An ISO 'C' (1994) compliant runtime library for the Amiga
|
||||||
|
=========================================================
|
||||||
|
|
||||||
|
1. What is this?
|
||||||
|
|
||||||
|
This is my attempt to get Samba 2.2.x ported to the Amiga. My first Amiga
|
||||||
|
port required SAS/C and a number of strange tricks had to be pulled to get
|
||||||
|
it to support the kind of environment Samba needed. But with the
|
||||||
|
introduction of Samba 2.2.x many of those tricks did not work any more,
|
||||||
|
which is why I decided to attack the problem at the root, namely the
|
||||||
|
runtime library.
|
||||||
|
|
||||||
|
Because it was no longer possible to build Samba with SAS/C on the new
|
||||||
|
Amiga platform, the idea came up to move development to the GNU 'C'
|
||||||
|
compiler. This turned out to be a challenge due to its somewhat
|
||||||
|
underdeveloped runtime library and header files. Eventually, I decided to
|
||||||
|
rewrite that library from scratch.
|
||||||
|
|
||||||
|
|
||||||
|
2. What does it do?
|
||||||
|
|
||||||
|
Using "'C' - A reference manual" as a reference I wrote a set of header
|
||||||
|
files, then proceeded to implement each single function referenced in them.
|
||||||
|
With few exceptions in the area of wide character support, the result
|
||||||
|
should be a feature complete implementation of the ISO 'C' (1994) runtime
|
||||||
|
library.
|
||||||
|
|
||||||
|
Because Samba needs a few POSIX-like routines to be supported, the library
|
||||||
|
functionality is complemented by a set of routines described in "Advanced
|
||||||
|
programming in the Unix environent". This set is not complete, however. It
|
||||||
|
will have to grow even further to accomodate for Samba's needs, but this is
|
||||||
|
a good start. I specifically added hooks for integrating socket I/O at a
|
||||||
|
later point of time.
|
||||||
|
|
||||||
|
This is not a portable implementation of the library in the sense that you
|
||||||
|
could move it from one 'C' compiler on one operating system to another.
|
||||||
|
This is an Amiga specific implementation.
|
||||||
|
|
||||||
|
The library supports floating point math, which is limited to IEEE single
|
||||||
|
and double precision or M68881 inline math. There is no support for the
|
||||||
|
fast floating point (FFP) format or exclusive IEEE single precision. You
|
||||||
|
either get double precision (IEEE math) or extended precision (M68881
|
||||||
|
inline math). What it is that you get is determined at compile time. Use
|
||||||
|
the IEEE_FLOATING_POINT_SUPPORT preprocessor symbol to activate IEEE math
|
||||||
|
code and the M68881_FLOATING_POINT_SUPPORT symbol for M68881 inline math.
|
||||||
|
|
||||||
|
Not unlike SAS/C, you can configure a minimum stack size the program is to
|
||||||
|
use when it starts up. This is controlled via the '__stack_size' variable
|
||||||
|
(see "stdlib_main.c").
|
||||||
|
|
||||||
|
I added some amiga.lib and debug.lib functionality to the library, but
|
||||||
|
don't count on it to be complete.
|
||||||
|
|
||||||
|
|
||||||
|
3. What does it not do?
|
||||||
|
|
||||||
|
This library is a departure from the typical 'C' runtime environments of
|
||||||
|
the past which had to run on all AmigaOS releases, down to Kickstart 1.1.
|
||||||
|
This very library was designed to take advantage of the routines available
|
||||||
|
since Kickstart 2.04 was introduced and virtually nobody ever put to use.
|
||||||
|
This helps to cut the code size, and it also helps to keep bugs out of the
|
||||||
|
library by falling back onto well-tested implementations. However, the
|
||||||
|
catch is that the code won't run under Kickstart 1.3 and below. But then
|
||||||
|
these operating system releases have been obsolete for more than a decade,
|
||||||
|
and you can always go back to a compiler environment which supports them.
|
||||||
|
|
||||||
|
Practically all library routines are implemented in a sort of naïve
|
||||||
|
fashion. That is, they contain virtually no optimizations whatsoever. This
|
||||||
|
is particularly apparent in workhorses such as memset() or memmove(). But
|
||||||
|
then, the issue is easy testability and Amiga platform portability.
|
||||||
|
|
||||||
|
There is very little support for amiga.lib functionality. There is
|
||||||
|
NewList(), HookEntry(), CallHook(), CallHookA(), the DoMethod() family, the
|
||||||
|
RexxVars family, but that's all. If you need more, you would have to
|
||||||
|
implement it yourself. Put another way, if you absolutely need
|
||||||
|
functionality that is only found in amiga.lib, you really shouldn't need in
|
||||||
|
in the first place.
|
||||||
|
|
||||||
|
|
||||||
|
4. Where does the source code come from?
|
||||||
|
|
||||||
|
I originally thought that it might be helpful to piece this library
|
||||||
|
together from various sources, such as the BSD libc. Turned out that this
|
||||||
|
code was so 'portable' that it became much more complex than it ought to
|
||||||
|
be. Also, some side-effects were present which considerably changed the
|
||||||
|
behaviour of the library. For example, the BSD libc uses bcopy() as an
|
||||||
|
alias for memcpy(), and unlike memcpy() is documented to, bcopy() supports
|
||||||
|
overlapping copies.
|
||||||
|
|
||||||
|
Eventually, I wrote virtually all the code myself, borrowing algorithmic
|
||||||
|
ideas from the BSD libc and the Manx Aztec 'C' runtime library. Because I
|
||||||
|
don't know much about the environment GCC expects, I borrowed code snippets
|
||||||
|
from libnix, which was written by Matthias Fleischer and Gunther Nikl. This
|
||||||
|
in particular concerns the integer and floating point math support, the
|
||||||
|
setjmp/longjmp routines and the startup code. The M68881 inline math code
|
||||||
|
comes from the <math-68881.h> file written by Matthew Self
|
||||||
|
(self@bayes.arc.nasa.gov).
|
||||||
|
|
||||||
|
|
||||||
|
5. Limitations and caveats
|
||||||
|
|
||||||
|
There is hardly any documentation on the code I wrote. In part this is due
|
||||||
|
to the fact that the code itself is very simple in design. It should speak
|
||||||
|
for itself. However, to make a usable runtime library you have to have a
|
||||||
|
user documentation as in man pages or autodocs. We will eventually have to
|
||||||
|
have autodocs for this library.
|
||||||
|
|
||||||
|
The code is currently plastered with assertions and debug code. It is
|
||||||
|
therefore much larger than it ought to be and runs much slower than it
|
||||||
|
ought to be. For example, the malloc() routine will set the contents of the
|
||||||
|
memory allocated to a 'dirty' bit pattern which is likely to break software
|
||||||
|
which makes assumptions about its contents. Likewise, the free() routine
|
||||||
|
will trash the memory to deallocate with a different 'dirty' bit pattern to
|
||||||
|
turn up reuse of memory after deallocation. All these debugging features
|
||||||
|
can be disabled by defining the NDEBUG preprocessor symbol at compile time
|
||||||
|
(see <assert.h>).
|
||||||
|
|
||||||
|
The exception handling in the math code is not particularly effective. For
|
||||||
|
one part this is due to the fact that there is no exception handler
|
||||||
|
installed by the runtime library when it starts up which could catch and
|
||||||
|
process the error conditions the CPU or FPU generates. The idea was to
|
||||||
|
provide for a portable runtime library with little to no assembly language
|
||||||
|
involved. To make the exception handling complete, such code would be
|
||||||
|
necessary.
|
||||||
|
|
||||||
|
The library currently builds under SAS/C, but because the 'normal' program
|
||||||
|
startup code is not utilized, the base relative (A4) addressing does not
|
||||||
|
work. If you are going to test it, use the data=faronly option to compile
|
||||||
|
the library and the programs.
|
||||||
|
|
||||||
|
If you are going to rebuild the library with SAS/C you will need to
|
||||||
|
reassign INCLUDE: to point to the local 'include' directory or things won't
|
||||||
|
work.
|
||||||
|
|
||||||
|
|
||||||
|
6. Conventions and design issues
|
||||||
|
|
||||||
|
You will have noticed the 330+ files in this directory. This is not the
|
||||||
|
best way to organize a runtime library, but at least all the bits and
|
||||||
|
pieces are in plain sight. Each file stands for the one or two routines it
|
||||||
|
contains. The name indicates what routine(s) that might be. Each file name
|
||||||
|
is prefixed by the name of the header file in which the corresponding
|
||||||
|
routine is defined. So, for example, you will find that "unistd_lchown.c"
|
||||||
|
contains the definition of the lchown() routine, which has its prototype
|
||||||
|
defined in the <unistd.h> header file.
|
||||||
|
|
||||||
|
Internal function and variable names are prefixed with two underscores, as
|
||||||
|
in '__stdio_init()'.
|
||||||
|
|
||||||
|
All routines attempt to do error checking on their parameters. They will
|
||||||
|
either drop into an assert() or set an errno value and refuse to go any
|
||||||
|
further. This cuts performance but should help to catch the simple bugs
|
||||||
|
quite easily (NULL pointers).
|
||||||
|
|
||||||
|
Just like any halfway sane Amiga 'C' runtime library, this one performs its
|
||||||
|
^C checking in the I/O routines. Typically once upon entry and in every
|
||||||
|
iteration of the loop there might be it will quickly poll the ^C signal and
|
||||||
|
drop into raise(SIGINT) in case the signal is set. This is just about the
|
||||||
|
safest method to solve the problem and should be much more robust than the
|
||||||
|
ixemul approach of 'interrupt anywhere - crash anywhere' using the task
|
||||||
|
switch/launch hooks to test for signals.
|
||||||
|
|
||||||
|
By default all library routines follow the ISO 'C' conventions in that
|
||||||
|
where implementation defined behaviour is permitted, the AmigaOS rules are
|
||||||
|
followed. For example, unlink() will by default operate like DeleteFile()
|
||||||
|
and rename() will return with an error code set if the name of the
|
||||||
|
file/directory to be renamed would collide with an existing directory
|
||||||
|
entry. However, your program can set a global variable '__unix_semantics'
|
||||||
|
which will cause some routines to perform like their Unix counterparts.
|
||||||
|
This is necessary for Samba to work but not a generally desirable feature.
|
||||||
|
You have some Unix-like behaviour, but the environment itself is not
|
||||||
|
completely Unix- or POSIX-compliant. And it shouldn't be. Don't make the
|
||||||
|
mistake of trying to mold the environment into a POSIX emulation. It
|
||||||
|
doesn't work; AmigaOS is not Unix.
|
||||||
|
|
||||||
|
|
||||||
|
7. The startup code
|
||||||
|
|
||||||
|
There are three program startup files provided. The most simplistic is in
|
||||||
|
'startup.c' which I use for SAS/C. It just invokes the setup routine which
|
||||||
|
eventually calls main() and drops straight into exit().
|
||||||
|
|
||||||
|
The ncrt0.S file was adapted from the libnix startup code which sets up the
|
||||||
|
base relative data area, if necessary (the SMALL_DATA preprocessor symbol
|
||||||
|
must be defined).
|
||||||
|
|
||||||
|
The nrcrt0.S file was adapted from libnix startup code, too, and sets up
|
||||||
|
the base relative data area for programs to be made resident. Note that the
|
||||||
|
geta4() stub is missing here; it wouldn't work in a resident program
|
||||||
|
anyway.
|
||||||
|
|
||||||
|
The ncrt0.S and nrcrt0.S files are considerably smaller and less complex
|
||||||
|
than the libnix code they are based on. This is because in this library
|
||||||
|
design all the more complex tasks are performed in the stdlib_main.c file
|
||||||
|
rather than in assembly language.
|
||||||
|
|
||||||
|
|
||||||
|
8. Documentation
|
||||||
|
|
||||||
|
Well, you're reading it. There isn't anything much yet. You can consult the book
|
||||||
|
"'C' - A reference manual" and you could look at the Open Group's Single Unix
|
||||||
|
Specification at <http://www.opengroup.org/onlinepubs/007904975>.
|
||||||
|
|
||||||
|
|
||||||
|
9. Legal status
|
||||||
|
|
||||||
|
Because this library is in part based upon free software it would be uncourteous
|
||||||
|
not to make it free software itself. The BSD license would probably be
|
||||||
|
appropriate here.
|
||||||
|
|
||||||
|
The PowerPC math library is based in part on work by Sun Microsystems:
|
||||||
|
|
||||||
|
====================================================
|
||||||
|
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||||
|
|
||||||
|
Developed at SunPro, a Sun Microsystems, Inc. business.
|
||||||
|
Permission to use, copy, modify, and distribute this
|
||||||
|
software is freely granted, provided that this notice
|
||||||
|
is preserved.
|
||||||
|
====================================================
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
10. Contacting the author
|
||||||
|
|
||||||
|
The basic work was done by Olaf Barthel during two weeks in July 2002. You
|
||||||
|
can reach me at:
|
||||||
|
|
||||||
|
Olaf Barthel
|
||||||
|
Gneisenaustr. 43
|
||||||
|
D-31275 Lehrte
|
||||||
|
|
||||||
|
Or via e-mail:
|
||||||
|
|
||||||
|
olsen@sourcery.han.de
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# $Id: GNUmakefile.68k,v 1.2 2004-07-28 15:50:44 obarthel Exp $
|
# $Id: GNUmakefile.68k,v 1.1.1.1 2004-07-26 16:30:14 obarthel Exp $
|
||||||
#
|
#
|
||||||
# :ts=8
|
# :ts=8
|
||||||
#
|
#
|
||||||
@@ -574,7 +574,6 @@ NET_LIB = \
|
|||||||
socket_shutdown.o \
|
socket_shutdown.o \
|
||||||
socket_socket.o \
|
socket_socket.o \
|
||||||
socket_hook_entry.o \
|
socket_hook_entry.o \
|
||||||
socket_hstrerror.o \
|
|
||||||
stat_umask.o \
|
stat_umask.o \
|
||||||
usergroup_crypt.o \
|
usergroup_crypt.o \
|
||||||
usergroup_data.o \
|
usergroup_data.o \
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# $Id: GNUmakefile.os4,v 1.2 2004-07-28 15:50:44 obarthel Exp $
|
# $Id: GNUmakefile.os4,v 1.1.1.1 2004-07-26 16:30:15 obarthel Exp $
|
||||||
#
|
#
|
||||||
# :ts=8
|
# :ts=8
|
||||||
#
|
#
|
||||||
@@ -568,7 +568,6 @@ NET_LIB = \
|
|||||||
socket_shutdown.o \
|
socket_shutdown.o \
|
||||||
socket_socket.o \
|
socket_socket.o \
|
||||||
socket_hook_entry.o \
|
socket_hook_entry.o \
|
||||||
socket_hstrerror.o \
|
|
||||||
usergroup_crypt.o \
|
usergroup_crypt.o \
|
||||||
usergroup_data.o \
|
usergroup_data.o \
|
||||||
usergroup_endgrent.o \
|
usergroup_endgrent.o \
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 166
|
#define REVISION 165
|
||||||
#define DATE "28.7.2004"
|
#define DATE "26.7.2004"
|
||||||
#define VERS "amiga.lib 1.166"
|
#define VERS "amiga.lib 1.165"
|
||||||
#define VSTRING "amiga.lib 1.166 (28.7.2004)\r\n"
|
#define VSTRING "amiga.lib 1.165 (26.7.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: amiga.lib 1.166 (28.7.2004)"
|
#define VERSTAG "\0$VER: amiga.lib 1.165 (26.7.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
166
|
165
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 166
|
#define REVISION 165
|
||||||
#define DATE "28.7.2004"
|
#define DATE "26.7.2004"
|
||||||
#define VERS "c.lib 1.166"
|
#define VERS "c.lib 1.165"
|
||||||
#define VSTRING "c.lib 1.166 (28.7.2004)\r\n"
|
#define VSTRING "c.lib 1.165 (26.7.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: c.lib 1.166 (28.7.2004)"
|
#define VERSTAG "\0$VER: c.lib 1.165 (26.7.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
166
|
165
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 166
|
#define REVISION 165
|
||||||
#define DATE "28.7.2004"
|
#define DATE "26.7.2004"
|
||||||
#define VERS "debug.lib 1.166"
|
#define VERS "debug.lib 1.165"
|
||||||
#define VSTRING "debug.lib 1.166 (28.7.2004)\r\n"
|
#define VSTRING "debug.lib 1.165 (26.7.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: debug.lib 1.166 (28.7.2004)"
|
#define VERSTAG "\0$VER: debug.lib 1.165 (26.7.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
166
|
165
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: signal.h,v 1.2 2004-07-28 14:14:38 obarthel Exp $
|
* $Id: signal.h,v 1.1.1.1 2004-07-26 16:32:53 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -72,10 +72,6 @@ extern int raise(int sig);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
typedef void (*sig_t)(int);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
typedef int sig_atomic_t;
|
typedef int sig_atomic_t;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: unistd.h,v 1.3 2004-07-28 15:50:45 obarthel Exp $
|
* $Id: unistd.h,v 1.1.1.1 2004-07-26 16:32:56 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -143,7 +143,7 @@ extern char * __getcwd(char * buffer,size_t buffer_size,const char *file,int lin
|
|||||||
#define FD_SETSIZE 256
|
#define FD_SETSIZE 256
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct fd_set
|
typedef struct
|
||||||
{
|
{
|
||||||
unsigned long bits[(FD_SETSIZE + 31) / 32];
|
unsigned long bits[(FD_SETSIZE + 31) / 32];
|
||||||
} fd_set;
|
} fd_set;
|
||||||
@@ -195,11 +195,6 @@ struct in_addr
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/* Error codes set by the name<->address resolution functions. */
|
|
||||||
extern int h_errno;
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
extern int accept(int sockfd,struct sockaddr *cliaddr,int *addrlen);
|
extern int accept(int sockfd,struct sockaddr *cliaddr,int *addrlen);
|
||||||
extern int bind(int sockfd,struct sockaddr *name,int namelen);
|
extern int bind(int sockfd,struct sockaddr *name,int namelen);
|
||||||
extern int connect(int sockfd,struct sockaddr *name,int namelen);
|
extern int connect(int sockfd,struct sockaddr *name,int namelen);
|
||||||
@@ -235,7 +230,6 @@ extern unsigned long inet_lnaof(struct in_addr in);
|
|||||||
extern struct in_addr inet_makeaddr(int net,int host);
|
extern struct in_addr inet_makeaddr(int net,int host);
|
||||||
extern unsigned long inet_netof(struct in_addr in);
|
extern unsigned long inet_netof(struct in_addr in);
|
||||||
extern unsigned long inet_network(const char *cp);
|
extern unsigned long inet_network(const char *cp);
|
||||||
extern const char * hstrerror(int error_number);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 166
|
#define REVISION 165
|
||||||
#define DATE "28.7.2004"
|
#define DATE "26.7.2004"
|
||||||
#define VERS "m.lib 1.166"
|
#define VERS "m.lib 1.165"
|
||||||
#define VSTRING "m.lib 1.166 (28.7.2004)\r\n"
|
#define VSTRING "m.lib 1.165 (26.7.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: m.lib 1.166 (28.7.2004)"
|
#define VERSTAG "\0$VER: m.lib 1.165 (26.7.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
166
|
165
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 166
|
#define REVISION 165
|
||||||
#define DATE "28.7.2004"
|
#define DATE "26.7.2004"
|
||||||
#define VERS "m881.lib 1.166"
|
#define VERS "m881.lib 1.165"
|
||||||
#define VSTRING "m881.lib 1.166 (28.7.2004)\r\n"
|
#define VSTRING "m881.lib 1.165 (26.7.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: m881.lib 1.166 (28.7.2004)"
|
#define VERSTAG "\0$VER: m881.lib 1.165 (26.7.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
166
|
165
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 166
|
#define REVISION 165
|
||||||
#define DATE "28.7.2004"
|
#define DATE "26.7.2004"
|
||||||
#define VERS "net.lib 1.166"
|
#define VERS "net.lib 1.165"
|
||||||
#define VSTRING "net.lib 1.166 (28.7.2004)\r\n"
|
#define VSTRING "net.lib 1.165 (26.7.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: net.lib 1.166 (28.7.2004)"
|
#define VERSTAG "\0$VER: net.lib 1.165 (26.7.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
166
|
165
|
||||||
|
|||||||
@@ -1,14 +1,3 @@
|
|||||||
c.lib 1.166 (28.7.2004)
|
|
||||||
|
|
||||||
- Added h_strerror() function to libnet.a; there's a global 'h_errno'
|
|
||||||
variable available, too.
|
|
||||||
|
|
||||||
- <signal.h> now defines a type 'sig_t'.
|
|
||||||
|
|
||||||
- <unistd.h> now allows the 'fd_set' type to be referenced as
|
|
||||||
'struct fd_set', too.
|
|
||||||
|
|
||||||
|
|
||||||
c.lib 1.165 (26.7.2004)
|
c.lib 1.165 (26.7.2004)
|
||||||
|
|
||||||
- In printf(), if the precision is 0 and the value to be printed for
|
- In printf(), if the precision is 0 and the value to be printed for
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# $Id: smakefile,v 1.2 2004-07-28 15:50:45 obarthel Exp $
|
# $Id: smakefile,v 1.1.1.1 2004-07-26 16:31:07 obarthel Exp $
|
||||||
#
|
#
|
||||||
# :ts=8
|
# :ts=8
|
||||||
#
|
#
|
||||||
@@ -243,8 +243,7 @@ SOCKET_OBJ = \
|
|||||||
socket_setsockopt.o \
|
socket_setsockopt.o \
|
||||||
socket_shutdown.o \
|
socket_shutdown.o \
|
||||||
socket_socket.o \
|
socket_socket.o \
|
||||||
socket_hook_entry.o \
|
socket_hook_entry.o
|
||||||
socket_hstrerror.o
|
|
||||||
|
|
||||||
STAT_OBJ = \
|
STAT_OBJ = \
|
||||||
stat_chmod.o \
|
stat_chmod.o \
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_data.c,v 1.2 2004-07-28 15:50:45 obarthel Exp $
|
* $Id: socket_data.c,v 1.1.1.1 2004-07-26 16:31:08 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -53,8 +53,4 @@ struct SocketIFace *__ISocket;
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
int h_errno;
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
#endif /* SOCKET_SUPPORT */
|
#endif /* SOCKET_SUPPORT */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_headers.h,v 1.2 2004-07-28 15:50:45 obarthel Exp $
|
* $Id: socket_headers.h,v 1.1.1.1 2004-07-26 16:31:14 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -60,10 +60,6 @@ extern struct SocketIFace *__ISocket;
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern int h_errno;
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
extern struct fd * __get_socket_descriptor(int socket_descriptor);
|
extern struct fd * __get_socket_descriptor(int socket_descriptor);
|
||||||
extern void __socket_hook_entry(struct Hook * hook,struct fd * fd,struct file_hook_message * message);
|
extern void __socket_hook_entry(struct Hook * hook,struct fd * fd,struct file_hook_message * message);
|
||||||
|
|
||||||
|
|||||||
@@ -1,136 +0,0 @@
|
|||||||
/*
|
|
||||||
* $Id: socket_hstrerror.c,v 1.1 2004-07-28 15:50:45 obarthel Exp $
|
|
||||||
*
|
|
||||||
* :ts=4
|
|
||||||
*
|
|
||||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
|
||||||
* Copyright (c) 2002-2004 by Olaf Barthel <olsen@sourcery.han.de>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* - Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* - Neither the name of Olaf Barthel nor the names of contributors
|
|
||||||
* may be used to endorse or promote products derived from this
|
|
||||||
* software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(SOCKET_SUPPORT)
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef _SOCKET_HEADERS_H
|
|
||||||
#include "socket_headers.h"
|
|
||||||
#endif /* _SOCKET_HEADERS_H */
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
const char *
|
|
||||||
hstrerror(int error_number)
|
|
||||||
{
|
|
||||||
const char * result;
|
|
||||||
|
|
||||||
if(error_number < 1 || error_number > 4)
|
|
||||||
{
|
|
||||||
static char error_buffer[80];
|
|
||||||
char number[30];
|
|
||||||
char *s = number;
|
|
||||||
int is_negative = 0;
|
|
||||||
unsigned int n;
|
|
||||||
int i,len,c;
|
|
||||||
|
|
||||||
/* We convert the error number into in an unsigned
|
|
||||||
integer, so that numbers such as 0x80000000
|
|
||||||
can come out of the conversion. */
|
|
||||||
if(error_number < 0)
|
|
||||||
{
|
|
||||||
is_negative = 1;
|
|
||||||
|
|
||||||
n = (-error_number);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
n = error_number;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Convert the error number into a string of digits. */
|
|
||||||
len = 0;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
(*s++) = '0' + (n % 10);
|
|
||||||
n /= 10;
|
|
||||||
len++;
|
|
||||||
}
|
|
||||||
while(n > 0 && len < (int)sizeof(number)-1);
|
|
||||||
|
|
||||||
/* Add the sign, if necessary. */
|
|
||||||
if(is_negative && len < (int)sizeof(number)-1)
|
|
||||||
{
|
|
||||||
(*s++) = '-';
|
|
||||||
len++;
|
|
||||||
}
|
|
||||||
|
|
||||||
(*s) = '\0';
|
|
||||||
|
|
||||||
/* Reverse the string in place. */
|
|
||||||
for(i = 0 ; i < len / 2 ; i++)
|
|
||||||
{
|
|
||||||
c = number[len-1-i];
|
|
||||||
number[len-1-i] = number[i];
|
|
||||||
number[i] = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy(error_buffer,"Unknown resolver error ");
|
|
||||||
strcat(error_buffer,number);
|
|
||||||
|
|
||||||
result = error_buffer;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
switch(error_number)
|
|
||||||
{
|
|
||||||
case 1: /* HOST_NOT_FOUND */
|
|
||||||
|
|
||||||
result = "Unknown host";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2: /* TRY_AGAIN */
|
|
||||||
|
|
||||||
result = "Host name lookup failure; try again";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3: /* NO_RECOVERY */
|
|
||||||
|
|
||||||
result = "Unknown server error_number";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 4: /* NO_ADDRESS */
|
|
||||||
|
|
||||||
result = "No address associated with name";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
#endif /* SOCKET_SUPPORT */
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_init_exit.c,v 1.2 2004-07-28 15:50:45 obarthel Exp $
|
* $Id: socket_init_exit.c,v 1.1.1.1 2004-07-26 16:31:16 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -61,7 +61,6 @@ extern BOOL __detach;
|
|||||||
#define SBTC_BREAKMASK 1 /* Interrupt signal mask */
|
#define SBTC_BREAKMASK 1 /* Interrupt signal mask */
|
||||||
#define SBTC_LOGTAGPTR 11 /* Under which name log entries are filed */
|
#define SBTC_LOGTAGPTR 11 /* Under which name log entries are filed */
|
||||||
#define SBTC_ERRNOLONGPTR 24 /* Pointer to errno, length == sizeof(errno) */
|
#define SBTC_ERRNOLONGPTR 24 /* Pointer to errno, length == sizeof(errno) */
|
||||||
#define SBTC_HERRNOLONGPTR 25 /* 'h_errno' pointer (with sizeof(h_errno) == sizeof(long)) */
|
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
@@ -152,7 +151,7 @@ int
|
|||||||
__socket_init(void)
|
__socket_init(void)
|
||||||
{
|
{
|
||||||
struct Process * this_process;
|
struct Process * this_process;
|
||||||
struct TagItem tags[5];
|
struct TagItem tags[4];
|
||||||
int result = ERROR;
|
int result = ERROR;
|
||||||
LONG status;
|
LONG status;
|
||||||
|
|
||||||
@@ -204,11 +203,7 @@ __socket_init(void)
|
|||||||
tags[2].ti_Tag = SBTM_SETVAL(SBTC_LOGTAGPTR);
|
tags[2].ti_Tag = SBTM_SETVAL(SBTC_LOGTAGPTR);
|
||||||
tags[2].ti_Data = (ULONG)__program_name;
|
tags[2].ti_Data = (ULONG)__program_name;
|
||||||
|
|
||||||
/* Wire the library's h_errno variable to our local h_errno. */
|
tags[3].ti_Tag = TAG_END;
|
||||||
tags[3].ti_Tag = SBTM_SETVAL(SBTC_HERRNOLONGPTR);
|
|
||||||
tags[3].ti_Data = (ULONG)&errno;
|
|
||||||
|
|
||||||
tags[4].ti_Tag = TAG_END;
|
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
status = __SocketBaseTagList(tags);
|
status = __SocketBaseTagList(tags);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 166
|
#define REVISION 165
|
||||||
#define DATE "28.7.2004"
|
#define DATE "26.7.2004"
|
||||||
#define VERS "stack.lib 1.166"
|
#define VERS "stack.lib 1.165"
|
||||||
#define VSTRING "stack.lib 1.166 (28.7.2004)\r\n"
|
#define VSTRING "stack.lib 1.165 (26.7.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: stack.lib 1.166 (28.7.2004)"
|
#define VERSTAG "\0$VER: stack.lib 1.165 (26.7.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
166
|
165
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 166
|
#define REVISION 165
|
||||||
#define DATE "28.7.2004"
|
#define DATE "26.7.2004"
|
||||||
#define VERS "unix.lib 1.166"
|
#define VERS "unix.lib 1.165"
|
||||||
#define VSTRING "unix.lib 1.166 (28.7.2004)\r\n"
|
#define VSTRING "unix.lib 1.165 (26.7.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: unix.lib 1.166 (28.7.2004)"
|
#define VERSTAG "\0$VER: unix.lib 1.165 (26.7.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
166
|
165
|
||||||
|
|||||||
74
test_programs/clib-bug.c
Normal file
74
test_programs/clib-bug.c
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
#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.
|
||||||
|
*/
|
||||||
41
test_programs/fgets_test.c
Normal file
41
test_programs/fgets_test.c
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* $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);
|
||||||
|
}
|
||||||
44
test_programs/iotest.c
Normal file
44
test_programs/iotest.c
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
#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;
|
||||||
|
}
|
||||||
12
test_programs/printf_g_test.c
Normal file
12
test_programs/printf_g_test.c
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int __debug_level = 2;
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
double val = 0.0001;
|
||||||
|
|
||||||
|
printf("%g\n", val);
|
||||||
|
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
195
test_programs/printf_test.c
Normal file
195
test_programs/printf_test.c
Normal file
@@ -0,0 +1,195 @@
|
|||||||
|
#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);
|
||||||
|
}
|
||||||
84
test_programs/sscanf_test.c
Normal file
84
test_programs/sscanf_test.c
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
#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);
|
||||||
|
}
|
||||||
31
test_programs/stack_extension_test.c
Normal file
31
test_programs/stack_extension_test.c
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
/* 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);
|
||||||
|
}
|
||||||
15
test_programs/stack_size_test.c
Normal file
15
test_programs/stack_size_test.c
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#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);
|
||||||
|
}
|
||||||
241
test_programs/test.c
Normal file
241
test_programs/test.c
Normal file
@@ -0,0 +1,241 @@
|
|||||||
|
/*
|
||||||
|
* $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
|
||||||
39
test_programs/translate_test.c
Normal file
39
test_programs/translate_test.c
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* $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