[latex3-commits] [git/LaTeX3-latex3-latex3] master: Check mismatched cctabs and group (4c034e651)
Joseph Wright
joseph.wright at morningstar2.co.uk
Thu Jul 16 12:13:16 CEST 2020
Repository : https://github.com/latex3/latex3
On branch : master
Link : https://github.com/latex3/latex3/commit/4c034e6513942e7e17a170db328f2726e08149fb
>---------------------------------------------------------------
commit 4c034e6513942e7e17a170db328f2726e08149fb
Author: PhelypeOleinik <tex.phelype at gmail.com>
Date: Thu Jul 2 22:33:25 2020 -0300
Check mismatched cctabs and group
>---------------------------------------------------------------
4c034e6513942e7e17a170db328f2726e08149fb
l3kernel/l3cctab.dtx | 71 ++++++++++++++++++++++++++++++++++
l3kernel/testfiles/m3cctab003.lvt | 80 +++++++++++++++++++++++++++++++++++++++
l3kernel/testfiles/m3cctab003.tlg | 57 ++++++++++++++++++++++++++++
3 files changed, 208 insertions(+)
diff --git a/l3kernel/l3cctab.dtx b/l3kernel/l3cctab.dtx
index 558ec9929..ec269efe1 100644
--- a/l3kernel/l3cctab.dtx
+++ b/l3kernel/l3cctab.dtx
@@ -196,6 +196,13 @@
% \end{macrocode}
% \end{variable}
%
+% \begin{variable}{\g_@@_group_seq}
+% A stack to store the group level when a catcode table started.
+% \begin{macrocode}
+\seq_new:N \g_@@_group_seq
+% \end{macrocode}
+% \end{variable}
+%
% \begin{variable}{\g_@@_allocate_int}
% Integer to keep track of what category code table to allocate. In
% \LuaTeX{} it is only used in format mode to implement
@@ -509,6 +516,7 @@
{
\@@_chk_if_valid:NT #1
{
+ \@@_chk_group_begin:
\seq_gpop:NNF \g_@@_unused_seq \l_@@_internal_tl
{ \@@_begin_aux: }
\seq_gpush:NV \g_@@_stack_seq \l_@@_internal_tl
@@ -533,12 +541,65 @@
{
\seq_gpush:NV \g_@@_unused_seq \l_@@_internal_tl
\@@_select:N \l_@@_internal_tl
+ \@@_chk_group_end:
}
{ \__kernel_msg_error:nn { kernel } { cctab-extra-end } }
}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\@@_chk_group_begin:,\@@_chk_group_end:}
+% Catcode tables are not allowed to be intermixed with groups, so here
+% we check that they are properly nested regarding \TeX{} groups.
+% \cs{@@_chk_group_begin:} stores the current group level in a stack,
+% and locally defines a dummy control sequence
+% \cs[no-index]{@@_group_\meta{group-level}_chk:}.
+%
+% \cs{@@_chk_group_end:} pops the stack, and compares the returned
+% value with \cs{tex_currentgrouplevel:D}. If they differ,
+% \cs{cctab_end:} is in a different grouping level than the matching
+% \cs{cctab_begin:N}. If they are the same, both happened at the same
+% level, but a group might have ended and another started between
+% \cs{cctab_begin:N} and \cs{cctab_end:}, which is the case if
+% \cs[no-index]{@@_group_\meta{group-level}_chk:} doesn't exist
+% since it was locally defined.
+%
+% Any of these cases just raise an error, but no recovery is
+% attempted: usually interleaving groups and catcode tables will work
+% as expected.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_chk_group_begin:
+ {
+ \seq_gpush:Nx \g_@@_group_seq
+ { \int_use:N \tex_currentgrouplevel:D }
+ \cs_set_eq:cN
+ { @@_group_ \int_use:N \tex_currentgrouplevel:D _chk: }
+ \prg_do_nothing:
+ }
+\cs_new_protected:Npn \@@_chk_group_end:
+ {
+ \seq_gpop:NN \g_@@_group_seq \l_@@_internal_tl
+ \int_compare:nNnTF
+ { \tex_currentgrouplevel:D } = { \l_@@_internal_tl }
+ {
+ \cs_if_exist:cF { @@_group_ \l_@@_internal_tl _chk: }
+ {
+ \__kernel_msg_error:nnx { kernel } { cctab-group-mismatch }
+ { different~group }
+ }
+ }
+ {
+ \__kernel_msg_error:nnx { kernel } { cctab-group-mismatch }
+ {
+ \int_compare:nNnTF
+ { \tex_currentgrouplevel:D } < { \l_@@_internal_tl }
+ { lower } { higher } ~group~level
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Category code table conditionals}
%
% \begin{macro}{\cctab_if_exist:N,\cctab_if_exist:c}
@@ -685,6 +746,16 @@
initialized~using~\iow_char:N\\cctab_new:N~or~
\iow_char:N\\cctab_const:Nn.
}
+\__kernel_msg_new:nnnn { kernel } { cctab-group-mismatch }
+ {
+ \iow_char:N\\cctab_end:~occurred~in~a~#1~than~
+ the~matching~\iow_char:N\\cctab_begin:N.
+ }
+ {
+ Catcode~tables~and~groups~must~be~properly~nested,~but~
+ you~tried~to~interleave~them.~LaTeX~will~try~to~proceed,~
+ but~results~may~be~unexpected.
+ }
% \end{macrocode}
%
% \begin{macrocode}
diff --git a/l3kernel/testfiles/m3cctab003.lvt b/l3kernel/testfiles/m3cctab003.lvt
new file mode 100644
index 000000000..c30a89b43
--- /dev/null
+++ b/l3kernel/testfiles/m3cctab003.lvt
@@ -0,0 +1,80 @@
+%
+% Copyright (C) 2020 The LaTeX3 Project
+%
+
+\documentclass{minimal}
+\input{regression-test}
+
+\RequirePackage[enable-debug]{expl3}
+\ExplSyntaxOn
+\debug_on:n { check-declarations , deprecation }
+\ExplSyntaxOff
+
+\START
+\AUTHOR{Phelype Oleinik}
+
+\ExplSyntaxOn
+\OMIT
+\use:n
+ { % Allocation
+ \cctab_begin:N \c_code_cctab
+ \cctab_begin:N \c_code_cctab
+ \cctab_end:
+ \cctab_end:
+ { \cctab_select:N \c_code_cctab }
+ { { \cctab_select:N \c_code_cctab } }
+ }
+\TIMO
+
+\TEST { \cctab_end:~higher~than~\cctab_begin:N }
+ {
+ \cctab_begin:N \c_code_cctab
+ \group_begin:
+ \cctab_end:
+ \group_end:
+ %
+ \cctab_begin:N \c_code_cctab
+ \cctab_begin:N \c_code_cctab
+ \group_begin:
+ \cctab_end:
+ \group_end:
+ \cctab_end:
+ }
+
+\TEST { \cctab_end:~lower~than~\cctab_begin:N }
+ {
+ \group_begin:
+ \cctab_begin:N \c_code_cctab
+ \group_end:
+ \cctab_end:
+ %
+ \cctab_begin:N \c_code_cctab
+ \group_begin:
+ \cctab_begin:N \c_code_cctab
+ \group_end:
+ \cctab_end:
+ \cctab_end:
+ }
+
+\TEST { Group~end~and~begin~between~\cctab_begin:N~and~\cctab_end: }
+ {
+ \group_begin:
+ \cctab_begin:N \c_code_cctab
+ \group_end:
+ \group_begin:
+ \cctab_end:
+ \group_end:
+ %
+ \cctab_begin:N \c_code_cctab
+ \group_begin:
+ \cctab_begin:N \c_code_cctab
+ \group_end:
+ \group_begin:
+ \cctab_end:
+ \group_end:
+ \cctab_end:
+ }
+
+\ExplSyntaxOff
+
+\END
diff --git a/l3kernel/testfiles/m3cctab003.tlg b/l3kernel/testfiles/m3cctab003.tlg
new file mode 100644
index 000000000..a08e45206
--- /dev/null
+++ b/l3kernel/testfiles/m3cctab003.tlg
@@ -0,0 +1,57 @@
+This is a generated file for the LaTeX (2e + expl3) validation system.
+Don't change this file in any respect.
+Author: Phelype Oleinik
+============================================================
+TEST 1: \cctab_end: higher than \cctab_begin:N
+============================================================
+! LaTeX3 Error: \cctab_end: occurred in a higher group level than the matching
+(LaTeX3) \cctab_begin:N.
+For immediate help type H <return>.
+ ...
+l. ... }
+Catcode tables and groups must be properly nested, but you tried to interleave
+them. LaTeX will try to proceed, but results may be unexpected.
+! LaTeX3 Error: \cctab_end: occurred in a higher group level than the matching
+(LaTeX3) \cctab_begin:N.
+For immediate help type H <return>.
+ ...
+l. ... }
+Catcode tables and groups must be properly nested, but you tried to interleave
+them. LaTeX will try to proceed, but results may be unexpected.
+============================================================
+============================================================
+TEST 2: \cctab_end: lower than \cctab_begin:N
+============================================================
+! LaTeX3 Error: \cctab_end: occurred in a lower group level than the matching
+(LaTeX3) \cctab_begin:N.
+For immediate help type H <return>.
+ ...
+l. ... }
+Catcode tables and groups must be properly nested, but you tried to interleave
+them. LaTeX will try to proceed, but results may be unexpected.
+! LaTeX3 Error: \cctab_end: occurred in a lower group level than the matching
+(LaTeX3) \cctab_begin:N.
+For immediate help type H <return>.
+ ...
+l. ... }
+Catcode tables and groups must be properly nested, but you tried to interleave
+them. LaTeX will try to proceed, but results may be unexpected.
+============================================================
+============================================================
+TEST 3: Group end and begin between \cctab_begin:N and \cctab_end:
+============================================================
+! LaTeX3 Error: \cctab_end: occurred in a different group than the matching
+(LaTeX3) \cctab_begin:N.
+For immediate help type H <return>.
+ ...
+l. ... }
+Catcode tables and groups must be properly nested, but you tried to interleave
+them. LaTeX will try to proceed, but results may be unexpected.
+! LaTeX3 Error: \cctab_end: occurred in a different group than the matching
+(LaTeX3) \cctab_begin:N.
+For immediate help type H <return>.
+ ...
+l. ... }
+Catcode tables and groups must be properly nested, but you tried to interleave
+them. LaTeX will try to proceed, but results may be unexpected.
+============================================================
More information about the latex3-commits
mailing list.