summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/lisp-on-tex/lisp-read.sty
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2013-03-05 00:33:46 +0000
committerKarl Berry <karl@freefriends.org>2013-03-05 00:33:46 +0000
commitd472c7d8c47d5a08e34a9f4713164afc5e7a1406 (patch)
tree4249b1eff690be906945d15b1e39e33037b1abdc /Master/texmf-dist/tex/latex/lisp-on-tex/lisp-read.sty
parent0d0778a39975e8293bde2267504f53bd9d3610a6 (diff)
lisp-on-tex (4mar13)
git-svn-id: svn://tug.org/texlive/trunk@29291 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/lisp-on-tex/lisp-read.sty')
-rw-r--r--Master/texmf-dist/tex/latex/lisp-on-tex/lisp-read.sty83
1 files changed, 83 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/lisp-on-tex/lisp-read.sty b/Master/texmf-dist/tex/latex/lisp-on-tex/lisp-read.sty
new file mode 100644
index 00000000000..a64512ff91c
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/lisp-on-tex/lisp-read.sty
@@ -0,0 +1,83 @@
+\def\lispread#1#2{\gdef\@read@buffer{#2\@@eof\@@eof}\@lispread#1}
+\def\@lispread#1{%
+\begingroup
+ \readchar
+ \if(\expandafter\noexpand\@currentread
+ \readchar
+ \if\expandafter\noexpand\@currentread)%
+ \gdef#1{\@tlabel@nil{}}%
+ \else
+ \unreadchar
+ \@lispread\@temp@i
+ \readchar
+ \if.\expandafter\noexpand\@currentread
+ \let\@save@temp\@temp@i
+ \@lispread\@temp@ii
+ \let\@temp@i\@save@temp
+ \readchar
+ \if)\expandafter\noexpand\@currentread
+ \expandafter\expandafter\expandafter\@make@cons
+ \expandafter\expandafter\expandafter#1%
+ \expandafter\@temp@i\@temp@ii
+ \else
+ \errmessage{LISP on TeX [Parse] :CANNOT FIND )}%
+ \fi
+ \else\if)\expandafter\noexpand\@currentread
+ \expandafter\@make@cons\expandafter#1\@temp@i\@tlabel@nil{}%
+ \else
+ \unreadchar
+ \expandafter\gdef
+ \expandafter\@read@buffer
+ \expandafter{%
+ \expandafter(\@read@buffer}%
+ \let\@save@temp\@temp@i
+ \@lispread\@temp@ii
+ \let\@temp@i\@save@temp
+ \expandafter\expandafter\expandafter\@make@cons
+ \expandafter\expandafter\expandafter#1%
+ \expandafter\@temp@i\@temp@ii
+ \fi\fi
+ \fi
+ \else\ifcat\relax\expandafter\noexpand\@currentread
+ \expandafter\gdef\expandafter#1\expandafter{%
+ \expandafter\@tlabel@symbol\expandafter{\@currentread}}%
+ \else\if'\expandafter\noexpand\@currentread
+ \expandafter\@read@string\expandafter#1\expandafter\@lisp@empty\@read@buffer\@@end
+ \else\if/\expandafter\noexpand\@currentread
+ \readchar
+ \xdef#1{\noexpand\@tlabel@bool{\@currentread}}%
+ \else\if:\expandafter\noexpand\@currentread
+ \expandafter\@read@num\expandafter#1\@read@buffer
+ \else\if!\expandafter\noexpand\@currentread
+ \expandafter\@read@dimen\expandafter#1\@read@buffer
+ \else\if @\expandafter\noexpand\@currentread
+ \expandafter\@read@skip\expandafter#1\@read@buffer
+ \else\if +\expandafter\noexpand\@currentread % parser module
+ \readchar
+ \expandafter\@read@module\expandafter#1\@currentread\@@end
+ \fi\fi\fi\fi\fi\fi\fi\fi
+\endgroup}
+
+\newcount\@temp@read@cnt
+\def\@read@num#1#2\@@eof\@@eof{%
+ \afterassignment\@@read@num\@temp@read@cnt#2\@@end
+ \expandafter\gdef
+ \expandafter#1%
+ \expandafter{\expandafter\@tlabel@int\expandafter{\the\@temp@read@cnt}}}
+\def\@@read@num#1\@@end{\gdef\@read@buffer{#1\@@eof\@@eof}}
+
+\def\@read@dimen#1#2\@@eof\@@eof{\afterassignment\@@read@dimen\dimen@#2\@@end
+\expandafter\gdef\expandafter#1\expandafter{\expandafter\@tlabel@dimen\expandafter{\the\dimen@}}}
+\let\@@read@dimen\@@read@num
+
+\def\@read@skip#1#2\@@eof\@@eof{\afterassignment\@@read@skip\skip@#2\@@end
+\expandafter\gdef\expandafter#1\expandafter{\expandafter\@tlabel@skip\expandafter{\the\skip@}}}
+\let\@@read@skip\@@read@num
+
+\def\@read@string#1#2'#3\@@end{%
+ \expandafter\gdef\expandafter#1%
+ \expandafter{\expandafter\@tlabel@string\expandafter{#2}}% expand \@lisp@empty
+ \gdef\@read@buffer{#3}}% I don't consider that #3 is single grouped tokens. In LISP on TeX, it never happen.
+
+\def\@read@module#1#2::#3\@@end{% #1 : register, #2 : module name (MUST unique), #3 : parse target
+ \csname @mod@read@#2\endcsname#1{#3}}