[latex3-commits] [git/LaTeX3-latex3-latex3] cctab: l3cctab for non-LuaTeX engines: let cctabs simply be intarrays (b76dfb39b)
Bruno Le Floch
bruno at le-floch.fr
Fri Jun 26 22:43:00 CEST 2020
Repository : https://github.com/latex3/latex3
On branch : cctab
Link : https://github.com/latex3/latex3/commit/b76dfb39b430c7607d932a8bc7e6a16d8c146f15
>---------------------------------------------------------------
commit b76dfb39b430c7607d932a8bc7e6a16d8c146f15
Author: Bruno Le Floch <bruno at le-floch.fr>
Date: Fri Jun 26 22:43:00 2020 +0200
l3cctab for non-LuaTeX engines: let cctabs simply be intarrays
>---------------------------------------------------------------
b76dfb39b430c7607d932a8bc7e6a16d8c146f15
l3kernel/l3cctab.dtx | 143 ++++++++++++++++++++++++++-------------------------
1 file changed, 73 insertions(+), 70 deletions(-)
diff --git a/l3kernel/l3cctab.dtx b/l3kernel/l3cctab.dtx
index b42f6c414..6cb956a00 100644
--- a/l3kernel/l3cctab.dtx
+++ b/l3kernel/l3cctab.dtx
@@ -276,32 +276,22 @@
}
}
% \end{macrocode}
-% Now the case for other engines. Here, we use an integer array for each
-% table. The index base is out-by-one, so we have an internal function to
-% handle that. The rest of the approach here is pretty simple: use a stack
-% of tables, and save to them at each |begin|. Unlike the \LuaTeX{} case,
-% we can't accidentally alter a saved table, which makes life a little
-% easier.
+% Now the case for other engines. Here, each table is an integer
+% array. The index base is out-by-one, so we have an internal
+% function to handle that. The rest of the approach here is pretty
+% simple: use a stack of tables, and save to them at each
+% |begin|. Unlike the \LuaTeX{} case, we can't accidentally alter a
+% saved table, which makes life a little easier. Following the
+% \LuaTeX{} pattern, a new table starts with \IniTeX{} codes.
% \begin{macrocode}
{
\cs_new_protected:Npn \@@_gstore:Nnn #1#2#3
- {
- \intarray_gset:cnn
- { g_@@_ \int_use:N #1 _cctab } { #2 + 1 } {#3}
- }
-% \end{macrocode}
-% Following the \LuaTeX{} pattern, a new table starts with \IniTeX{} codes.
-% \begin{macrocode}
+ { \intarray_gset:Nnn #1 { \int_eval:n { #2 + 1 } } {#3} }
\cs_new_protected:Npn \cctab_new:N #1
{
- \int_gadd:Nn \g_@@_allocate_int { 2 }
- \int_const:Nn #1 { \g_@@_allocate_int }
- \intarray_new:cn { g_@@_ \int_use:N #1 _cctab } { 256 }
+ \intarray_new:Nn #1 { 256 }
\int_step_inline:nn { 256 }
- {
- \intarray_gset:cnn
- { g_@@_ \int_use:N #1 _cctab } {##1} { 12 }
- }
+ { \__kernel_intarray_gset:Nnn #1 {##1} { 12 } }
\@@_gstore:Nnn #1 { 0 } { 9 }
\@@_gstore:Nnn #1 { 13 } { 5 }
\@@_gstore:Nnn #1 { 32 } { 10 }
@@ -313,58 +303,60 @@
{ \@@_gstore:Nnn #1 {##1} { 11 } }
\@@_gstore:Nnn #1 { 127 } { 15 }
}
- \cs_new_protected:Npn \@@_begin:N #1
+% \end{macrocode}
+% Then, two basic operations: setting catcodes (selecting
+% a catcode table) and saving catcodes (assigning a
+% catcode table).
+% \begin{macrocode}
+ \cs_new_protected:Npn \@@_select:N #1
{
- \int_gadd:Nn \g_@@_stack_int { 2 }
- \int_compare:nNnT \g_@@_stack_int > \c_max_register_int
- { \__kernel_msg_fatal:nn { kernel } { cctab-stack-full } }
- \cs_if_exist:cF { g_@@_ \int_use:N \g_@@_stack_int _cctab }
- {
- \intarray_new:cn
- { g_@@_ \int_use:N \g_@@_stack_int _cctab }
- { 256 }
- }
- \int_step_inline:nn { 256 }
- {
- \intarray_gset:cnn
- { g_@@_ \int_use:N \g_@@_stack_int _cctab }
- {##1}
- { \char_value_catcode:n { ##1 - 1 } }
- }
\int_step_inline:nn { 256 }
{
\char_set_catcode:nn { ##1 - 1 }
- {
- \intarray_item:cn
- { g_@@_ \int_use:N #1 _cctab } {##1}
- }
+ { \__kernel_intarray_item:Nn #1 {##1} }
}
}
- \cs_generate_variant:Nn \intarray_new:Nn { c }
- \cs_generate_variant:Nn \intarray_gset:Nnn { c }
- \cs_new_protected:Npn \@@_end:
+ \cs_new_protected:Npn \@@_gset:N #1
{
\int_step_inline:nn { 256 }
{
- \char_set_catcode:nn { ##1 - 1 }
- {
- \intarray_item:cn
- { g_@@_ \int_use:N \g_@@_stack_int _cctab }
- {##1}
- }
+ \__kernel_intarray_gset:Nnn #1 {##1}
+ { \char_value_catcode:n { ##1 - 1 } }
}
+ }
+% \end{macrocode}
+% Beginning and ending a catcode table simply involves
+% some bookkeeping to store the current catcodes in a
+% dynamically generated variable.
+% \begin{macrocode}
+ \cs_new_protected:Npn \@@_begin:N #1
+ {
+ \int_gadd:Nn \g_@@_stack_int { 2 }
+ \exp_args:Nc \@@_begin_aux:N
+ { g_@@_ \int_use:N \g_@@_stack_int _intarray }
+ \@@_select:N #1
+ }
+ \cs_new_protected:Npn \@@_begin_aux:N #1
+ {
+ \cs_if_exist:NF #1 { \intarray_new:Nn #1 { 256 } }
+ \@@_gset:N #1
+ }
+ \cs_new_protected:Npn \@@_end:
+ {
+ \exp_args:Nc \@@_select:N
+ { g_@@_ \int_use:N \g_@@_stack_int _intarray }
\int_gsub:Nn \g_@@_stack_int { 2 }
}
- \cs_generate_variant:Nn \intarray_item:Nn { c }
+% \end{macrocode}
+% Beginning and ending a catcode table simply involves
+% some bookkeeping to store the current catcodes in a
+% dynamically generated variable.
+% \begin{macrocode}
\cs_new_protected:Npn \cctab_gset:Nn #1#2
{
\group_begin:
#2 \scan_stop:
- \int_step_inline:nn { 256 }
- {
- \intarray_gset:cnn { g_@@_ \int_use:N #1 _cctab } {##1}
- { \char_value_catcode:n { ##1 - 1 } }
- }
+ \@@_gset:N #1
\group_end:
}
}
@@ -404,21 +396,30 @@
% \begin{macro}{\@@_end_fast:}
% Select a catcode table within a group.
% \begin{macrocode}
-\cs_new_protected:Npn \cctab_select:N #1
+\sys_if_engine_luatex:TF
{
- \@@_chk_if_valid:NT #1
+ \cs_new_protected:Npn \cctab_select:N #1
+ {
+ \@@_chk_if_valid:NT #1
+ {
+ \@@_begin:N #1
+ \group_insert_after:N \@@_end_fast:
+ }
+ }
+ \cs_new_protected:Npn \@@_end_fast:
{
- \@@_begin:N #1
- \group_insert_after:N \@@_end_fast:
+ \int_gsub:Nn \g_@@_stack_int { 2 }
+ \seq_gpop:NN \g_@@_stack_seq \l_@@_tmp_tl
}
}
-\cs_generate_variant:Nn \cctab_select:N { c }
-\cs_new_protected:Npx \@@_end_fast:
{
- \int_gsub:Nn \exp_not:N \g_@@_stack_int { 2 }
- \sys_if_engine_luatex:T
- { \seq_gpop:NN \exp_not:N \g_@@_stack_seq \exp_not:N \l_@@_tmp_tl }
+ \cs_new_protected:Npn \cctab_select:N #1
+ {
+ \@@_chk_if_valid:NT #1
+ { \@@_select:N #1 }
+ }
}
+\cs_generate_variant:Nn \cctab_select:N { c }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -436,10 +437,10 @@
% \begin{macro}{\@@_chk_if_valid:N}
% Checks whether the argument is defined and whether it is a valid
% \meta{cctab~var}. In \LuaTeX{} the validity of the \meta{cctab~var}
-% is checked by the engine, which complains if the argument is not
-% a \cs{chardef}'ed constant. In other engines, check if the
-% underlying \cs[no-index]{g_@@_\meta{integer}_cctab}
-% \meta{intarray~var} exists.
+% is checked by the engine, which complains if the argument is not a
+% \cs{chardef}'ed constant. In other engines, check if the given
+% command is an intarray variable (the underlying definition is a copy
+% of the \texttt{cmr10} font).
% \begin{macrocode}
\sys_if_engine_luatex:TF
{
@@ -476,7 +477,9 @@
{
\cctab_if_exist:NTF #1
{
- \cs_if_exist:cTF { g_@@_ \int_use:N #1 _cctab }
+ \exp_args:Nf \str_if_in:nnTF
+ { \cs_meaning:N #1 }
+ { select~font~cmr10~at~ }
{ \prg_return_true: }
{
\__kernel_msg_error:nnx { kernel } { invalid-cctab }
More information about the latex3-commits
mailing list.