Mail Archives: djgpp-announce/2008/05/28/17:53:05
Message-Id: | <200805282150.m4SLoGtg017403@delorie.com>
|
X-Recipient: | djgpp-announce AT delorie DOT com
|
X-Authenticated: | #27081556
|
X-Provags-ID: | V01U2FsdGVkX198e3gabY58M7Isvu68zJy1VuCqJmBZ+tu+mQCozc
|
| VcymUUR3Cn2Fn8
|
From: | Juan Manuel Guerrero <juan DOT guerrero AT gmx DOT de>
|
To: | djgpp-announce AT delorie DOT com
|
Subject: | ANNOUNCE: libsupp 5.0 for DJGPP 2.03 and 2.04 uploaded.
|
Date: | Wed, 28 May 2008 23:36:33 +0200
|
X-Y-GMX-Trusted: | 0
|
X-MIME-Autoconverted: | from quoted-printable to 8bit by delorie.com id m4SLm8bc016999
|
This is libsupp 5.0 for MSDOS/DJGPP.
Introduction.
=============
This is a support library for DJGPP 2.04 and 2.03. It shall provide a small
set of new functions that still have not been implemented for DJGPP or improved
versions of functions from DJGPP's CVS source repository so that the original
functions provided with DJGPP's libc.a (2.04 and 2.03) can be replaced with
these new ones.
The decision which function is part and which one is not part of this library
is based on the usefullnes for porting current GNU packages. If the amount of
provided functions increases in the future will depend on the requirements of
the GNU packages to be ported.
The following functions from djdev204 (the same as from the CVS repository)
have been modified to fix a bug.
opendir()
readdir()
rewinddir()
__set_need_fake_dot_dotdot()
The bug is in the code segment of readdir() that handles the symlink files and
thus is only triggerd if the file is a symlink. The reason for the bug is the
different assumption about what should be the content of member string "name"
in the "DIR" structure. In the version fixed by me, the containt of "name"
will be the canonicalized path as returned by _fixpath() with an appended slash.
In the original version, there was a "*.*" string appended to the end of the
member string "name" in the "DIR" structure. If this is forgotten and a new
string is appended to the end of "name", then a useless dir name string is
produced that makes fail all functions that use it.
E.G.:
dir->name = "c:/foo/bar/*.*"
as it may be produced by opendir(). The symlink code in readdir() tries
to append the name of the link file (e.g.: link.txt) and produces the new
path string "c:/foo/bar/*.*/link.txt" without removing the "*.*" before appending.
The function versions of djdev203 have the same "malformed" path in "name" but
because they have not the symlink code, they do not need to be modified. This
means, that only if you compile your application with djdev204.zip, the above
mentioned functions in djdev204 will be replaced by the new ones provided by
this version of libsupp.
To ease the porting of POSIX centric source code for people still using
djdev203, the following functions are provided:
open()
close()
fchdir()
These functions have been taken from the CVS reporitory and the whole symlink
support have been removed. The goal is to have the necessary POSIX support
available to open/change directories using fchdir(). Because the symlink
support has been completely removed, the mode bits O_NOLINK and O_NOFOLLOW
will be ignored. These functions are only intended to be used with djdev203
and will only be available if __DJGPP_MINOR__ is equal '3'.
The following functions have already been provided in previous versions of this
library:
strndup()
strnlen()
argz_add()
argz_add_sep()
argz_append()
argz_count()
argz_create()
argz_createsep()
argz_delete()
argz_extract()
argz_insert()
argz_next()
argz_replace()
argz_stringify()
strtod()
strtof()
strtold()
signbit()
__signbitd()
__signbitf()
__signbitld()
asnprintf()
asprintf()
cprintf()
fprintf()
fseeko()
ftello()
printf()
snprintf()
sprintf()
vasnprintf()
vasprintf()
vfprintf()
vprintf()
vsnprntf()
vsprintf()
_doprnt()
The strndup() and strnlen() functions have been implemented to improve
compatibility with GNU glibc.
The argz functions store strings in a contiguous chunk of memory using '\0' as
separator token. They are GNU extensions to glibc and have been implemented
to make porting easier.
The strto[dfld] functions now support the conversion of the hex format strings
like this:
"0xh.hhhhP[+|-]ddd"
into variables of the type float, double and long double.
signbit returns 0 if the sign of the mantissa of a floating point number is
positive; if the sign is negative it returns non-zero. __signbit[dfld] are
the internal implementations and should not be called except through the macro
signbit.
fseeko() and ftello() are wrappers for fseek() and ftell().
Apart from the features already provided by the familiy of printf() functions
from djdev204, this version of the functions will provide:
1: Flags.
': This flag allows to format the integer part with the thousands'
character. Because DJGPP only offers C/POSIX locale and this
do not define a thousands' character the flag is ignored.
2: Length modifiers.
DJGPP provides all of them.
3: Conversion specifiers.
%F: 'F' Has been added and works like 'f'.
%[aA]: With this conversion specifier a floating point number will be
converted in the style "[-]0xh.hhhhp$-3õ½d", where h are hexadecimal
digits, p stands for the power of 2 and d is exponent expressed
in decimal digits. %a prints lower case characters and %A prints
upper case characters.
%n$: This implementation of printf family of functions also supports
*n$ numbered conversion specifiers (%n$ for defining the position of the
argument to be printed in the argument list, and *n$ for defining
the position of the field width and precision to be used in the
argument list).
4: To increase compatibility with glibc's printf, _doprnt() has been changed
to return for 80 bit floating point numbers starting with 0 integer bit
and non-zero exponent (Pseudo-NaN, Pseudo-Infinity, Pseudo-Zero and
denormalized numbers (unnormal)) "nan" or "NAN" instead of "Unnormal" as
used to be. This may break backward compatibility but makes it easier to
port GNU programs.
To be able to use the new functions you will have to include the header
(libsupp.h) in your source code. This header will provide the macros to map
the conventional function names to their real library names. All library
names start with the prefix "libsupp_". E.g.:
printf --> libsupp_printf
If you still use djdev203 then the header will also provide the data types
definitions for intmax_t and uintmax_t. The definitios have been taken from
stdint.h and I have not been able to figure out a way to check if your code
already provides a definition of these data types, so these are always defined
and this may trigger warnings or errors when your code is compiled. If this
happens it will be your job to fix your code.
Because the provided functions depend on other libc functions, this library
must be linked before the standard C library, libc.a, is linked into your
programs by gcc. E.g.:
gcc -Wall -O2 prog.c -lsupp
The /diffs directory contains two patches that documents the changes I have
done. The diffs-cvs patch shows all changes I have done against the sources
of the CVS tree as checked out on 2008-03-10. The second patch is diffs-lib
and shows the changes against the *patched* checked out CVS sources that are
required to create the sources of this library. It is your choice if you
prefer to check out the CVS sources, patch them and build your own libc.a
with the proposed new functionality or if you prefer to use this library.
Installation.
=============
The binary package provides a header file, libsupp.h, the library file,
libsupp.a, and the info docs. All this is installed in the standard places
of your DJGPP installation tree. Copy the binary distribution into the top
DJGPP installation directory, just unzip it preserving the directory structure
running *one* of the following commands:
unzip32 lsupp50a.zip or
djtarx lsupp50a.zip or
pkunzip -d lsupp50a.zip
You must add an entry in your /info/dir file to be able to read the docs.
Edit manually your /info/dir and add the following lines:
>From lsuppNNa.zip
* libsupp.a: (libsupp).
The Support Library Reference
Building the binaries from sources.
===================================
The library can *only* be build with *djdev204*.
Create a temporary directory and copy the source package into the directory.
Just unzip it preserving the directory structure running *one* of the
following commands:
unzip32 lsupp50s.zip or
djtarx lsupp50s.zip or
pkunzip -d lsupp50s.zip
To build the library cd into the top srcdir and run the shell script like
this:
sh mklib.sh
The script accepts only a single optional argument that specifies the
installation directory. If it is omitted the products will be stored in the
/_build_ directory created in the top srcdir. The script will build the
library and the info docs; if everything is successfully build then the test
program in the /tests directory is build and started. The output of the test
program ist stored in /tests/test.txt for inspection. During the building of
the test program a lot of warnings will appear. This is intentional to test
that the compiler recognizes the new functions as functions of the type of
*printf family and produces the typical warnings if flag combinations are used
that are not allowed or defined.
You *cannot* build the library with djdev203. If you want to run the test
program with djdev203 and the library compile it with a command like this:
gcc -Wall -O2 test.c -o test.exe -lsupp
start it and inspect the output stored in test.txt.
The description of printf() can be found at:
<http://www.opengroup.org/onlinepubs/000095399/functions/printf.html>
The description of signbit() can be found at:
<http://www.opengroup.org/onlinepubs/000095399/functions/signbit.html>
The description of strto[dfld]() can be found at:
<http://www.opengroup.org/onlinepubs/000095399/functions/strtod.html>
The description of strptime() can be found at:
<http://www.opengroup.org/onlinepubs/000095399/functions/printf.html>
Send suggestions and bug reports concerning the library to
comp.os.msdos.djgpp or <djgpp AT delorie DOT com>.
Enjoy.
Guerrero, Juan Manuel <juan DOT guerrero AT gmx DOT de>
- Raw text -