641.md at [78499e705f]

Login

File tip/641.md artifact fdbe26dda6 part of check-in 78499e705f


# TIP 641: Let Tcl_GetBoolean(FromObj) handle (C99) bool.
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        02-Oct-2022
	Tcl-Version:    8.7
	Tcl-Branch:	    tip-641
	Vote-Summary:  Accepted 3/0/0
	Votes-For:     JN, KBK SL
	Votes-Against: none
	Votes-Present: none
-----

# Abstract

This TIP proposes new behavior for public routines **Tcl\_GetBoolean**
and **Tcl\_GetBooleanFromObj**: It's `boolPtr` argument can now point
at a `bool` as well as an `int`.

# Specification

Since C99 (and also recent C++ compilers), there's a new `bool` type,
which can only have the values `true` or `false`. Tcl predates this,
therefore it doesn't have an API to handle this type directly: In
stead of `bool` the only portable way to use it, is use an `int`
temporary variable, and convert it manually to the desired type.
For example, see [here](https://core.tcl-lang.org/tcl/file?ln=1193-1201&ci=00b136d44a3e6499&name=win%2FtclWinSock.c)
(which uses the Microsoft-specific `BOOL`, but the idea is the same).

Some platforms use `sizeof(bool) == sizeof(char)`, other platforms use
`sizeof(bool) == sizeof(int)`. Therefore, we can implement this with
already existing functions (the `char` variant depends on TIP #618).
We just define 2 macro's `Tcl_GetBoolean/Tcl_GetBooleanFromObj`, which
map to the original functions if `sizeof(*(boolPtr)) == sizeof(int)`
and to `Tcl_GetBool/Tcl_GetBoolFromObj` when `sizeof(*(boolPtr)) == sizeof(char)`.
A panic will result it none of those two match (but that's actually impossible
when using `bool`).

# History

This implementation used to be part of TIP #618, but doing that led to a
lot of discussion. Since that TIP did multiple unrelated proposals,
it was decided to split it: TIP #618 introduces the new API which
makes this TIP possible at all. This TIP explains how the new API
can be used to handle the C99/C++ `bool` type, just be defining
two new macro's.

# Compatibility

This is 100% upwards compatible.

# Reference Implementation

Under development on the [tip-641](https://core.tcl-lang.org/tcl/timeline?t=tip-641) branch.

# Copyright

This document has been placed in the public domain.