diff options
Diffstat (limited to 'macros/luatex/generic/minim/minim-alloc.tex')
-rw-r--r-- | macros/luatex/generic/minim/minim-alloc.tex | 184 |
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 + |