Last active
December 28, 2015 16:19
-
-
Save zr-tex8r/7527995 to your computer and use it in GitHub Desktop.
LaTeX: to run Brainfuck programs on LaTeX document
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
% bxbluf.sty | |
%% package declaration | |
\NeedsTeXFormat{LaTeX2e} | |
\ProvidesPackage{bxbluf}[2013/11/11 v0.2] | |
%% preparations | |
\def\bxbf@pkgname{bxbluf} | |
\def\bxbf@error{\PackageError\bxbf@pkgname} | |
\def\bxbf@warn{\PackageWarningNoLine\bxbf@pkgname} | |
\def\bxbf@err@umbgr{% | |
\bxbf@error{Unmatched [ found}\@ehc | |
} | |
\def\bxbf@err@umegr{% | |
\bxbf@error{Unmatched ] found}\@ehc | |
} | |
\def\bxbf@warn@hichr{% | |
\bxbf@warn{Non 8-bit character found}% | |
} | |
\def\bxbf@warn@ineof{% | |
\bxbf@warn{End-of-input reached}% | |
} | |
% | |
\newif\ifbxbf@inloop | |
\newif\ifbxbf@g@error | |
\newif\ifbxbf@optok | |
\providecommand*\bxDebug[1]{} | |
%--------------------------------------- base | |
%% variables | |
\newcount\bxbf@count | |
\let\bxbf@prcode\@empty | |
%% \bxbf@op@list : operator list | |
\def\bxbf@op@list{% | |
\do\bxbf@AP\do\bxbf@AV\do\bxbf@ID\do\bxbf@OD\do\bxbf@LP | |
\do\bxbf@RP\do\bxbf@RV\do\bxbf@AX\do\bxbf@RX\do\bxbf@SF | |
} | |
%% \bxbf@op@frozen | |
\let\bxbf@op@frozen\relax | |
%% \bxbf@op@noop | |
\def\bxbf@op@noop#1{} | |
%% \bxbf@switch@all@op\CS | |
\def\bxbf@switch@all@op#1{% | |
\let\bxbf@tmpa#1% | |
\let\do\bxbf@switch@all@op@do \bxbf@op@list | |
} | |
\def\bxbf@switch@all@op@do#1{% | |
\let#1\bxbf@tmpa | |
} | |
%% \bxbf@modulo{<num>} | |
\def\bxbf@modulo#1{% | |
\@tempcnta=#1\relax \bxbf@count\@tempcnta | |
\divide\@tempcnta\bxbf@rbase \multiply\@tempcnta\bxbf@rbase | |
\advance\bxbf@count-\@tempcnta | |
} | |
%% \bxbf@show | |
% for debug | |
\def\bxbf@show{% | |
\bxbf@switch@all@op\bxbf@op@frozen | |
\bxDebug{prog:\bxbf@prcode}% | |
} | |
%--------------------------------------- \scantokens emulation | |
\ifx\scantokens\@undefined | |
% when \scantokens is unavailable | |
\newwrite\bxbf@tempfile | |
\def\bxbf@tempfilename{\bxbf@pkgname.out} | |
\def\bxbf@scantokens#1{% | |
\begingroup | |
\toks@={#1}% | |
\immediate\openout\bxbf@tempfile=\bxbf@tempfilename\relax | |
\immediate\write\bxbf@tempfile{\the\toks@}% | |
\immediate\closeout\bxbf@tempfile | |
\endgroup | |
\input{\bxbf@tempfilename}% | |
}% | |
\else | |
% uses \scantokens if available | |
\let\bxbf@scantokens\scantokens | |
\fi | |
%--------------------------------------- LaTeX interface | |
%% variables | |
\newcount\bxbf@proc@maxid | |
\let\bxbf@decl@mode\relax | |
\let\bxbf@out@verbatim\relax | |
\let\bxbf@eofval=* | |
%%<*> \execbf[*] / \execbfwithinput[*] / \procbf[*] | |
\DeclareRobustCommand*\execbf{% | |
\@ifstar{\bxbf@procbf{n}{1}}{\bxbf@procbf{n}{0}}% | |
} | |
\DeclareRobustCommand*\execbfwithinput{% | |
\@ifstar{\bxbf@procbf{i}{1}}{\bxbf@procbf{i}{0}}% | |
} | |
\DeclareRobustCommand*\procbf{% | |
\@ifstar{\bxbf@procbf{p}{1}}{\bxbf@procbf{p}{0}}% | |
} | |
\def\bxbf@procbf#1#2{% | |
\let\bxbf@decl@mode=#1\relax | |
\chardef\bxbf@out@verbatim=#2\relax | |
\def\bxbf@proc@id{0}% | |
\if i\bxbf@decl@mode | |
\let\bxbf@tmpa\bxbf@procbf@winput | |
\else\if p\bxbf@decl@mode | |
\advance\bxbf@proc@maxid\@ne | |
\edef\bxbf@proc@id{\the\bxbf@proc@maxid}% | |
\let\bxbf@tmpa\bxbf@procbf@wproc | |
\else | |
\let\bxbf@input\@empty | |
\let\bxbf@tmpa\bxbf@procbf@a | |
\fi\fi | |
\bxbf@tmpa | |
} | |
\def\bxbf@procbf@winput#1{% <input> | |
\def\bxbf@input{#1}% | |
\bxbf@procbf@a | |
} | |
\def\bxbf@procbf@wproc#1{% \ProcCS | |
\def\bxbf@proc@cs{\noexpand#1}% | |
\bxbf@procbf@a | |
} | |
\def\bxbf@procbf@a#1{% <program> | |
\begingroup | |
\global\expandafter\chardef\csname bxbf@OutVerb/\bxbf@proc@id\endcsname | |
=\bxbf@out@verbatim | |
\bxbf@parse{#1}% | |
\bxbf@optimize | |
\global\expandafter\let\csname bxbf@PrArray/\bxbf@proc@id\endcsname | |
=\bxbf@prcode | |
\endgroup | |
\ifnum\bxbf@proc@id>0 | |
\edef\bxbf@tmpa{% | |
\gdef\bxbf@proc@cs{\noexpand\bxbf@invoke@proc{\bxbf@proc@id}}% | |
}% | |
\bxbf@tmpa | |
\else % immediate execution | |
\bxbf@invoke@proc{\bxbf@proc@id}{\bxbf@input}% | |
\fi | |
} | |
%% \bxbf@invoke@proc{<id>}{<input>} | |
\def\bxbf@invoke@proc#1#2{% | |
\begingroup | |
\bxbf@stringify\bxbf@input{#2}% | |
\expandafter\let\expandafter\bxbf@prcode | |
\csname bxbf@PrArray/#1\endcsname | |
\bxbf@execute | |
\xdef\bxbf@g@tmpa{\noexpand\bxbf@process@str | |
{\csname bxbf@OutVerb/#1\endcsname}{\bxbf@output}}% | |
\endgroup | |
\bxbf@g@tmpa | |
} | |
\def\bxbf@process@str#1#2{% | |
\ifnum#1>\z@ | |
\begingroup | |
\let\bxbfLF\newline \let\bxbfSP\ % | |
#2\relax | |
\endgroup | |
\else | |
\begingroup | |
\def\bxbfLF{^^J}\def\bxbfSP{ }% | |
\xdef\bxbf@g@tmpa{\noexpand\bxbf@scantokens{#2}}% | |
\endgroup | |
\bxbf@g@tmpa | |
\fi | |
} | |
%% \bxbf@stringify\CS{<text>} | |
\def\bxbf@stringify#1#2{% | |
\edef\bxbf@tmpa{#2}% | |
\expandafter\bxbf@stringify@a\meaning\bxbf@tmpa\bxbf@end#1% | |
} | |
\def\bxbf@stringify@a#1->#2\bxbf@end#3{% | |
\def#3{#2}% | |
} | |
%%<*> \bfeofvalue{<val>} | |
\newcommand*\bfeofvalue[1]{% | |
\def\bxbf@tmpa{#1}% | |
\ifx\bxbf@tmpa\bxbf@@star \let\bxbf@eofval=*\relax | |
\else\ifx\bxbf@tmpa\bxbf@@bang \let\bxbf@eofval=!\relax | |
\else \afterassignment\bxbf@eofvalue@a\bxbf@count=\bxbf@tmpa\bxbf@tn | |
\fi\fi | |
} | |
\def\bxbf@eofvalue@a#1\bxbf@tn{% | |
\def\bxbf@tmpa{#1}% | |
\ifx\bxbf@tmpa\@empty | |
\bxbf@modulo\bxbf@count | |
\ifnum\bxbf@count<\z@ \advance\bxbf@count\bxbf@rbase \fi | |
\chardef\bxbf@eofval\bxbf@count | |
\else \bxbf@count=\bxbf@tn | |
\fi | |
} | |
\let\bxbf@tn\relax | |
\def\bxbf@@star{*} | |
\def\bxbf@@bang{!} | |
%--------------------------------------- parse | |
%% variables | |
\let\bxbf@block\@empty | |
\let\bxbf@prev@op\@empty | |
\let\bxbf@source@rest\@empty | |
\mathchardef\bxbf@rbase=256 | |
\mathchardef\bxbf@mcmax="7FFF | |
%% \bxbf@chk | |
\def\bxbf@chk{\space} | |
%% \bxbf@parse | |
\long\def\bxbf@parse#1{% | |
\bxbf@switch@all@op\bxbf@op@frozen | |
\bxbf@inloopfalse | |
\global\bxbf@g@errorfalse | |
\edef\bxbf@tmpa{% | |
\noexpand\bxbf@parse@block{#1\noexpand\bxbf@chk}}% | |
\bxbf@tmpa | |
\ifbxbf@g@error \let\bxbf@prcode\@empty | |
\else \let\bxbf@prcode\bxbf@block | |
\fi | |
} | |
%% \bxbf@parse@block | |
\long\def\bxbf@parse@block#1{% | |
\let\bxbf@prev@op\@empty \bxbf@count\z@ | |
\let\bxbf@block\@empty | |
\bxbf@parse@loop@a#1\bxbf@end | |
} | |
%% \bxbf@parse@loop | |
\def\bxbf@parse@loop{% | |
\futurelet\bxbf@tmpa\bxbf@parse@loop@a | |
} | |
\def\bxbf@parse@loop@a{% | |
\ifx\bxbf@tmpa\bgroup \expandafter\bxbf@parse@loop@b | |
\else \expandafter\bxbf@parse@loop@ab | |
\fi | |
} | |
\def\bxbf@parse@loop@ab{% | |
\ifx\bxbf@tmpa\@sptoken \expandafter\bxbf@parse@loop@ac | |
\else \expandafter\bxbf@parse@loop@c | |
\fi | |
} | |
\expandafter\def\expandafter\bxbf@parse@loop@ac\space{% | |
\bxbf@parse@loop | |
} | |
\long\def\bxbf@parse@loop@b#1{% | |
\bxbf@parse@loop#1% | |
} | |
\long\def\bxbf@parse@loop@c#1{% | |
\csname bxbf@p@h/\string#1\endcsname | |
\bxbf@parse@loop | |
} | |
%% \bxbf@aprse@flush | |
\def\bxbf@parse@flush{% | |
\ifnum\bxbf@count=\z@\else | |
\edef\bxbf@block{\bxbf@block\bxbf@prev@op{\the\bxbf@count}}% | |
\fi | |
} | |
%% \bxbf@aprse@nonaccum | |
\def\bxbf@parse@nonaccum#1{% | |
\bxbf@parse@flush | |
\def\bxbf@prev@op{#1}\bxbf@count\@ne | |
} | |
%% \bxbf@aprse@accum | |
\def\bxbf@parse@accum#1#2{% | |
\def\bxbf@tmpa{#1}% | |
\ifx\bxbf@prev@op\bxbf@tmpa | |
\advance\bxbf@count#2% | |
\else | |
\bxbf@parse@flush | |
\bxbf@count#2\def\bxbf@prev@op{#1} | |
\fi | |
} | |
%% \bxbf@aprse@new@block | |
\long\def\bxbf@parse@new@block#1#2\bxbf@end{% #1 gobbled | |
\bxbf@parse@flush | |
%\bxDebug{new:\bxbf@block}% | |
\begingroup | |
\bxbf@inlooptrue | |
\bxbf@parse@block{#2}% | |
\global\let\bxbf@g@tmpa\bxbf@block | |
\global\let\bxbf@g@tmpb\bxbf@source@rest | |
\endgroup | |
\let\bxbf@source@rest\bxbf@g@tmpb | |
\edef\bxbf@block{\bxbf@block\bxbf@LP{\bxbf@g@tmpa}}% | |
%\bxDebug{back:\bxbf@block}% | |
\let\bxbf@prev@op\@empty \bxbf@count\z@ | |
\expandafter\bxbf@parse@loop\bxbf@source@rest\bxbf@end | |
} | |
%% \bxbf@aprse@end@block | |
\long\def\bxbf@parse@end@block#1#2\bxbf@end{% #1 gobbled | |
\bxbf@parse@flush | |
\ifbxbf@inloop | |
\def\bxbf@source@rest{#2}% | |
\else | |
\bxbf@err@umegr | |
\global\bxbf@g@errortrue | |
\let\bxbf@source@rest\@empty | |
\fi | |
} | |
%% \bxbf@aprse@finale | |
\long\def\bxbf@parse@finale#1#2\bxbf@end{% #1 gobbled | |
\bxbf@parse@flush | |
\ifbxbf@inloop | |
\bxbf@err@umbgr | |
\global\bxbf@g@errortrue | |
\def\bxbf@source@rest{\bxbf@chk}% | |
\fi | |
} | |
%% \bxbf@decl@handler{<token>}{<body>} | |
\def\bxbf@decl@handler#1{% | |
\expandafter\def\csname bxbf@p@h/#1\endcsname | |
} | |
\bxbf@decl@handler{+}{\bxbf@parse@accum\bxbf@AV\@ne} | |
\bxbf@decl@handler{-}{\bxbf@parse@accum\bxbf@AV\m@ne} | |
\bxbf@decl@handler{>}{\bxbf@parse@accum\bxbf@AP\@ne} | |
\bxbf@decl@handler{<}{\bxbf@parse@accum\bxbf@AP\m@ne} | |
\bxbf@decl@handler{,}{\bxbf@parse@nonaccum\bxbf@ID} | |
\bxbf@decl@handler{.}{\bxbf@parse@nonaccum\bxbf@OD} | |
\bxbf@decl@handler{[}{\bxbf@parse@new@block} | |
\bxbf@decl@handler{]}{\bxbf@parse@end@block} | |
\bxbf@decl@handler{\string\bxbf@chk}{\bxbf@parse@finale} | |
%--------------------------------------- optimize | |
%% variables | |
\let\bxbf@g@block\@empty | |
%% \bxbf@g@addto@block | |
\def\bxbf@g@addto@block{\g@addto@macro\bxbf@g@block} | |
%% \bxbf@opt@addop | |
\def\bxbf@opt@addop#1#2{% | |
\bxbf@g@addto@block{#1#2}% | |
} | |
%% \bxbf@intern{<num>}\cont | |
\edef\bxbf@H{\expandafter\@gobble\string\#} | |
\def\bxbf@intern#1{% | |
\expandafter\bxbf@intern@a\csname\bxbf@H\number#1% | |
\expandafter\endcsname\number#1\relax | |
} | |
\def\bxbf@intern@a#1#2\relax#3{% | |
\ifx#1\relax | |
\ifnum#2>\bxbf@mcmax \gdef#1{#2 }% | |
\else \global\mathchardef#1=#2\relax | |
\fi | |
\fi | |
#3#1% | |
} | |
%% \bxbf@intern@red{<num>}\cont | |
\def\bxbf@intern@red#1{% | |
\bxbf@modulo{#1}% | |
\bxbf@intern\bxbf@count | |
} | |
%% \bxbf@optimize | |
\def\bxbf@optimize{% | |
\bxbf@switch@opt | |
\global\let\bxbf@g@block\@empty | |
\bxbf@prcode | |
\let\bxbf@prcode\bxbf@g@block | |
} | |
%% \bxbf@switch@opt | |
\def\bxbf@switch@opt{% | |
\let\bxbf@AP\bxbf@opt@AP\let\bxbf@AV\bxbf@opt@AV | |
\let\bxbf@ID\bxbf@opt@ID\let\bxbf@OD\bxbf@opt@OD | |
\let\bxbf@LP\bxbf@opt@LP | |
\let\bxbf@RP\bxbf@op@error\let\bxbf@RV\bxbf@op@error | |
\let\bxbf@AX\bxbf@opt@AX\let\bxbf@RX\bxbf@op@error | |
\let\bxbf@SF\bxbf@op@error | |
} | |
%% \bxbf@opt@ID / \bxbf@opt@OD | |
\def\bxbf@tmpa#1{% | |
\def\bxbf@opt@ID##1{\bxbf@g@addto@block{\bxbf@ID#1}}% | |
\def\bxbf@opt@OD##1{\bxbf@g@addto@block{\bxbf@OD#1}}% | |
} | |
\bxbf@intern{1}\bxbf@tmpa | |
%% \bxbf@opt@AP | |
\def\bxbf@opt@AP#1{% | |
\ifnum#1<\z@ \bxbf@intern{-#1}{\bxbf@opt@addop\bxbf@RP}% | |
\else \bxbf@intern{+#1}{\bxbf@opt@addop\bxbf@AP}% | |
\fi | |
} | |
%% \bxbf@opt@AV | |
\def\bxbf@opt@AV#1{% | |
\ifnum#1<\z@ \bxbf@intern@red{-#1}{\bxbf@opt@addop\bxbf@RV}% | |
\else \bxbf@intern@red{+#1}{\bxbf@opt@addop\bxbf@AV}% | |
\fi | |
} | |
%% \bxbf@opt@AX | |
\def\bxbf@opt@AX#1{% | |
\ifnum#1<\z@ \bxbf@intern@red{-#1}{\bxbf@opt@addop\bxbf@RX}% | |
\else \bxbf@intern@red{+#1}{\bxbf@opt@addop\bxbf@AX}% | |
\fi | |
} | |
%% \bxbf@opt@check | |
\def\bxbf@opt@check#1{% | |
\bxbf@optokfalse | |
\begingroup | |
\bxbf@switch@all@op\bxbf@opt@check@ng | |
\let\bxbf@AV\bxbf@opt@check@AV | |
\let\bxbf@AP\bxbf@opt@check@AP | |
\bxbf@count\z@ \@tempcntb\z@ | |
#1\bxbf@opt@check@fin | |
\endgroup | |
} | |
\def\bxbf@opt@check@ng#1\bxbf@opt@check@fin{} | |
\def\bxbf@opt@check@AP#1{% | |
\advance\bxbf@count#1\relax | |
} | |
\def\bxbf@opt@check@AV#1{% | |
\ifnum\bxbf@count=\z@ | |
\advance\@tempcntb#1\relax | |
\fi | |
} | |
%% \bxbf@opt@check@fin | |
\def\bxbf@opt@check@fin{% | |
\ifnum\bxbf@count=\z@ \ifnum\@tempcntb=\m@ne | |
\aftergroup\bxbf@optoktrue | |
\fi\fi | |
} | |
%% \bxbf@opt@LP | |
\def\bxbf@opt@LP#1{% | |
\begingroup | |
\bxbf@opt@check{#1}% | |
\let\bxbf@save@block\bxbf@g@block | |
\global\let\bxbf@g@block\@empty | |
\ifbxbf@optok | |
\let\bxbf@AV\bxbf@AX | |
\fi | |
#1% | |
\expandafter\bxbf@opt@LP@a\expandafter{\bxbf@g@block}% | |
\endgroup | |
} | |
\def\bxbf@opt@LP@a#1{% | |
\let\bxbf@g@block\bxbf@save@block | |
\ifbxbf@optok \g@addto@macro\bxbf@g@block{\bxbf@SF{#1}}% | |
\else \g@addto@macro\bxbf@g@block{\bxbf@LP{#1}}% | |
\fi | |
} | |
%% \bxbf@opt@add\CS{<arg>} | |
\def\bxbf@opt@add#1#2{% | |
\g@addto@macro\bxbf@g@block{#1{#2}}% | |
} | |
%--------------------------------------- execute | |
\edef\bxbf@restorecc{\catcode127=\the\catcode127\relax} | |
\catcode127=12 | |
%% variables | |
\newcount\bxbf@dptr | |
\let\bxbf@str@in\@empty | |
\let\bxbf@str@out\@empty | |
\chardef\bxbf@zero=0 | |
\chardef\bxbf@lctr=0 | |
%% \bxbf@execute | |
\def\bxbf@execute{% | |
%\bxbf@show | |
\bxbf@switch@exec | |
\global\let\bxbf@str@in\bxbf@input | |
\global\let\bxbf@str@out\@empty | |
\global\bxbf@g@errorfalse | |
\bxbf@dptr\z@ | |
\bxbf@prcode\bxbf@exec@fin | |
\ifbxbf@g@error \let\bxbf@output\@empty | |
\else \let\bxbf@output\bxbf@str@out | |
\fi | |
} | |
\let\bxbf@exec@fin\relax | |
%% \bxbf@exec@halt | |
% NB. This is not counted as error. | |
\def\bxbf@exec@halt#1\bxbf@exec@fin{} | |
%% \bxbf@swtich@exec | |
\def\bxbf@switch@exec{% | |
\let\bxbf@AP\bxbf@exec@AP\let\bxbf@AV\bxbf@exec@AV | |
\let\bxbf@ID\bxbf@exec@ID\let\bxbf@OD\bxbf@exec@OD | |
\let\bxbf@LP\bxbf@exec@LP | |
\let\bxbf@RP\bxbf@exec@RP\let\bxbf@RV\bxbf@exec@RV | |
\let\bxbf@AX\bxbf@exec@AX\let\bxbf@RX\bxbf@exec@RX | |
\let\bxbf@SF\bxbf@exec@SF | |
} | |
%% bxbf@exec@AP | |
\def\bxbf@exec@AP#1{% | |
\advance\bxbf@dptr#1% | |
%\bxDebug{AP:\number#1;\number\bxbf@dptr}% | |
} | |
%% bxbf@exec@RP | |
\def\bxbf@exec@RP#1{% | |
\advance\bxbf@dptr-#1% | |
%\bxDebug{RP:\number#1;\number\bxbf@dptr}% | |
} | |
%% bxbf@exec@AV | |
\def\bxbf@exec@AV{% | |
\expandafter\bxbf@exec@AV@a\csname ^^?\the\bxbf@dptr\endcsname} | |
\def\bxbf@exec@AV@a#1#2{% | |
\ifx#1\relax \chardef#1#2% | |
\else | |
\bxbf@count#1\advance\bxbf@count#2% | |
\ifnum\bxbf@count<\bxbf@rbase\else \advance\bxbf@count-\bxbf@rbase \fi | |
\chardef#1\bxbf@count | |
\fi | |
%\bxDebug{AV:#1:\the#2;\the#1}% | |
} | |
%% bxbf@exec@RV | |
\def\bxbf@exec@RV{% | |
\expandafter\bxbf@exec@RV@a\csname ^^?\the\bxbf@dptr\endcsname} | |
\def\bxbf@exec@RV@a#1#2{% | |
\ifx#1\relax \chardef#1\bxbf@zero \fi | |
\bxbf@count#1\advance\bxbf@count-#2% | |
\ifnum\bxbf@count<\z@ \advance\bxbf@count\bxbf@rbase \fi | |
\chardef#1\bxbf@count | |
%\bxDebug{RV:#1:\the#2;\the#1}% | |
} | |
%% bxbf@exec@ID | |
\def\bxbf@exec@ID{% | |
\expandafter\bxbf@exec@ID@a\csname ^^?\the\bxbf@dptr\endcsname} | |
\def\bxbf@exec@ID@a#1#2{% | |
\ifx#1\relax \chardef#1\bxbf@zero \fi | |
\bxbf@count#1% | |
\bxbf@get@char | |
\ifnum\bxbf@count<\z@ \expandafter\bxbf@exec@halt \fi | |
\chardef#1\bxbf@count | |
%\bxDebug{ID:#1;\the#1}% | |
} | |
%% bxbf@exec@OD | |
\def\bxbf@exec@OD{% | |
\expandafter\bxbf@exec@OD@a\csname ^^?\the\bxbf@dptr\endcsname} | |
\def\bxbf@exec@OD@a#1#2{% | |
\ifx#1\relax \chardef#1\bxbf@zero \fi | |
\bxbf@count#1% | |
\bxbf@put@char | |
%\bxDebug{OD:#1;\the#1}% | |
} | |
%% bxbf@exec@OD | |
\def\bxbf@exec@LP{% | |
\expandafter\bxbf@exec@LP@a\csname ^^?\the\bxbf@dptr\endcsname} | |
\def\bxbf@exec@LP@a#1{% | |
\ifx#1\relax \chardef#1\bxbf@zero \fi | |
%\bxDebug{LP:#1;\the#1}% | |
\ifnum#1=\z@ \expandafter\@gobble | |
\else \expandafter\bxbf@exec@LP@b | |
\fi | |
} | |
\def\bxbf@exec@LP@b#1{% | |
#1\bxbf@exec@LP{#1}% | |
} | |
%% bxbf@exec@SF | |
\def\bxbf@exec@SF{% | |
\expandafter\bxbf@exec@SF@a\csname ^^?\the\bxbf@dptr\endcsname} | |
\def\bxbf@exec@SF@a#1#2{% | |
\ifx#1\relax \chardef#1\bxbf@zero \fi | |
\chardef\bxbf@lctr#1% | |
#2 | |
} | |
%% bxbf@exec@AX | |
\def\bxbf@exec@AX{% | |
\expandafter\bxbf@exec@AX@a\csname ^^?\the\bxbf@dptr\endcsname} | |
\def\bxbf@exec@AX@a#1#2{% | |
\ifx#1\relax \chardef#1\bxbf@zero \fi | |
\bxbf@count#2\multiply\bxbf@count\bxbf@lctr\advance\bxbf@count#1% | |
\ifnum\bxbf@count<\bxbf@rbase\else \bxbf@modulo\bxbf@count \fi | |
\chardef#1\bxbf@count | |
%\bxDebug{AX:#1:\the#2;\the#1}% | |
} | |
%% bxbf@exec@RX | |
\def\bxbf@exec@RX{% | |
\expandafter\bxbf@exec@RX@a\csname ^^?\the\bxbf@dptr\endcsname} | |
\def\bxbf@exec@RX@a#1#2{% | |
\ifx#1\relax \chardef#1\bxbf@zero \fi | |
\bxbf@count#2\multiply\bxbf@count-\bxbf@lctr\advance\bxbf@count#1% | |
\ifnum\bxbf@count<\z@ \bxbf@modulo\bxbf@count \fi | |
\ifnum\bxbf@count<\z@ \advance\bxbf@count\bxbf@rbase \fi | |
\chardef#1\bxbf@count | |
%\bxDebug{RX:#1:\the#2;\the#1}% | |
} | |
\bxbf@restorecc | |
%--------------------------------------- virtual I/O | |
%% variables | |
\chardef\bxbfLF=10 | |
\chardef\bxbfSP=32 | |
%% \bxbf@get@char | |
\def\bxbf@get@char{% | |
\ifx\bxbf@str@in\@empty \bxbf@get@char@mt | |
\else | |
\expandafter\bxbf@get@char@a\bxbf@str@in\bxbf@end | |
\fi | |
} | |
\def\bxbf@get@char@a{% | |
% don't discard spaces! | |
\futurelet\bxbf@tmpa\bxbf@get@char@b | |
} | |
\def\bxbf@get@char@b{% | |
\ifx\bxbf@tmpa\@sptoken | |
\expandafter\bxbf@get@char@d | |
\else | |
\expandafter\bxbf@get@char@c | |
\fi | |
} | |
\def\bxbf@get@char@c#1#2\bxbf@end{% | |
\bxbf@count`#1\relax \gdef\bxbf@str@in{#2}% | |
\ifnum\bxbf@count>\@cclv | |
\expandafter\bxbf@invalid@char | |
\fi | |
} | |
\def\bxbf@get@char@d{% | |
\afterassignment\bxbf@get@char@e \let\bxbf@tmpa= % | |
} | |
\def\bxbf@get@char@e#1\bxbf@end{% | |
\bxbf@count\bxbfSP \gdef\bxbf@str@in{#1}% | |
} | |
\def\bxbf@invalid@char{% | |
\bxbf@warn@hichr | |
\bxbf@count\z@ % non 8-bit char is replaced by zero | |
} | |
\def\bxbf@get@char@mt{% | |
\ifx!\bxbf@eofval | |
\bxbf@warn@ineof | |
\bxbf@count\m@ne | |
\else\ifx*\bxbf@eofval\else | |
\bxbf@count\bxbf@eofval | |
\fi\fi | |
} | |
%% \bxbf@put@char | |
\def\bxbf@put@char{% | |
\lccode`!=\bxbf@count | |
\lowercase{% | |
\xdef\bxbf@str@out{\bxbf@str@out | |
\ifnum\bxbf@count=\bxbfLF \bxbfLF | |
\else\ifnum\bxbf@count=\bxbfSP \bxbfSP | |
\else !\fi\fi}% | |
}% | |
%\bxDebug{OUT:\bxbf@str@out:\the\bxbf@count}% | |
} | |
%--------------------------------------- all done | |
\endinput | |
%% EOF |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
\documentclass[a4paper]{article} | |
\usepackage{bxbluf} | |
\usepackage{type1cm} | |
\newcommand*\AhoFont[1]{{\usefont{OT1}{cmfr}{m}{it}\LARGE #1}} | |
%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! BEGIN BF code | |
\procbf{\NabeAzz}{ | |
>>>+>>>>>+[->>>>,+>+<[->-]>[->]<+<[---------->-]>[ | |
->]<+<[++<++++++++[->-----<<<+<++++++>>>]<<+>>>>>> | |
+++>+<<<-]>[->]>>]<<<<<+++>>++++++++++++++++[->++> | |
++++++>++++>++++++>+++++++>++++>+++++++>+++++++>++ | |
+++++>++++++++>++++++++<<<<<<<<<<<]>>---->+>++++++ | |
++>->++++++>->-->++++>----->---<<<<<<<<<<<<<<<<<<< | |
+[-<<+>[-<-]<[->+++++++++<<<<<<<+>>>>>]<<<<<]>>>[> | |
>>>>>>>]>+[<<<<+[->[-]+<<<<+<[-<+>>-]>[-<+++++++++ | |
<---------<<<+>>>>>>]>>+>>[-<<-]<<[->>+++++++++<<< | |
<]<<<<<<]>>>[>>>>>>>>]>>>->+<[<+<<<[<<<<<<<<]<<<<[ | |
>>>>>[>>>>>>>>]>>-<<<<<<<]<<<[>>>>>>>>]>>>>-]>[-<+ | |
++<+>>>]<<<[->>+>>>.>.>.>.>.>.>.>.>.<<<<<<<<<<<<<] | |
<<<<[<<<<<<<<]>>[.>>>>>>>>]>>>>[->>>>>>>>>>>>.<<<< | |
<<<<<<<<]>>.<<<<<<<<<+[-<<[->>>>>[>>>>>>>>]>-<<<<< | |
+<]+>[-<-]<[->+++++++++<<<<<<<+>>>>>]<<<<<]>>>[>>> | |
>>>>>]>] | |
}%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! END BF code | |
\begin{document} | |
\NabeAzz{40} | |
\end{document} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment