summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/supp-ran.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkiv/supp-ran.lua')
-rw-r--r--tex/context/base/mkiv/supp-ran.lua73
1 files changed, 57 insertions, 16 deletions
diff --git a/tex/context/base/mkiv/supp-ran.lua b/tex/context/base/mkiv/supp-ran.lua
index 4968e8cfc..8bfc09e58 100644
--- a/tex/context/base/mkiv/supp-ran.lua
+++ b/tex/context/base/mkiv/supp-ran.lua
@@ -10,8 +10,8 @@ if not modules then modules = { } end modules ['supp-ran'] = {
local report_system = logs.reporter("system","randomizer")
-local trace_random = false trackers.register("system.randomizer", function(v) trace_random = v end)
-local trace_random_mp = false trackers.register("system.randomizer.mp",function(v) trace_random_mp = v end)
+local trace_random = false trackers.register("system.randomizer", function(v) trace_random = v end)
+local trace_detail = false trackers.register("system.randomizer.detail",function(v) trace_detail = v end)
local insert, remove = table.insert, table.remove
@@ -26,6 +26,14 @@ local stack = { }
local last = 1
local maxcount = 2^30-1 -- 1073741823
+math.random = function(...)
+ local n = random(...)
+ if trace_detail then
+ report_system("math %s",n)
+ end
+ return n
+end
+
local function setrandomseedi(n)
if n <= 1 then
n = n * maxcount
@@ -33,17 +41,22 @@ local function setrandomseedi(n)
n = n * 1000
end
n = round(n)
- if trace_random then
- report_system("setting seed to %s",n)
- end
randomseed(n)
last = random(0,maxcount) -- we need an initial value
+ if trace_detail then
+ report_system("seed %s from %s",last,n)
+ elseif trace_random then
+ report_system("setting seed %s",n)
+ end
end
math.setrandomseedi = setrandomseedi
local function getrandomnumber(min,max)
last = random(min,max)
+ if trace_detail then
+ report_system("number %s",last)
+ end
return last
end
@@ -56,19 +69,19 @@ local function getrandomseed()
return last
end
-local function getmprandomnumber()
- last = random(0,4095)
- if trace_random_mp then
- report_system("using mp seed %s",last)
- end
- return last
-end
+-- local function getmprandomnumber()
+-- last = random(0,4095)
+-- if trace_detail then
+-- report_system("mp number %s",last)
+-- end
+-- return last
+-- end
-- maybe stack
local function pushrandomseed()
insert(stack,last)
- if trace_random then
+ if trace_random or trace_detail then
report_system("pushing seed %s",last)
end
end
@@ -76,7 +89,7 @@ end
local function reuserandomseed(n)
local seed = stack[#stack]
if seed then
- if trace_random then
+ if trace_random or trace_detail then
report_system("reusing seed %s",last)
end
randomseed(seed)
@@ -86,19 +99,47 @@ end
local function poprandomseed()
local seed = remove(stack)
if seed then
- if trace_random then
+ if trace_random or trace_detail then
report_system("popping seed %s",seed)
end
randomseed(seed)
end
end
+local function getrandom(where,...)
+ if type(where) == "string" then
+ local n = random(...)
+ if trace_detail then
+ report_system("%s %s",where,n)
+ end
+ return n
+ else
+ local n = random(where,...)
+ if trace_detail then
+ report_system("utilities %s",n)
+ end
+ return n
+ end
+end
+
+utilities.randomizer = {
+ setseedi = setrandomseedi,
+ getnumber = getrandomnumber,
+ setseed = setrandomseed,
+ getseed = getrandomseed,
+ -- getmpnumber = getmprandomnumber,
+ pushseed = pushrandomseed,
+ reuseseed = reuserandomseed,
+ popseed = poprandomseed,
+ get = getrandom,
+}
+
-- todo: also open up in utilities.randomizer.*
implement { name = "getrandomnumber", actions = { getrandomnumber, context }, arguments = { "integer", "integer" } }
implement { name = "getrandomdimen", actions = { getrandomnumber, context }, arguments = { "dimen", "dimen" } }
implement { name = "getrandomfloat", actions = { getrandomnumber, context }, arguments = { "number", "number" } }
-implement { name = "getmprandomnumber", actions = { getmprandomnumber, context } }
+--------- { name = "getmprandomnumber", actions = { getmprandomnumber, context } }
implement { name = "setrandomseed", actions = { setrandomseed }, arguments = { "integer" } }
implement { name = "getrandomseed", actions = { getrandomseed, context } }
implement { name = "pushrandomseed", actions = { pushrandomseed } }