ISO/ IEC JTC1/SC22/WG21 N1503

N1503=03-0086

PROPOSED ADDITIONS TO TR-1 TO IMPROVE
COMPATIBILITY WITH C99

P.J. Plauger
Dinkumware, Ltd.
pjp@dinkumware.com

In an earlier document (WG21/N1372) I described in general terms
the functions and type definitions defined in the revised C standard
ISO 9899:1999 (a.k.a. C99) that are not present in Standard C++. This
document proposes adding to TR-1 enough of those functions and type
definitions to dramatically reduce incompatibilities between programs
written in C99 and those written in C++ with TR-1. For precise details
of each proposed addition, see the C99 Standard.

I intentionally omit (for now) any use of the restrict keyword or
other language extensions unique to C99 -- with one exception.
Any use of the type long long is replaced here with the type
_Longlong, and any use of the type unsigned long long is replaced
here with the type _ULonglong. These types are defined idempotently
in any header that needs them. They can be defined as long and
unsigned long, respectively, on an implementation that has no
equivalent to long long.


HEADERS <complex.h> AND <ccomplex>

Add the headers <complex.h> and <ccomplex>, which simply include the
existing C++ header <complex>, which add:

-- overloads for the three complex types for the functions asin,
asinh, atan, atanh, and fabs

-- additional overloads for the above so that any integer argument
behaves the same as the version with a double argument, with the
integer argument converted to double

-- additional overloads for the above so that any mixture of double
and float complex arguments behaves the same as two double complex
arguments

-- additional overloads for the above so that any mixture of long double
and float complex arguments behaves the same as two long double complex
arguments

-- additional overloads for the above so that any mixture of double
and long double complex arguments behaves the same as two long double
complex arguments

Moreover, it is recommended that an implementation supporting the
C99 complex types in C++ make them compatible with the template
specializations complex<float>, complex<double>, and
complex<long double>.


EXISTING HEADERS <ctype.h> AND <cctype>

Add the function:

	isblank

which matches at least space and tab (plus other locale-specific
blank characters outside the "C" locale).


HEADERS <fenv.h> AND <cfenv>

Add the headers <fenv.h> and <cfenv>, which defines various macros,
types, and functions for controlling the floating-point environment.
Specifically, they define the macros:

-- for exception control:

	FE_ALL_EXCEPT
	FE_DIVBYZERO
	FE_INEXACT
	FE_INVALID
	FE_OVERFLOW
	FE_UNDERFLOW

-- for rounding-mode control:

	FE_DOWNWARD
	FE_TONEAREST
	FE_TOWARDZERO
	FE_UPWARD

-- for the default floating-point environment:

	FE_DFL_ENV

They define the types:

-- for the floating-point environment:

	fenv_t

-- for the exception mask:

	fexcept_t

And they define the functions:

	feclearexcept
	fegetenv
	fegetexceptflag
	fegetround
	feholdexcept
	feraiseexcept
	fesetenv
	fesetexceptflag
	fesetround
	fetestexcept
	feupdateenv


EXISTING HEADERS <float.h> AND <cfloat>

Add the macros:

	FLT_EVAL_METHOD
	DECIMAL_DIG


EXISTING HEADER <ios>

Add the format flag:

	hexfloat

with the value (fixed|scientific). And add a manipulator of the
same name, which sets floatfield to hexfloat.


HEADERS <inttypes.h> and <cinttypes>

Add the headers <inttypes.h> and <cinttypes>, which declare
several functions for manipulating values of type intmax_t,
a synonym for the largest integer type. They also define a slew of
macros that supply the appropriate scan and print conversion specifiers
for the integer types defined in <stdint.h>. The macros are of the
form:

	{PRI SCN}{d i o u x X}[FAST LEAST]{8 16 32 64}
	{PRI SCN}{d i o u x X}{MAX PTR}

They define the type:

	imaxdiv_t

They define functions that manipulate intmax_t values:

	imaxabs
	imaxdiv
	strtoimax
	strtoumax
	wcstoimax
	wcstoumax

And they define overloads on intmax_t for the functions:

	abs
	div


EXISTING HEADERS <limits.h> AND <climits>

Add the macros:

	LLONG_MIN
	LLONG_MAX
	ULLONG_MAX


EXISTING HEADER <limits>

