Skip to content

Commit 4c89836

Browse files
committed
Added comments and nicer formatting of Lua scripts in the 'core' directory.
1 parent 366b15a commit 4c89836

File tree

3 files changed

+278
-69
lines changed

3 files changed

+278
-69
lines changed

core/BENCH.LUA

Lines changed: 158 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,171 @@
11
#!/usr/bin/env lua
22

3+
---Get the operating system the script is running on
4+
---@return string A string that will read: DOS, NT, UNIX or Unknown
35
function OS()
4-
if os.getenv("COMSPEC")then return os.getenv("OS")and"NT"or"DOS"
5-
else return os.getenv("SHELL")and"UNIX"or"Unknown"end end
6+
if os.getenv("COMSPEC") then
7+
return os.getenv("OS") and "NT" or "DOS"
8+
else
9+
return os.getenv("SHELL") and "UNIX" or "Unknown"
10+
end
11+
end
12+
13+
---Benchmark start, prints the benchmark name and records the current time
14+
---@param name string The name of the benchmark
15+
---@param it number The number of times the benchmark will loop
16+
---@return number The current clock time
617
function BS(name, it)
7-
local t=#tostring(it)>10 and string.format("%10e",it):gsub("%..-e","e")or it
8-
io.write(string.format("%-9s",name).."\t"..string.format("%10s",t).."\t")io.flush()return os.clock()end
18+
local t = #tostring(it) > 10 and string.format("%10e", it):gsub("%..-e", "e") or it
19+
io.write(string.format("%-9s", name) .. "\t" .. string.format("%10s", t) .. "\t")
20+
io.flush()
21+
return os.clock()
22+
end
23+
24+
---Benchmark end, prints the benchmarks duration
25+
---@param st number The start time returned by BS
926
function BE(st)
10-
local t=os.clock()-st
11-
local m,s=math.floor(t/60),t%60
12-
io.write(string.format("%7d:%09.6f\n",m,s))end
27+
local t = os.clock() - st
28+
local m, s = math.floor(t / 60), t % 60
29+
io.write(string.format("%7d:%09.6f\n", m, s))
30+
end
31+
32+
---A benchmark for calculating Pi using the Nilkantha's series
1333
local function b_pi()
14-
local it,pi,si=S,3,1
15-
local b=BS("Nilakantha Pi",it)
16-
for i=2,it*2,2 do pi=pi+si*(4/(i*(i+1)*(i+2)))si=-si end BE(b)end
34+
local it, pi, si = S, 3, 1
35+
local b = BS("Nilakantha Pi", it)
36+
for i = 2, it * 2, 2 do
37+
pi = pi + si * (4 / (i * (i + 1) * (i + 2)))
38+
si = -si
39+
end
40+
BE(b)
41+
end
42+
43+
---A benchmark for calculating a common divisor
1744
local function b_gcd()
18-
local function gcd(a,b)while b~=0 do a,b=b,a%b end return a end
19-
local r,b=0,BS("Common Divisor",S)
20-
for i=1,S do local x,y=i,S-i+1 r=gcd(x,y)end BE(b)end
45+
local function gcd(a, b)
46+
while b ~= 0 do
47+
a, b = b, a % b
48+
end
49+
return a
50+
end
51+
local r, b = 0, BS("Common Divisor", S)
52+
for i = 1, S do
53+
local x, y = i, S - i + 1
54+
r = gcd(x, y)
55+
end
56+
BE(b)
57+
end
58+
59+
---A benchmark for calculating multiplication performance
2160
local function b_mul()
22-
local r,b=1,BS("Multiplication",B)
23-
for _=1,B do r=(r*1.000000001)end BE(b)end
61+
local r, b = 1, BS("Multiplication", B)
62+
for _ = 1, B do
63+
r = (r * 1.000000001)
64+
end
65+
BE(b)
66+
end
67+
68+
---A benchmark for calculating division performance
2469
local function b_div()
25-
local m,r=B,1
26-
local b=BS("Division",m)m=m+1
27-
for i=2,m do r=r/i end BE(b)end
70+
local m, r = B, 1
71+
local b = BS("Division", m)
72+
m = m + 1
73+
for i = 2, m do
74+
r = r / i
75+
end
76+
BE(b)
77+
end
78+
79+
---A benchmark for calculating addition performance
2880
local function b_add()
29-
local r,b=1,BS("Addition",B)
30-
for i=1,B do r=r+i end BE(b)end
81+
local r, b = 1, BS("Addition", B)
82+
for i = 1, B do
83+
r = r + i
84+
end
85+
BE(b)
86+
end
87+
88+
---A benchmark for calculating floating point addition performance
3189
local function b_flt()
32-
local r,b=1.0,BS("Float Addition",B)
33-
for _=1,B do r=r+0.01 end BE(b)end
90+
local r, b = 1.0, BS("Float Addition", B)
91+
for _ = 1, B do
92+
r = r + 0.01
93+
end
94+
BE(b)
95+
end
96+
97+
---A benchmark for calculating subtraction performance
3498
local function b_sub()
35-
local r,b=1,BS("Subtraction",B)
36-
for i=B,1,-1 do r=r-i end BE(b)end
99+
local r, b = 1, BS("Subtraction", B)
100+
for i = B, 1, -1 do
101+
r = r - i
102+
end
103+
BE(b)
104+
end
105+
106+
---A benchmark for calculating array iteration performance
37107
local function b_arr()
38-
local b,a,s=BS("Array Loop",S),{},0
39-
for i=1,S do a[i]=i%10 end
40-
for i=1,S do a[i]=a[i]*2 end
41-
for i=1,S do s=s+a[i]end BE(b)end
42-
local function L()print(string.rep('_',49))end
43-
print("Runtime:",_VERSION)print("OS Family:",OS())
44-
print("Minimum Int:",math.mininteger or"Unknown")
45-
print("Maximum Int:",math.maxinteger or"Unknown")
46-
M=tonumber(arg[1])if not M or M<1980 then print("\nTo benchmark,run again and specify a year > 1979")os.exit()end
47-
print("\nRunning benchmark: "..M)M=(M-1955)/25
48-
B,S=math.floor(500^M),math.floor(100^M)
49-
print("\nBenchmark","Iterations","Time (min:sec.ms)")L()
50-
b=os.clock()b_add()b_flt()b_sub()b_mul()b_div()b_pi()b_gcd()b_arr()
51-
LIB=true package.path=package.path..";?.LUA" pcall(require,"EXBENCH")L()
52-
io.write("Total:\t\t"..string.format("%8.3fkB",collectgarbage("count")).."\t")BE(b)
53-
print("Press Enter to Exit...")io.read()os.exit()
108+
local b, a, s = BS("Array Loop", S), {}, 0
109+
for i = 1, S do
110+
a[i] = i % 10
111+
end
112+
for i = 1, S do
113+
a[i] = a[i] * 2
114+
end
115+
for i = 1, S do
116+
s = s + a[i]
117+
end
118+
BE(b)
119+
end
120+
121+
---Print a horizontal line on the screen
122+
local function L()
123+
print(string.rep('_', 49))
124+
end
125+
126+
--Print basic system and Lua information
127+
print("Runtime:", _VERSION)
128+
print("OS Family:", OS())
129+
print("Minimum Int:", math.mininteger or "Unknown")
130+
print("Maximum Int:", math.maxinteger or "Unknown")
131+
132+
--Check what benchmark to run
133+
M = tonumber(arg[1])
134+
if not M or M < 1980 then
135+
print("\nTo benchmark,run again and specify a year > 1979")
136+
os.exit()
137+
end
138+
139+
print("\nRunning benchmark: " .. M)
140+
141+
--Make the benchmark do more iterations of every test for each year above 1980
142+
M = (M - 1955) / 25
143+
B, S = math.floor(500 ^ M), math.floor(100 ^ M)
144+
145+
print("\nBenchmark", "Iterations", "Time (min:sec.ms)")
146+
L()
147+
--Benchmark Start
148+
b = os.clock()
149+
b_add()
150+
b_flt()
151+
b_sub()
152+
b_mul()
153+
b_div()
154+
b_pi()
155+
b_gcd()
156+
b_arr()
157+
158+
--Run extended benchmarks if available
159+
LIB = true
160+
package.path = package.path .. ";?.LUA" --In case of a case sensitive operating system
161+
pcall(require, "EXBENCH")
162+
163+
--Benchmark Finish
164+
L()
165+
io.write("Total:\t\t" .. string.format("%8.3fkB", collectgarbage("count")) .. "\t")
166+
BE(b)
167+
168+
--Wait for user input so the benchmark results can be read on operating systems that would automatically close the window
169+
print("Press Enter to Exit...")
170+
io.read()
171+
os.exit()

