summaryrefslogtreecommitdiff
path: root/macros/luatex/generic/minim/minim-alloc.tex
diff options
context:
space:
mode:
Diffstat (limited to 'macros/luatex/generic/minim/minim-alloc.tex')
-rw-r--r--macros/luatex/generic/minim/minim-alloc.tex184
1 files changed, 184 insertions, 0 deletions
diff --git a/macros/luatex/generic/minim/minim-alloc.tex b/macros/luatex/generic/minim/minim-alloc.tex
new file mode 100644
index 0000000000..66f08c9045
--- /dev/null
+++ b/macros/luatex/generic/minim/minim-alloc.tex
@@ -0,0 +1,184 @@
+
+\ifdefined \minimloaded
+ \message{(skipped)}
+ \expandafter\endinput\fi
+\chardef\minimloaded=\catcode`\:
+\catcode`\:=11
+
+% 1 settings
+
+\suppressoutererror = 1
+\frenchspacing
+
+% 1 programming macros
+
+\newbox\voidbox \setbox0=\box\voidbox
+
+\long\def\ignore#1{}
+\long\def\unbrace#1{#1}
+\long\def\firstoftwo#1#2{#1}
+\long\def\secondoftwo#1#2{#2}
+
+% \spacechar is equivalent to a space character
+{\let\@\relax \global\futurelet\spacechar\@ \relax}
+
+% \nextif c {yes} {no}
+\protected\def\nextif{\nextif:\if}
+% \nextifx c {yes} {no}
+\protected\def\nextifx{\nextif:\ifx}
+% \nextifcat c {yes} {no}
+\protected\def\nextifcat{\nextif:\ifcat}
+
+\long\def\nextif:#1#2#3#4{\begingroup % \if c {yes} {no}
+ \def\nextif:test{#1\nextif:token#2\relax
+ \expandafter\firstoftwo\else
+ \expandafter\secondoftwo\fi
+ {\endgroup#3}{\endgroup#4}}%
+ \futurelet\nextif:token\nextif:test}
+
+% \withoptions [default] {code}
+\protected\def\withoptions[#1]#2{\nextifx[{#2}{#2[#1]}} %]
+
+% \splitcommalist {code} {list}
+\def\splitcommalist#1#2{\splitcommalist:parse{#1}#2,\splitcommalist:end,}
+\def\splitcommalist:parse#1#2,{% command partial-list,
+ \ifx\splitcommalist:end#2\empty\else % test for end-of-list
+ \expandafter\splitcommalist:item
+ \expandafter{\scantextokens{#2}}{#1}\fi} % remove spaces
+\def\splitcommalist:item#1#2\fi{\fi
+ \ifx\splitcommalist:end#1\splitcommalist:end\else#2{#1}\fi
+ \splitcommalist:parse{#2}}
+\protected\def\splitcommalist:end{\splitcommalist:end}
+
+% \decompressedpdf
+\def\decompressedpdf{%
+ \pdfvariable compresslevel = 0
+ \pdfvariable objcompresslevel = 0
+ \pdfvariable recompress = 1
+}
+
+% \unset
+\newcount\unset \unset = -"7FFFFFFF
+
+% 1 ltluatex compatibility
+
+% repair ltluatex, which, without apparent reason, resets all allocation
+% counters, even if they already exist
+\def\minim:ltltx:file{ltluatex.tex}
+\let\ProvidesFile:saved=\ProvidesFile
+\def\ProvidesFile#1#2[#3]{%
+ \ifdefined\ProvidesFile:saved \ProvidesFile:saved{#1}#2[#3]\fi
+ \def\minim:ltltx:arg{#1}%
+ \ifx\minim:ltltx:file\minim:ltltx:arg
+ \let\ProvidesFile=\ProvidesFile:saved
+ \let\endinput:saved=\endinput
+ \protected\edef\endinput{%
+ \minim:ltltx:fix{e@alloc@attribute@count}%
+ \minim:ltltx:fix{e@alloc@whatsit@count}%
+ \minim:ltltx:fix{e@alloc@bytecode@count}%
+ \minim:ltltx:fix{e@alloc@luafunction@count}%
+ \minim:ltltx:fix{e@alloc@luachunk@count}%
+ \minim:ltltx:fix{e@alloc@ccodetable@count}%
+ % also patch in remembering allocations to lua
+ \alloc:patch \noexpand\attribute
+ \alloc:patch \noexpand\whatsit
+ \alloc:patch \noexpand\luabytecode
+ \alloc:patch \noexpand\luachunkname
+ \alloc:patch \noexpand\catcodetable
+ \alloc:patch \noexpand\userrule
+ % restore register allocation functions
+ \directlua{ local C = require('minim-callbacks')
+ callback.register, callback.find, callback.list
+ = C.register, C.find, C.list }%
+ \let\noexpand\endinput=\noexpand\endinput:saved
+ \noexpand\endinput}\fi}
+\def\minim:ltltx:fix#1{%
+ \ifnum0<\the\csname#1\endcsname
+ \wlog{Restoring \csname#1\endcsname to previous value \the\csname#1\endcsname}%
+ \expandafter\noexpand\csname#1\endcsname =\the\csname#1\endcsname\relax\fi}
+\protected\def\alloc:patch#1{%
+ \expandafter\expandafter\expandafter\let
+ \expandafter\expandafter\csname\csstring#1:ltluatex:new\endcsname
+ \csname new\csstring#1\endcsname
+ \expandafter\edef\csname new\csstring#1\endcsname##1{%
+ \noexpand\minim:rememberalloc{\csstring#1}{\noexpand\csstring##1}%
+ \expandafter\noexpand\csname\csstring#1:ltluatex:new\endcsname{##1}}}
+
+% 1 allocation
+
+% use global allocation (see etex.src)
+\let\newcount = \globcount
+\let\newdimen = \globdimen
+\let\newskip = \globskip
+\let\newmuskip = \globmuskip
+\let\newbox = \globbox
+\let\newtoks = \globtoks
+\let\newmarks = \globmarks
+
+% new allocation macros
+
+\def\alloc:makenew#1#2#3{%
+ \unless\ifcsname#3\endcsname
+ \expandafter\newcount \csname#3\endcsname
+ \csname#3\endcsname 0\fi
+ \ifcsname new\csstring#1\endcsname
+ \alloc:patch#1\else
+ \expandafter\edef\csname new\csstring#1\endcsname{%
+ \noexpand\minim:alloc\noexpand#1\noexpand#2%
+ \expandafter\noexpand\csname#3\endcsname}\fi}
+
+\def\minim:alloc#1#2#3#4{% \register \chardef \alloccount \name
+ \global\advance#31%
+ \allocationnumber#3%
+ \global#2#4\allocationnumber
+ \wlog{\string#4=\string#1\the\allocationnumber}%
+ % minim:rememberalloc will be defined from lua side
+ \minim:rememberalloc{\csstring#1}{\csstring#4}}
+
+% all names and counters below are identical to those from ltluatex
+% note: we cannot use \newluafunction, or ltluatex will not load
+\alloc:makenew \function \chardef {e@alloc@luafunction@count}
+\alloc:makenew \attribute \attributedef {e@alloc@attribute@count}
+\alloc:makenew \whatsit \chardef {e@alloc@whatsit@count}
+\alloc:makenew \luabytecode \chardef {e@alloc@bytecode@count}
+\alloc:makenew \luachunkname \chardef:chunk {e@alloc@luachunk@count}
+\alloc:makenew \catcodetable \catcode:chardef {e@alloc@ccodetable@count}
+\alloc:makenew \userrule \chardef {e@alloc@rule@count}
+
+% initialise new catcode tables
+\def\catcode:chardef#1#2{\chardef#1#2\initcatcodetable#2}
+\csname e@alloc@ccodetable@count\endcsname = 4 % because ltluatex allocates 4...
+
+% set initial chunk name value
+\def\chardef:chunk#1#2{\chardef#1#2\directlua{lua.name[\the#2]='\csstring#1'}}
+
+% \setluachunkname
+\protected\def\setluachunkname#1#2{\newluachunkname#1%
+ \directlua{lua.name[\the#1]='\luaescapestring{#2}'}}
+
+% patch in remembering box allocations
+\def\minim:boxchardef#1{%
+ \minim:rememberalloc{box}{\csstring#1}%
+ \mathchardef#1}
+\edef\newbox{%
+ \expandafter\noexpand\csname et@xglob\endcsname
+ 4\box\noexpand\minim:boxchardef}
+
+% undefine our helper functions
+\let\alloc:makenew=\undefined
+
+% 1 format file compatibility
+
+% all other work is done at the lua end
+\directlua { require ('minim-alloc') }
+\directlua { require ('minim-callbacks') }
+
+% restore lua modules (the macro will be defined from the lua end)
+\toksapp\everyjob{\minim:restoremodules
+ \message{... all done.}}
+
+% 
+
+\catcode`\:=\minimloaded
+\endinput
+