Add explicit specializations of template class numeric_limits
for _Longlong and _ULonglong (assuming they differ from long
and unsigned long).


EXISTING HEADER <locale>

Change num_put for floating types so that if floatfield ==
hexfloat, the effective printf conversion specifier is %a or %A.


EXISTING HEADERS <math.h> AND <cmath>

Add the macros:

-- for reporting the presence of fused multiply/add

	FP_FAST_FMA
	FP_FAST_FMAF
	FP_FAST_FMAL

-- for error returns from function ilogb

	FP_ILOGB0
	FP_ILOGBNAN

-- for category returns from macro fpclassify

	FP_INFINITE
	FP_NAN
	FP_NORMAL
	FP_SUBNORMAL
	FP_ZERO

-- for variants of HUGE_VAL

	HUGE_VALF
	HUGE_VALL

-- for special floating-point values

	INFINITY
	NAN

-- for controlling the handling of math errors

	MATH_ERRNO
	MATH_ERREXCEPT
	math_errhandling

Add the types:

-- for tighter control over computational types

	double_t
	float_t

And add a gazillion functions:

-- acosh, asinh, atanh, cbrt, copysign, erf, erfc, exp2, expm1,
fdim, fma, fmax, fmin, hypot, ilogb, lgamma, llrint, llround, log1p, log2,
logb, lrint, lround, nan, nearbyint, nextafter, nexttoward, remainder,
remquo, rint, round, scalbln, scanbn, tgamma, trunc

-- float versions of the above, both as overloads and the same names
ending in f

-- long double versions of the above, both as overloads and the same
names ending in l (lower-case L)

-- additional overloads for the above so that any integer argument
behaves the same as the version with a double argument, with the
integer argument converted to double

-- inline functions overloaded on float, double, and long double
to replace the C99 function macros signbit, fpclassify, isfinite,
isinf, isnan, isnormal, isgreater, isgreaterequal, isless, islessequal,
islessgreater, isunordered


EXISTING HEADERS <stdarg.h> and <cstdarg>

Add the function macro:

	va_copy(va_list)

to copy a va_list object.


HEADERS <stdbool.h> AND <cstdbool>

Add the headers <stdbool.h> and <cstdbool> simply to define the macro:

	__bool_true_false_are_defined


HEADERS <stdint.h> and <cstdint>

Add the headers <stdint.h> and <cstdint> to define a number of
integer properties. Specifically, the headers add a whole slew
of macros, of the form:

	INT[FAST LEAST]{8 16 32 64}_MIN
	[U]INT[FAST LEAST]{8 16 32 64}_MAX
	INT{MAX PTR}_MIN
	[U]INT{MAX PTR}_MAX
	{SIG_ATOMIC WCHAR WINT}{_MAX _MIN}
	SIZE_MAX

plus function macros (for converting literals to a known type) of the
form:

	[U]INT{8 16 32 64}_C

And they add a whole slew of types, of the form:

	[u]int[fast least]{8 16 32 64}_t
	[u]int{max ptr}_t


EXISTING HEADERS <stdio.h> AND <cstdio>

Add the functions:

	snprintf
	vfprintf
	vprintf
	vsnprintf
	vprintf
	vfscanf
	vscanf
	vsscanf

To the print and scan functions, add the conversion specifiers a
(for hexadecimal floating-point) and F, and the conversion qualifiers
hh, h, ll, t, and z (for various integer types). The scan functions
should accept the various text forms of infinity and NaN values and
the print functions should generate them.

It is recommended that the num_get and num_put template classes
also accept and generate the various text forms of infinity and
NaN values.


EXISTING HEADERS <stdlib.h> AND <cstdlib>

Add the type:

	lldiv_t

Add the functions:

	atoll
	llabs
	lldiv
	strtof
	strtold
	strtoll
	strtoull
	_Exit

And add the relevant long long overloads to:

	abs
	div


HEADERS <tgmath.h> AND <ctgmath>

Add the headers <tgmath.h> and <ctgmath> simply to include the
headers <math.h> (or <cmath>) and <complex.h> (or <ccomplex>).
The generic capabilities added with C99 are already present in
these other headers.


EXISTING HEADERS <wchar.h> AND <cwchar>

Add the functions:

	wcstof
	wcstold
	wcstoll
	wcstoull


EXISTING HEADERS <wctype.h> AND <cwctype>

Add the function:

	iswblank