Next: Changes in 2.04, Previous: Changes in 2.02, Up: What Changed [Contents][Index]
Here is a list of changes from DJGPP V2.02 to V2.03
Bugs in the itimer functions are fixed.  In particular:
tv_usec member in itimerval structure
don’t cause internal calculations in setitimer to overflow;
getitimer now returns correct info in the tv_usec member;
alarm function work correctly when the calling
program invokes the uclock library function before setting a
timer.
localtime, ctime and mktime now notice changes in
the value of the TZ environment variable during the program run,
and adjust their computation accordingly.  They also don’t fail for the
first date after the epoch.  mktime now avoids looping for
preposterously long time when passed very large values in the members of
struct tm.
When passed an empty string as the file name, stat now fails and
sets errno to ENOENT, instead of returning information
about the current directory.  Also, stat no longer reports
invalid time stamps for root directories of floppy disks that were
written on Windows 9X or Windows NT.
The startup code now correctly sets up the keys that generate
SIGINT and SIGQUIT signals on PC98 machines.
putc and fputc no longer return -1 when they write the
value (signed char)0xff to a file.
The header wctype.h from v2.02 caused pre-processor errors, and could not be included before ctype.h. This is now fixed.
Functions of the printf family no longer cause the calling
program to crash when passed long double variables with invalid
bit patterns (the so-called unnormal numbers).  Such arguments are
now printed as ‘Unnormal’.
srand now documented as returning a void.
rand48 and friends are now in libc.
Many fixes to calls to tolower/toupper with signed chars.
The rmcb stub doesn’t restore the flags so that you can return different ones.
Doc fixes for ansi/posix portability.
Handle error conditions in bin2h.
tests/libclink/check.cc - remove duplicates.
Remove unneeded includes from rand.c.
Call system properly in termios (Ctrl-Z).
Work around a gcc 2.8.1 bug in emu387.
Linking with -lemu should obviate the need for emu387.dxe.
The “Hidden Features” chapter of the Knowledge Base now actually describes most of the special features provided by DJGPP.
redir no longer fails to run programs when the program name
is a substring of the redirected I/O file(s).
glob correctly converts the letter-case of the file names when
the pattern include mixed upper- and lower-case letters.  In particular,
the letter-case of the command-line arguments expanded by the startup
code in the argv[] array is now correct in these cases.
textcolor and textbackground now support the 16 background
colors mode (e.g., after a call to intensevideo).  Previously,
textbackground would ignore the high intensity color bit in its
argument, and textcolor would clobber that bit sometimes.
A call to lowvideo doesn’t clobber the background color anymore.
The global variable ScreenAttrib now always matches the value of
the attribute member of the text_info struct returned by
gettexinfo.
If the last character of a response file is ‘^Z’, it is now
ignored.  Previous versions would pass it to the main function.
Use two ‘^Z’ characters in a row if you actually need to pass such
a character as part of the last element of the argv[] array.
fputs now returns EOF when called on an unbuffered stream,
and there’s some error (such as ENOSPC) in writing to that
stream.
If both arguments of _rename and rename refer to the same
file, they no longer remove that file.
Functions of the scanf family no longer crash or work incorrectly
when passed format specifiers with upper-case letters, such as
‘%lX’ or ‘%E’.  Non-ANSI extensions to the format
specifiers and qualifiers, such as ‘%lld’ and ‘%U’, are now
documented and their portability information included in the library
docs.
The function __crt0_load_environment_file called by the startup
code now strips trailing blanks and TABs from the ‘[program]’ lines
of the DJGPP.ENV file which define sections for individual
programs.  This is so editing DJGPP.ENV with some losing editors
that don’t strip trailing whitespace when saving the file doesn’t
prevent the startup code from recognizing section names.
dtou and utod no longer overwrite the stack when invoked
on file names longer than 80 characters.
system works when its argument uses redirection to/from quoted
file names (e.g., when the file name includes embedded whitespace).
Buffered stdio functions, such as getc, putc,
fread, printf, and all their relatives pay attention to
termios settings of the terminal device and behave accordingly.
For example, you can get single-character, no-echo input with the
following snippet:
struct termios charmode; tcgetattr (0, &charmode); charmode.c_lflag &= ~(ECHO | ICANON | ISIG); tcsetattr (0, &charmode);
If you reset the ISIG or BRKINT flags in the
termios structure, or set the IGNBRK flag,
tcsetattr now disables SIGINT generation by a
Ctrl-C or Ctrl-BREAK keypress, and generation of
SIGQUIT by pressing Ctrl-\.
A call like ‘tcflush (0, TCIFLUSH);’ now empties the BIOS keyboard
buffer in addition to the internal buffer maintained by the
termios input processing.  This is compatible with the Unix
specification that tcflush should “discard all data received but
not read”.
Library function system no longer crashes when given invalid
command lines which involve pipe symbols ‘|’.  Typically, such
command lines should have been run by a Unix-style shell, like Bash.
However, sometimes, due to some system configuration snafu, the
SHELL variable in the environment didn’t point to such a shell,
and system would try to execute the command line using its
internal emulator of COMMAND.COM; it would then crash due to a
bug.  This is now solved: system prints appropriate error
message(s) and exits with an error code of -1.  We believe that some of
the rarely-reported and hard-to-reproduce crashes of the Make utility
were due to this bug.
Previously, when attempt was made to open a file, and all the available
file handles were exhausted, open would sometimes truncate an
existing file on Windows 9X.  This is now fixed.
All DJGPP programs now clear the FPU exceptions when they exit. This prevents the next DJGPP program that is run in the same DOS box on Windows 9X from crashing during startup code.
When the 387 environment variable overrides the FPU auto-detect
code, the value of the global variable _8087 is now set by the
startup code according to the environment override: 3 if 387 is
set to ‘y’, 0 otherwise.
You can use the special /dev/env/foo/ construct in file names
to expand it into the value of the environment variable foo
at run time.  /dev/env/foo~bar~ will expand to bar if
foo is undefined, or if its value is empty.
Calling getch and getche flushes the stdout and
stderr streams, if they are connected to the console and have any
pending buffered characters.
A bug in the library caused programs like Emacs, which dump their data
and then restart, to use stale FILE objects created before they
were dumped.  This caused warning messages to be issued by GDB near the
end of debugging session.  This bug is now fixed.
Due to a peculiarity of the timer device virtualization, the values
returned by uclock on Windows during the first 54.9msec
after the first call (which reprograms the timer chip) were erratic,
some of them negative, some positive.  To work around this, the first
call to uclock on Windows now waits until the next timer tick
before returning, to ensure that all the values returned hence are
monotonously increasing.
The termios emulation now uses raw input/output only if the file handle referring to a device is put into binary mode, and the device itself is in raw mode.
The termios input routines no longer generate the SIGINT and
SIGQUIT signals twice when Ctrl-C or
Ctrl-\ are pressed.
A call to __djgpp_set_ctrl_c with a negative argument returns the
current state of SIGINT and SIGQUIT generation without
altering it.
The termios cooked-mode output now expands TABs into the
appropriate number of spaces when writing to the console device.
The setmode function now switches character devices to raw/cooked
mode even when termios functions are used.
freopen now correctly sets the read/write access flags when
‘+’ is the last (third) character of the mode string, like in
‘wt+’ or ‘ab+’.
Previously, searchpath would always return its argument unchanged
and signal a success, when the argument included slashes or a drive
letter, even if the file didn’t actually exist.  This is now fixed:
non-existent files always cause searchpath to return a
NULL pointer.
The DJGPP debug support functions in libdbg.a now have the
capability to debug programs that catch signals such as SIGINT.
The signal interrupts the debuggee and is reported by the debugger,
instead of aborting the debuggee.  You can also deliver signals to
the debuggee, even if they didn’t actually happen.  Most of the work
that made this possible was done by Pierre Muller and Andris Pavenis.
The debugging support functions in libdbg.a now correctly handle
the SIGQUIT signal that happens while the debuggee runs.
Previously, a debugger would crash or report SIGINT in such cases.
The DJGPP functions in libdbg.a support FP code much better now, especially when FP exceptions happen in the debugged program. The full state of the numeric processor is saved and restored when the execution thread jumps from the debugger to the debuggee and back.
It is now possible to debug programs that redirect their standard
handles, without the debugger losing those handles at the same time.
Debuggers which want to use this feature need to call the new
redir_* functions before and after jumping to the debuggee’s
code.  See Redirection in the debugger in libc.a reference.
The documentation for the debug support functions in libdbg.a is now part of the library reference.
When a raw COFF image (i.e., without a stub) is debugged, its stack length and the size of transfer buffer are now taken from the values used by the debugger. This means that you can have predictable results by stubediting the debugger’s executable.
__dpmi_simulate_real_mode_procedure_retf_stack no longer fills
part of the real-mode stack with garbage.  The parameters specification
was changed so that the second argument is now the number of 16-bit
words to copy to the real-mode stack, like the DPMI spec requires.
The floating-point emulator software had a bug in emulation of
subtraction, addition, and comparison instructions, whereby the results
produced for some rare pairs of numbers with the same exponent but
different mantissa were grossly incorrect.  This is now fixed.
This bug was known to cause all kinds of weird failures, like incorrect
values produced by functions sin and cos, programs being
trapped inside infinite loops when they called acos, etc.
The FP emulation library libemu.a omitted the specially-compiled FPU setup module npxsetup.o which arranges for floating-point instructions to call functions from libemu.a. This caused programs linked with ‘-lemu’ to require the dynamically-loaded emulator, emu387.dxe, even though the emulation code was linked into the program. This bug is now fixed.
rename now sets errno to EACCES when an attempt is
made to rename an open file.  Previously, errno was set to
ENOENT in these cases.
Library functions that process strings and file names, such as
strupr, stricmp, strtol, fnmatch, and the
functions from printf and scanf families, handle 8-bit
characters correctly when they call ctype
character-classification functions internally.
New versions of mathematical functions, written by
Eric Rudd, are now included in the
standard C library, libc.a.  The new versions are
ANSI-compatible (they set errno in case of FP errors), yet
very fast and accurate.  Programs that require accurate floating-point
computations can now be linked without ‘-lm’, unless they need the
matherr call-back or compliance to standards like X/Open or SVID.
New math functions are provided: powi, cbrt, expm1,
exp2, exp10, and sincos.
If the format specifier for a floating-point number includes the
‘+’ flag (meaning that the sign should be printed even if the
number is positive), the functions of the printf family will now
print the negative zero, -0.0, with an explicit negative sign.
access no longer loses a FileFind handle on LFN platforms
when called on a root directory or a character device.
_check_v2_prog no longer leaks file descriptors when called on a
corrupt executable by name.
setitimer no longer crashes when its second argument is a
NULL pointer, it simply returns after setting the third argument
to the value of the last timer set with a previous call to
setitimer.
setitimer now rounds up timer values smaller than the system
clock granularity to that granularity, before it uses the values.
Therefore, setitimer and getitimer will return rounded up
values for such small timers.  The global variable
__djgpp_clock_tick_interval is provided for changing the
granularity used by setitimer, in case an application reprograms
the timer chip to run with a non-standard frequency.
ftruncate now leaves the file pointer at the same byte position
as it were before the function was called.
Functions of the scanf family now correctly stop the scan when
they encounter a digit larger than 7, and either the format specifies
octal conversion, like in %o, or the format is %i and the
leading digit is 0, which implies octal conversion.
Functions of the scanf family now use 16 as the base for
converting pointer values read with the %p format.  Thus, reading
back a pointer written with the %p format now yields the original
value.
kill now sets errno to ENOSYS when called with a
pid argument that isn’t the caller’s PID, since DOS doesn’t allow
sending signals to other processes.
The startup code and the linker script file djgpp.djl include support for long section names. Long section names are required by the latest versions of GNU Binutils to support automatic template instantiation in C++ programs.
The tcgetpgrp and tcsetpgrp are now provided in the
library.
realloc no longer crashes when the available virtual memory is
not enough to satisfy the reallocation request.
Previously, the symlink function would sometimes think that the
source and the target of the link were in the same directory, when in
fact they weren’t.  This bug is now fixed.
djtar now creates the file tarchange.lst only if it
actually needs to rename some of the files during unpacking.  In
particular, simply listing the contents of an archive, as in ‘djtar
foo.tgz’, will not produce an empty tarchange.lst file anymore.
The function memicmp was omitted from the library in version
2.02.  This is fixed now.
Previously, fsdb could not step over function calls when 4 or
more breakpoints were set: it would display an error message saying that
‘Exception 3 occurred’.  This is now fixed.  In addition,
fsdb now supports the SIGQUIT signal, if the program being
debugged generates it.
The floating-point emulation now works on Windows. Previously, a bug in the emulation of the WAIT/FWAIT instructions caused the emulator to get stuck in an endless loop on Windows. (On MS-DOS, these two instructions don’t generate an FP exception, and so don’t get into the emulator.)
redir no longer crashes when floating-point instructions are
emulated.
The emulator setup in the startup code now correctly masks all FP
exceptions in the emulated control word, like the hardware FPU setup
does.  If some numeric exception is unmasked by an application and is
triggered by some abnormal condition in the emulator (e.g., if an
application attempts to compute a square root of a negative number), the
emulation simulates exception 16, the Coprocessor Error exception.
(Previously, the exception number in the DJGPP exception structure was
not set by the emulation, and was left at its old value set by the
Coprocessor Not Present exception generated by the emulated
instruction.  This caused incorrect message to be printed when the
program crashed, and defeated user-defined handlers for SIGFPE.)
The emulator now correctly sets the condition code bits C0,
C1, C2, and C3 when an exceptional condition is
raised, and as result of emulating the FPREM and FPREM1
instructions.
The floating-point emulator software had a bug in emulation of the
FSQRT instruction, which could cause the calling program to hang.
This was due to incorrect optimization by the version of GCC used to
produce djdev202.zip.  The new version of the emulator works
around this bug by preventing the compiler from performing these
incorrect optimizations.
fsetpos no longer returns zero when it fails to move the file
position pointer.
djtar now converts .info- into .i only if the
character following .info- is a digit.  .tar.gz is
converted to .tgz only at the end of a file name.  ++ is
converted to xx (instead of plus in previous versions),
and this conversion is performed for all occurrences of ++ in a
file name (previous versions only converted the first occurrence).
The gxx compiler driver no longer reports an error if the
optional GNU C++ class library libgpp.a is not installed.  If
libgpp.a cannot be found where gcc would look for it,
gxx does not pass the ‘-lgpp’ option to the linker.  Also,
if the standard C++ library, libstdcxx.a, cannot be found,
gxx now tries libstdcx.a and libstd~1.a, in case
the user has some LFN-related installation snafu.
The FP emulation behaves closer to a real FPU when an FP instruction
produces abnormal results, such as Inf or NaN.  In
particular:
Inf to be stored
in the results, while underflow usually results in a denormal or a zero.
Inf
by an Inf, produce a NaN.
FST and FSTP instructions avoids overflowing
of the exponent when it is too large for the destination format; it
stores an Inf or a maximum finite number instead.  Operands that
are too small for the destination format cause either a denormal or a
zero to be stored.
FXCH stores a NaN when one or both of its
operands is a NaN.
FYL2X always pops the operands from the FPU
stack, even if one of the operands is invalid (Inf or
NaN), or if the operand on top of the stack is negative.  This
affects functions acosh and asinh.
FPREM and FPREM1 instructions no
longer hangs the program when the difference of the exponents of the
operands is larger than 64.  Instead, it correctly implements the
“partial remainder” algorithm defined by the Intel manuals.  Also, the
sign of the result of these instructions is now in accordance with the
Intel manuals (this affects the ceil function for small negative
arguments).
FPTAN now correctly handles the case where its
operand is out of range.
FPATAN emulation now uses a better approximation which is
accurate to 63 bits, even when its argument is near 1.  (Previously, it
would suffer a catastrophic accuracy loss of up to 13 significant digits
for arguments near 1.)  This affects functions atan,
atan2, asin, and acos.
FSQRT behaves correctly for infinite arguments.
FRNDINT emulation returns a negative zero for negative
arguments.  This affects the fmod function for negative
arguments.
FSCALE handles overflow correctly.
FSINCOS, FSIN and FCOS return a
NaN for an argument that is a NaN, and raise an Invalid
Operation exception for an Inf argument; this is what the Intel
manuals require.  This affects functions sin, cos,
sincos, and tan.
FST and FSTP that store
FP registers into float or double variables, now correctly
round the stored value according to the current rounding mode.
Previously, the stored value was always chopped (truncated) at the last
stored bit of the mantissa.
The wchar_t data type is changed so that DJGPP now supports
16-bit wide characters.  This is required for RSXNTDJ programs to
be compatible with Windows implementation of Unicode.
The long file-name (LFN) support is no longer disabled after
_use_lfn (or some other library functions that call it) were
called with a file name which refers to an invalid drive or a drive
whose media has been removed (e.g. an empty floppy drive).
_get_volume_info now returns _FILESYS_UNKNOWN for such
drives.
symify no longer crashes when the name of the function or source
file are too long to fit on a single screen line.  It also doesn’t
overwrite the address on the next screen line.  Instead, symify
truncates the long names to fit on a single screen line.
tmpfile no longer gets stuck in an endless loop when all the
available file handles are exhausted.
Next: Changes in 2.04, Previous: Changes in 2.02, Up: What Changed [Contents][Index]