[latex3-commits] [git/LaTeX3-latex3-latex3] master: Make \IfBooleanTF safer (check its argument is true or false) (1d7bb24)
Joseph Wright
joseph.wright at morningstar2.co.uk
Mon Mar 4 14:54:38 CET 2019
Repository : https://github.com/latex3/latex3
On branch : master
Link : https://github.com/latex3/latex3/commit/1d7bb24774eeb9899c0b9c511a2fcb7de1808cf3
>---------------------------------------------------------------
commit 1d7bb24774eeb9899c0b9c511a2fcb7de1808cf3
Author: Bruno Le Floch <bruno at le-floch.fr>
Date: Wed Feb 27 15:31:29 2019 +0100
Make \IfBooleanTF safer (check its argument is true or false)
>---------------------------------------------------------------
1d7bb24774eeb9899c0b9c511a2fcb7de1808cf3
l3packages/CHANGELOG.md | 7 ++++++-
l3packages/xparse/xparse.dtx | 35 +++++++++++++++++++++++++----------
2 files changed, 31 insertions(+), 11 deletions(-)
diff --git a/l3packages/CHANGELOG.md b/l3packages/CHANGELOG.md
index 71a74c6..4acebeb 100644
--- a/l3packages/CHANGELOG.md
+++ b/l3packages/CHANGELOG.md
@@ -6,7 +6,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
-- `xparse`: implement b-type argument to grab body of environments
+
+### Added
+- `xparse`: b-type argument to grab body of environments
+
+### Changed
+- `xparse`: make \IfBooleanTF safer
## [2018-09-24]
diff --git a/l3packages/xparse/xparse.dtx b/l3packages/xparse/xparse.dtx
index d6ff1c8..d04f274 100644
--- a/l3packages/xparse/xparse.dtx
+++ b/l3packages/xparse/xparse.dtx
@@ -4652,19 +4652,34 @@
%
% \begin{macro}{\IfBooleanT, \IfBooleanF, \IfBooleanTF}
% The logical \meta{true} and \meta{false} statements are just the
-% normal \cs{c_true_bool} and \cs{c_false_bool}, so testing for them is
-% done with the \cs{bool_if:NTF} functions from \textsf{l3prg}.
+% normal \cs{c_true_bool} and \cs{c_false_bool} so \cs{bool_if:NTF} is
+% almost enough. However, this code-level function blows up badly
+% when passed invalid input. We want \cs{IfBooleanTF} to accept a
+% single (non-space) token equal to \cs{c_true_bool} or
+% \cs{c_false_bool}, possibly surrounded by spaces. If the input is
+% blank or multiple items, jump to the error and pick the false
+% branch. If the input, ignoring spaces (we do this by omitting
+% braces in the \cs{tl_if_single_token:nF} test), is not a single
+% token then jump to the error as well. It is then safe to compare
+% the token to the two booleans, picking the appropriate branch. If
+% neither matches, we jump to the error as well.
% \begin{macrocode}
\cs_new:Npn \IfBooleanTF #1
{
- \bool_lazy_and:nnTF
- { \tl_if_single_p:n {#1} }
- { \tl_if_single_token_p:n #1 }
- { \bool_if:NTF #1 }
- {
- \__kernel_msg_error:nnn { xparse } { if-boolean } {#1}
- \use_ii:nn
- }
+ \tl_if_single:nF {#1}
+ { \prg_break:n { \use:n } }
+ \tl_if_single_token:nF #1
+ { \prg_break:n { \use:n } }
+ \token_if_eq_meaning:NNT #1 \c_true_bool
+ { \prg_break:n { \use_ii:nnn } }
+ \token_if_eq_meaning:NNT #1 \c_false_bool
+ { \prg_break:n { \use_iii:nnn } }
+ \prg_break:n { \use:n }
+ \prg_break_point:
+ {
+ \__kernel_msg_error:nnn { xparse } { if-boolean } {#1}
+ \use_ii:nn
+ }
}
\cs_new:Npn \IfBooleanT #1#2 { \IfBooleanTF {#1} {#2} { } }
\cs_new:Npn \IfBooleanF #1 { \IfBooleanTF {#1} { } }
More information about the latex3-commits
mailing list