core/README.LUA

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
To run the script, pass it to a lua binary as an argument.
77
For full Lua language documentation visit https://www.lua.org/docs.html --]]
88

9-
H=tonumber(os.date('%H'))
10-
T=(H<4 or H>20)and'night'or H<9 and'morning'or H>16 and'evening'or'day'
11-
print('Good '..T..' from '.._VERSION..'.')
12-
print("Press Enter to Exit...")io.read()os.exit()
9+
H = tonumber(os.date('%H'))
10+
T = (H < 4 or H > 20) and 'night' or H < 9 and 'morning' or H > 16 and 'evening' or 'day'
11+
print('Good ' .. T .. ' from ' .. _VERSION .. '.')
12+
print("Press Enter to Exit...")
13+
io.read()
14+
os.exit()

core/S256SUM.LUA

Lines changed: 114 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,122 @@
44
---@param file file The file
55
---@return string SHA-256 checksum
66
function sha256_file(file)
7-
local M,K=0xFFFFFFFF,{0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2}
8-
local function RR(x,n)return (x>>n)|((x&M)<<(32-n))end
9-
local function TF(k,H)local W={}for i=0,15 do local o=i*4+1 W[i]=string.byte(k,o)<<24|string.byte(k,o+1)<<16|string.byte(k,o+2)<<8|string.byte(k,o+3)end
10-
for i=16,63 do
11-
local s0,s1=RR(W[i-15],7)~RR(W[i-15],18)~(W[i-15]>>3),RR(W[i-2],17)~RR(W[i-2],19)~(W[i-2]>>10) --#squish keep-eol
12-
W[i]=(W[i-16]+s0+W[i-7]+s1)&M end
13-
local a,b,c,d,e,f,g,h=table.unpack(H)for i=0,63 do
14-
local S0,S1,ch,maj=RR(a,2)~RR(a,13)~RR(a,22),RR(e,6)~RR(e,11)~RR(e,25),(e&f)~((~e)&g),(a&b)~(a&c)~(b&c) --#squish keep-eol
15-
local t1,t2=(h+S1+ch+K[i+1]+W[i])&M,(S0+maj)&M
16-
h=g g=f f=e e=(d+t1)&M d=c c=b b=a a=(t1+t2)&M end
17-
H[1]=(H[1]+a)&M H[2]=(H[2]+b)&M H[3]=(H[3]+c)&M H[4]=(H[4]+d)&M H[5]=(H[5]+e)&M H[6]=(H[6]+f)&M H[7]=(H[7]+g)&M H[8]=(H[8]+h)&M end
7+
-- M = Maximum value of number (32-bits)
8+
-- K = SHA256 round constants
9+
local M, K = 0xFFFFFFFF, {
10+
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,
11+
0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
12+
0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,
13+
0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
14+
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,
15+
0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
16+
0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,
17+
0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
18+
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,
19+
0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
20+
0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
21+
}
1822

