summaryrefslogtreecommitdiff
path: root/tex/context/base/thrd-ran.tex
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/thrd-ran.tex')
-rw-r--r--tex/context/base/thrd-ran.tex174
1 files changed, 119 insertions, 55 deletions
diff --git a/tex/context/base/thrd-ran.tex b/tex/context/base/thrd-ran.tex
index 9dd509492..ea19c7a20 100644
--- a/tex/context/base/thrd-ran.tex
+++ b/tex/context/base/thrd-ran.tex
@@ -1,6 +1,9 @@
% Since we cannot be sure that this file is available at any
% system, we have copied the original in this file. These
% macros are encapsulates and extended in supp-ran.tex.
+%
+% This module is slightly recoded to bring it more in tune
+% with \CONTEXT's scratch registers and protection mechanisms.
% RANDOM.TEX v.1 (Donald Arseneau)
% Generating "random" numbers in TeX.
@@ -39,66 +42,127 @@
% reduce the complexity of the macros a bit, but not much--most of the
% code deals with initialization and type-conversion. On the other hand,
% the large range may be wasted due to the sparse seed initialization.
+
+% original code
+%
+% \newcount\randomi % the random number seed (while executing)
+% \global\randomi\catcode`\@ % scratch variable during definitions
+% \catcode`\@=11
+%
+% \def\nextrandom{\begingroup
+% \ifnum\randomi<\@ne % then initialize with time
+% \global\randomi\time
+% \global\multiply\randomi388 \global\advance\randomi\year
+% \global\multiply\randomi31 \global\advance\randomi\day
+% \global\multiply\randomi97 \global\advance\randomi\month
+% \message{Randomizer initialized to \the\randomi.}%
+% \nextrandom \nextrandom \nextrandom
+% \fi
+% \count@ii\randomi
+% \divide\count@ii 127773 % modulus = multiplier * 127773 + 2836
+% \count@\count@ii
+% \multiply\count@ii 127773
+% \global\advance\randomi-\count@ii % random mod 127773
+% \global\multiply\randomi 16807
+% \multiply\count@ 2836
+% \global\advance\randomi-\count@
+% \ifnum\randomi<\z@ \global\advance\randomi 2147483647\relax\fi
+% \endgroup
+% }
+%
+% \countdef\count@ii=2 % use only in boxes!
+% \ifx\@tempcnta\undefined \csname newcount\endcsname \@tempcnta \fi
+% \ifx\@tempcntb\undefined \csname newcount\endcsname \@tempcntb \fi
+%
+% \def\setrannum#1#2#3{% count register, minimum, maximum
+% \@tempcnta#3\advance\@tempcnta-#2\advance\@tempcnta\@ne
+% \@tempcntb 2147483645 % = m - 2 = 2^{31} - 3
+% \divide\@tempcntb\@tempcnta
+% \getr@nval
+% \advance\ranval#2\relax
+% #1\ranval
+% }
+%
+% \def\setrandim#1#2#3{% dimen register, minimum length, maximum length
+% \dimen@#2\dimen@ii#3\relax
+% \setrannum\ranval\dimen@\dimen@ii
+% #1\ranval sp\relax
+% }
+%
+% \def\getr@nval{% The values in \@tempcnta and \@tempcntb are parameters
+% \nextrandom
+% \ranval\randomi \advance\ranval\m@ne \divide\ranval\@tempcntb
+% \ifnum\ranval<\@tempcnta\else \expandafter\getr@nval \fi
+% }
+%
+% %D The next macro is not needed in \CONTEXT, which provides
+% %D the \type {\withoutpt} macro.
+% %D
+% %D \starttypen
+% %D \def\pointless{\expandafter\PoinTless\the}
+% %D {\catcode`p=12 \catcode`t=12 \gdef\PoinTless#1pt{#1}}
+% %D \stoptypen
+%
+% \catcode`\@=\randomi
+% \global\randomi=0
+% \newcount\ranval
+
+% the recoded version, using \CONTEXT\ methods and variables;
+% the magic is kept untouched
+
+\unprotect
\newcount\randomi % the random number seed (while executing)
-\global\randomi\catcode`\@ % scratch variable during definitions
-\catcode`\@=11
+\newcount\ranval
-\def\nextrandom{\begingroup
- \ifnum\randomi<\@ne % then initialize with time
- \global\randomi\time
- \global\multiply\randomi388 \global\advance\randomi\year
- \global\multiply\randomi31 \global\advance\randomi\day
- \global\multiply\randomi97 \global\advance\randomi\month
- \message{Randomizer initialized to \the\randomi.}%
- \nextrandom \nextrandom \nextrandom
- \fi
- \count@ii\randomi
- \divide\count@ii 127773 % modulus = multiplier * 127773 + 2836
- \count@\count@ii
- \multiply\count@ii 127773
- \global\advance\randomi-\count@ii % random mod 127773
- \global\multiply\randomi 16807
- \multiply\count@ 2836
- \global\advance\randomi-\count@
- \ifnum\randomi<\z@ \global\advance\randomi 2147483647\relax\fi
- \endgroup
-}
+\ifx\m!systems\undefined \def\m!systems{system} \fi
-\countdef\count@ii=2 % use only in boxes!
-\ifx\@tempcnta\undefined \csname newcount\endcsname \@tempcnta \fi
-\ifx\@tempcntb\undefined \csname newcount\endcsname \@tempcntb \fi
+\def\nextrandom
+ {\begingroup
+ \ifnum\randomi<\plusone % then initialize with time
+ \global\randomi\time
+ \global\multiply\randomi388 \global\advance\randomi\year
+ \global\multiply\randomi 31 \global\advance\randomi\day
+ \global\multiply\randomi 97 \global\advance\randomi\month
+ \writestatus\m!systems{randomizer starts with \the\randomi}%
+ \nextrandom \nextrandom \nextrandom
+ \fi
+ \!!countd\randomi
+ \divide\!!countd 127773 % modulus = multiplier * 127773 + 2836
+ \!!countc\!!countd
+ \multiply\!!countd 127773
+ \global\advance\randomi-\!!countd % random mod 127773
+ \global\multiply\randomi 16807
+ \multiply\!!countc 2836
+ \global\advance\randomi-\!!countc
+ \ifnum\randomi<\zerocount
+ \global\advance\randomi 2147483647
+ \fi
+ \endgroup}
-\def\setrannum#1#2#3{% count register, minimum, maximum
- \@tempcnta#3\advance\@tempcnta-#2\advance\@tempcnta\@ne
- \@tempcntb 2147483645 % = m - 2 = 2^{31} - 3
- \divide\@tempcntb\@tempcnta
- \getr@nval
- \advance\ranval#2\relax
- #1\ranval
-}
+\def\setrannum#1#2#3% count register, minimum, maximum
+ {\!!counta#3%
+ \advance\!!counta-#2%
+ \advance\!!counta\plusone
+ \!!countb 2147483645 % = m - 2 = 2^{31} - 3
+ \divide\!!countb\!!counta
+ \getr@nval
+ \advance\ranval#2%
+ #1\ranval}
-\def\setrandim#1#2#3{% dimen register, minimum length, maximum length
- \dimen@#2\dimen@ii#3\relax
- \setrannum\ranval\dimen@\dimen@ii
- #1\ranval sp\relax
-}
+\def\setrandim#1#2#3% dimen register, minimum length, maximum length
+ {\!!dimenc#2%
+ \!!dimend#3%
+ \setrannum\ranval\!!dimenc\!!dimend
+ #1\ranval\s!sp\relax}
-\def\getr@nval{% The values in \@tempcnta and \@tempcntb are parameters
- \nextrandom
- \ranval\randomi \advance\ranval\m@ne \divide\ranval\@tempcntb
- \ifnum\ranval<\@tempcnta\else \expandafter\getr@nval \fi
-}
+\def\getr@nval % The values in \!!counta and \!!countb are parameters
+ {\nextrandom
+ \ranval\randomi
+ \advance\ranval\minusone
+ \divide\ranval\!!countb
+ \ifnum\ranval<\!!counta \else
+ \expandafter\getr@nval
+ \fi}
-%D The next macro is not needed in \CONTEXT, which provides
-%D the \type {\withoutpt} macro.
-%D
-%D \starttypen
-%D \def\pointless{\expandafter\PoinTless\the}
-%D {\catcode`p=12 \catcode`t=12
-%D \gdef\PoinTless#1pt{#1}}
-%D \stoptypen
-
-\catcode`\@=\randomi
-\global\randomi=0
-\newcount\ranval
+\protect \endinput