Author: Jan Nijtmans <[email protected]>
State: Final
Type: Project
Vote: Done
Created: 05-Oct-2022
Tcl-Version: 8.7
Tk-Branch: tip-642
Vote-Summary: Accepted 3/0/0
Votes-For: JN, KBK SL
Votes-Against: none
Votes-Present: none
Abstract
This TIP proposes new flags for Tk's configuration options TK_OPTION_BOOL/TK_OPTION_STRING_TABLE.
The Tk_OptionSpec.internalOffset field describes the offset
of the variable being handled in the record. This variable
has to be of type int. This TIP expands this, such that
the variable pointed to by this internalOffset also can be
of another type, as long as sizeof(var) is 1, 2 or 4.
For example (C99) bool (useful for TK_OPTION_BOOLEAN) and
enum (useful for TK_OPTION_STRING_TABLE) can now be
used, even when sizeof(bool) resp. sizeof(enum) != sizeof(int).
Specification
Two new macro's are defined:
#define TK_OPTION_VAR(type) ...
#define TK_OPTION_ENUM_VAR ...
Those macro's can be used in the Tk_OptionSpec.flags field,
indicating the size of the variable internalOffset points to.
It can be combined with any other flag, using the | operator.
For example:
TK_OPTION_VAR(bool)
This will result in the value 64 if sizeof(bool) == 1, or 0 if sizeof(bool) == sizeof(int).
TK_OPTION_ENUM_VAR
This will result in the value 64 if sizeof(enum) == 1, 128 if sizeof(enum) == 2, or 0 if sizeof(enum) == sizeof(int).
Those 2 flag values (64 and 128) are used in the option handling, indicating
that the variable pointed to by internalOffset is not an int, but a smaller type.
Those flag values don't conflict with any other flag value which can be used here.
The TK_OPTION_ENUM_VAR macro is already implemented, in tkInt.h, as part of bugfix
eedd795d98: It turned out that in
various places, enum variables were already used in Tk, which is not portable.
This TIP moves TK_OPTION_ENUM_VAR to the public header-file tk.h, so it can
officially be used in extensions as well.
Gcc has a compilation option -fshort-enums, which makes sizeof(enum) == sizeof(short).
Using this option, and without bug-fix eedd795d98,
the problem described in the bug-fix ticket can be demonstrated. Some (mostly embedded)
targets use -fshort-enums as default.
Compatibility
This is 100% upwards compatible.
Reference Implementation
Under development on the tip-642 branch.
Copyright
This document has been placed in the public domain.