19-
local function P(l)local ml,p,pl=l*8,"\128",56-(l%64) --#squish keep-eol
20-
if pl<=0 then pl=pl+64 end p=p..string.rep("\0",pl-1) --#squish keep-eol
21-
for i=7,0,-1 do p=p..string.char((ml>>(i*8))&0xFF)end return p end
23+
---Right rotate a 32-bit value
24+
---@param x number The 32-bit value to be rotated
25+
---@param n number The number of rotations to the right that should be done
26+
---@return number The right shifted value
27+
local function RR(x, n)
28+
return (x >> n) | ((x & M) << (32 - n))
29+
end
2230

23-
local H,l={0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19},0
24-
while 1 do local c=file:read(64)if not c then break end l=l+#c if #c<64 then c=c..P(l)TF(c,H)break end TF(c,H)end
25-
local function h(x)return string.format("%08x",x)end
26-
return table.concat({h(H[1]),h(H[2]),h(H[3]),h(H[4]),h(H[5]),h(H[6]),h(H[7]),h(H[8])}) --#squish keep-eol
31+
---SHA-256 transformation function
32+
---@param k string A 64-byte chunk of the message
33+
---@param H table The current hash state (8 32-bit values)
34+
local function TF(k, H)
35+
local W = {}
36+
for i = 0, 15 do -- Convert chunk into 32-bit list
37+
local o = i * 4 + 1
38+
W[i] = string.byte(k, o) << 24 | string.byte(k, o + 1) << 16 | string.byte(k, o + 2) << 8 | string.byte(k, o + 3)
39+
end
40+
for i = 16, 63 do -- Message expansion
41+
local s0, s1 = RR(W[i - 15], 7) ~ RR(W[i - 15], 18) ~ (W[i - 15] >> 3), RR(W[i - 2], 17) ~ RR(W[i - 2], 19) ~ (W[i - 2] >> 10) --#squish keep-eol
42+
W[i] = (W[i - 16] + s0 + W[i - 7] + s1) & M
43+
end
44+
local a, b, c, d, e, f, g, h = table.unpack(H)
45+
for i = 0, 63 do
46+
local S0, S1, ch, maj = RR(a, 2) ~ RR(a, 13) ~ RR(a, 22), RR(e, 6) ~ RR(e, 11) ~ RR(e, 25), (e & f) ~ ((~e) & g), (a & b) ~ (a & c) ~ (b & c) --#squish keep-eol
47+
local t1, t2 = (h + S1 + ch + K[i + 1] + W[i]) & M, (S0 + maj) & M
48+
h = g
49+
g = f
50+
f = e
51+
e = (d + t1) & M
52+
d = c
53+
c = b
54+
b = a
55+
a = (t1 + t2) & M
56+
end
57+
H[1] = (H[1] + a) & M
58+
H[2] = (H[2] + b) & M
59+
H[3] = (H[3] + c) & M
60+
H[4] = (H[4] + d) & M
61+
H[5] = (H[5] + e) & M
62+
H[6] = (H[6] + f) & M
63+
H[7] = (H[7] + g) & M
64+
H[8] = (H[8] + h) & M
65+
end
66+
67+
---Create SHA-256 padding for message
68+
---@param l number The length of the message in bytes
69+
---@return string The padding string to append to the message
70+
local function P(l)
71+
local ml, p, pl = l * 8, "\128", 56 - (l % 64) --#squish keep-eol
72+
if pl <= 0 then
73+
pl = pl + 64
74+
end
75+
p = p .. string.rep("\0", pl - 1) --#squish keep-eol
76+
for i = 7, 0, -1 do
77+
p = p .. string.char((ml >> (i * 8)) & 0xFF)
78+
end
79+
return p
80+
end
81+
82+
local H, l = { 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 }, 0
83+
while 1 do
84+
local c = file:read(64)
85+
if not c then
86+
break
87+
end
88+
l = l + #c
89+
if #c < 64 then
90+
c = c .. P(l)
91+
TF(c, H)
92+
break
93+
end
94+
TF(c, H)
95+
end
96+
local function h(x)
97+
return string.format("%08x", x)
98+
end
99+
return table.concat({ h(H[1]), h(H[2]), h(H[3]), h(H[4]), h(H[5]), h(H[6]), h(H[7]), h(H[8]) }) --#squish keep-eol
100+
end
101+
102+
if LIB then
103+
return -- Don't run below code if brought in as a library
27104
end
28105

29-
if LIB then return end
30-
if #arg<1 then print((arg[-1] or "?").." "..(arg[0] or "?").." [FILE]...")os.exit(1) --#squish keep-eol
31-
else for i=1,#arg do local f,e=io.open(arg[i],"rb") --#squish keep-eol
32-
if not f then print(e)os.exit(1)end
33-
local sum=sha256_file(f)f:close() --#squish keep-eol
34-
if sum then print(sum.." "..arg[i])else print(arg[i]..": ".."Unknown error")os.exit(-1)end
35-
end
106+
if #arg < 1 then
107+
print((arg[-1] or "?") .. " " .. (arg[0] or "?") .. " [FILE]...")
108+
os.exit(1) --#squish keep-eol
109+
else
110+
for i = 1, #arg do
111+
local f, e = io.open(arg[i], "rb") --#squish keep-eol
112+
if not f then
113+
print(e)
114+
os.exit(1)
115+
end
116+
local sum = sha256_file(f)
117+
f:close() --#squish keep-eol
118+
if sum then
119+
print(sum .. " " .. arg[i])
120+
else
121+
print(arg[i] .. ": " .. "Unknown error")
122+
os.exit(-1)
123+
end
124+
end
36125
end

0 commit comments

Comments
 (0)