summaryrefslogtreecommitdiff
path: root/macros/luatex/optex/base/alloc.opm
diff options
context:
space:
mode:
Diffstat (limited to 'macros/luatex/optex/base/alloc.opm')
-rw-r--r--macros/luatex/optex/base/alloc.opm165
1 files changed, 165 insertions, 0 deletions
diff --git a/macros/luatex/optex/base/alloc.opm b/macros/luatex/optex/base/alloc.opm
new file mode 100644
index 0000000000..7e03ae77b7
--- /dev/null
+++ b/macros/luatex/optex/base/alloc.opm
@@ -0,0 +1,165 @@
+%% This is part of OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \newdimen {Allocators for registers <2020-01-23>} % loaded in format
+
+ \_doc -----------------------------
+ The limits are set first.
+ \_cod -----------------------------
+
+\_chardef\_maicount = 65535 % Max Allocation Index for counts registers in LuaTeX
+\_let\_maidimen = \_maicount
+\_let\_maiskip = \_maicount
+\_let\_maimuskip = \_maicount
+\_let\_maibox = \_maicount
+\_let\_maitoks = \_maicount
+\_chardef\_mairead = 15
+\_chardef\_maiwrite = 15
+\_chardef\_maifam = 255
+
+ \_doc -----------------------------
+ Each allocation macro needs its own counter.
+ \_cod -----------------------------
+
+\_countdef\_countalloc=10 \_countalloc=255
+\_countdef\_dimenalloc=11 \_dimenalloc=255
+\_countdef\_skipalloc=12 \_skipalloc=255
+\_countdef\_muskipalloc=13 \_muskipalloc=255
+\_countdef\_boxalloc=14 \_boxalloc=255
+\_countdef\_toksalloc=15 \_toksalloc=255
+\_countdef\_readalloc=16 \_readalloc=-1
+\_countdef\_writealloc=17 \_writealloc=-1
+\_countdef\_mathalloc=18 \_mathalloc=3
+
+ \_doc -----------------------------
+ The common allocation macro
+ \`\_allocator` `\<sequence> {<type>} \<primitive declarator>`
+ is defined. This idea was used in classical plain \TeX/ by
+ Donald Knuth too but the macro from plain \TeX/ seems to be
+ more complicated:).
+ \_cod -----------------------------
+
+\_def\_allocator #1#2#3{%
+ \_global\_advance\_cs{_#2alloc}by1
+ \_ifnum\_cs{_#2alloc}>\_cs{_mai#2}%
+ \_errmessage{No room for a new \_ea\_string\_csname #2\_endcsname}%
+ \_else
+ \_global#3#1=\_cs{_#2alloc}%
+ \_wlog{\_string#1=\_ea\_string\_csname #2\_endcsname\_the\_cs{_#2alloc}}%
+ \_fi
+}
+
+ \_doc -----------------------------
+ The allocation macros
+ \`\newcount`, \`\newdimen`, \`\newskip`, \`\newmuskip`, \`\newbox`,
+ \`\newtoks`, \`\newread`, \`\newwrite` and \`\newmath`
+ are defined here.
+ \_cod -----------------------------
+
+\_def\_newcount #1{\_allocator #1{count}\_countdef}
+\_def\_newdimen #1{\_allocator #1{dimen}\_dimendef}
+\_def\_newskip #1{\_allocator #1{skip}\_skipdef}
+\_def\_newmuskip #1{\_allocator #1{muskip}\_muskipdef}
+\_def\_newbox #1{\_allocator #1{box}\_chardef}
+\_def\_newtoks #1{\_allocator #1{toks}\_toksdef}
+\_def\_newread #1{\_allocator #1{read}\_chardef}
+\_def\_newwrite #1{\_allocator #1{write}\_chardef}
+\_def\_newmath #1{\_allocator #1{fam}\_chardef}
+
+\_public \newcount \newdimen \newskip \newmuskip \newbox \newtoks \newread \newwrite \newmath ;
+
+ \_doc -----------------------------
+ The \`\newinsert` macro is defined differently than others.
+ \_cod -----------------------------
+
+\_newcount\_insertalloc \_insertalloc=255
+\_chardef\_insertmin = 201
+
+\_def\_newinsert #1{%
+ \_advance\_insertalloc by-1
+ \_ifnum\_insertalloc <\_insertmin
+ \_errmessage {No room for a new \_string\insert}%
+ \_else
+ \_global\_chardef#1=\_insertalloc
+ \_wlog {\_string#1=\_string\_insert\_the\_insertalloc}%
+ \_fi
+}
+\_public \newinsert ;
+
+ \_doc -----------------------------
+ Other allocation macros \`\newattribute` and \`\newcatodetable`
+ have their counter allocated by the `\newcount` macro.
+ \_cod -----------------------------
+
+\_newcount \_attributealloc \_attributealloc=0
+\_chardef\_maiattribute=\_maicount
+\_def\_newattribute #1{\_allocator #1{attribute}\_attributedef}
+
+\_newcount \_catcodetablealloc \_catcodetablealloc=10
+\_chardef\_maicatcodetable=32767
+\_def\_newcatcodetable #1{\_allocator #1{catcodetable}\_chardef}
+
+\_public \newattribute \newcatcodetable ;
+
+ \_doc -----------------------------
+ We declare public and private versions of `\tmpnum` and `\tmpdim`
+ registers separately. They are independent registers.
+ \_cod -----------------------------
+
+\_newcount \tmpnum \_newcount \_tmpnum
+\_newdimen \tmpdim \_newdimen \_tmpdim
+
+ \_doc -----------------------------
+ A few registers are initialized like in plain\TeX/. Note that `\z@` and `\z@skip` from
+ plain\TeX/ is `\zo` and `\zoskip` because we absolutely
+ don't support the `@` category dance.
+ Note that `\p@` is not defined because we can write 1pt which is more
+ legible.
+ \_cod -----------------------------
+
+\_newdimen\_maxdimen \_maxdimen=16383.99999pt % the largest legal <dimen>
+\_newskip\_hideskip \_hideskip=-1000pt plus 1fill % negative but can grow
+\_newskip\_centering \_centering=0pt plus 1000pt minus 1000pt
+\_newskip\_zoskip \_zoskip=0pt plus0pt minus0pt
+\_newbox\_voidbox % permanently void box register
+
+\_public \maxdimen \hideskip \centering \zoskip \voidbox ;
+
+\_endcode %---------------------------------------------------
+
+Like plain\TeX, the allocators `\newcount`, `\newwrite`, etc. are defined.
+The registers are allocated from 256 to the `\_mai<type>` which is 65535 in
+\LuaTeX/.
+
+Unlike in Plain\TeX/, the mentioned allocators are not `\outer`.
+
+User can use `\dimen0` to `\dimen200` and similarly for `\skip`,
+`\muskip`, `\box` and `\toks` directly. User can use
+`\count20` to `\count200` directly too. This is the same
+philosophy like in old plain\TeX/, but the range of directly used registers
+is wider.
+
+Inserts are allocated form 254 to 201 using `\newinsert`.
+
+You can define your own allocation concept (for example for allocation of
+arrays) from top of registers array. The example shows a definition of
+the array-like declarator of counters.
+
+\nobreak
+\begtt
+\newcount \_maicount % redefine maximal allocation index as variable
+\_maicount = \maicount % first value is top of the array
+
+\def\newcountarray #1[#2]{% \newcountarray \foo[100]
+ \advance\_maicount by -#2\relax
+ \ifnum \_countalloc > \_maicount
+ \errmessage{No room for a new array of \string\count}%
+ \else
+ \chardef#1=\_maicount
+ \fi
+}
+\def\usecount #1[#2]{% \usecount \foo[2]
+ \count\numexpr#1+#2\relax
+}
+\endtt
+
+