1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
if not modules then modules = { } end modules ['l-md5'] = {
version = 1.001,
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
-- This also provides file checksums and checkers.
if not md5 then
md5 = optionalrequire("md5")
end
if not md5 then
md5 = {
sum = function(str) print("error: md5 is not loaded (sum ignored)") return str end,
sumhexa = function(str) print("error: md5 is not loaded (sumhexa ignored)") return str end,
}
end
local md5, file = md5, file
local gsub = string.gsub
-- local gsub, format, byte = string.gsub, string.format, string.byte
--
-- local function convert(str,fmt)
-- return (gsub(md5sum(str),".",function(chr) return format(fmt,byte(chr)) end))
-- end
--
-- if not md5.HEX then function md5.HEX(str) return convert(str,"%02X") end end
-- if not md5.hex then function md5.hex(str) return convert(str,"%02x") end end
-- if not md5.dec then function md5.dec(str) return convert(str,"%03i") end end
do
local patterns = lpeg and lpeg.patterns
if patterns then
local bytestoHEX = patterns.bytestoHEX
local bytestohex = patterns.bytestohex
local bytestodec = patterns.bytestodec
local lpegmatch = lpeg.match
local md5sum = md5.sum
if not md5.HEX then function md5.HEX(str) if str then return lpegmatch(bytestoHEX,md5sum(str)) end end end
if not md5.hex then function md5.hex(str) if str then return lpegmatch(bytestohex,md5sum(str)) end end end
if not md5.dec then function md5.dec(str) if str then return lpegmatch(bytestodec,md5sum(str)) end end end
end
end
function file.needsupdating(oldname,newname,threshold) -- size modification access change
local oldtime = lfs.attributes(oldname,"modification")
if oldtime then
local newtime = lfs.attributes(newname,"modification")
if not newtime then
return true -- no new file, so no updating needed
elseif newtime >= oldtime then
return false -- new file definitely needs updating
elseif oldtime - newtime < (threshold or 1) then
return false -- new file is probably still okay
else
return true -- new file has to be updated
end
else
return false -- no old file, so no updating needed
end
end
file.needs_updating = file.needsupdating
function file.syncmtimes(oldname,newname)
local oldtime = lfs.attributes(oldname,"modification")
if oldtime and lfs.isfile(newname) then
lfs.touch(newname,oldtime,oldtime)
end
end
function file.checksum(name)
if md5 then
local data = io.loaddata(name)
if data then
return md5.HEX(data)
end
end
return nil
end
function file.loadchecksum(name)
if md5 then
local data = io.loaddata(name .. ".md5")
return data and (gsub(data,"%s",""))
end
return nil
end
function file.savechecksum(name,checksum)
if not checksum then checksum = file.checksum(name) end
if checksum then
io.savedata(name .. ".md5",checksum)
return checksum
end
return nil
end
|