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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
if not modules then modules = { } end modules ['l-utils'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
-- hm, quite unreadable
local gsub, format = string.gsub, string.format
local concat = table.concat
local type, next = type, next
if not utils then utils = { } end
if not utils.merger then utils.merger = { } end
if not utils.lua then utils.lua = { } end
utils.report = utils.report or print
local merger = utils.merger
merger.strip_comment = true
local m_begin_merge = "begin library merge"
local m_end_merge = "end library merge"
local m_begin_closure = "do -- create closure to overcome 200 locals limit"
local m_end_closure = "end -- of closure"
local m_pattern =
"%c+" ..
"%-%-%s+" .. m_begin_merge ..
"%c+(.-)%c+" ..
"%-%-%s+" .. m_end_merge ..
"%c+"
local m_format =
"\n\n-- " .. m_begin_merge ..
"\n%s\n" ..
"-- " .. m_end_merge .. "\n\n"
local m_faked =
"-- " .. "created merged file" .. "\n\n" ..
"-- " .. m_begin_merge .. "\n\n" ..
"-- " .. m_end_merge .. "\n\n"
local function self_fake()
return m_faked
end
local function self_nothing()
return ""
end
local function self_load(name)
local data = io.loaddata(name) or ""
if data == "" then
utils.report("merge: unknown file %s",name)
else
utils.report("merge: inserting %s",name)
end
return data or ""
end
local function self_save(name, data)
if data ~= "" then
if merger.strip_comment then
-- saves some 20K
local n = #data
data = gsub(data,"%-%-~[^\n\r]*[\r\n]","")
utils.report("merge: %s bytes of comment stripped, %s bytes of code left",n-#data,#data)
end
io.savedata(name,data)
utils.report("merge: saving %s",name)
end
end
local function self_swap(data,code)
return data ~= "" and (gsub(data,m_pattern, function() return format(m_format,code) end, 1)) or ""
end
local function self_libs(libs,list)
local result, f, frozen, foundpath = { }, nil, false, nil
result[#result+1] = "\n"
if type(libs) == 'string' then libs = { libs } end
if type(list) == 'string' then list = { list } end
for i=1,#libs do
local lib = libs[i]
for j=1,#list do
local pth = gsub(list[j],"\\","/") -- file.clean_path
utils.report("merge: checking library path %s",pth)
local name = pth .. "/" .. lib
if lfs.isfile(name) then
foundpath = pth
end
end
if foundpath then break end
end
if foundpath then
utils.report("merge: using library path %s",foundpath)
local right, wrong = { }, { }
for i=1,#libs do
local lib = libs[i]
local fullname = foundpath .. "/" .. lib
if lfs.isfile(fullname) then
utils.report("merge: using library %s",fullname)
right[#right+1] = lib
result[#result+1] = m_begin_closure
result[#result+1] = io.loaddata(fullname,true)
result[#result+1] = m_end_closure
else
utils.report("merge: skipping library %s",fullname)
wrong[#wrong+1] = lib
end
end
if #right > 0 then
utils.report("merge: used libraries: %s",concat(right," "))
end
if #wrong > 0 then
utils.report("merge: skipped libraries: %s",concat(wrong," "))
end
else
utils.report("merge: no valid library path found")
end
return concat(result, "\n\n")
end
function merger.selfcreate(libs,list,target)
if target then
self_save(target,self_swap(self_fake(),self_libs(libs,list)))
end
end
function merger.selfmerge(name,libs,list,target)
self_save(target or name,self_swap(self_load(name),self_libs(libs,list)))
end
function merger.selfclean(name)
self_save(name,self_swap(self_load(name),self_nothing()))
end
function utils.lua.compile(luafile,lucfile,cleanup,strip) -- defaults: cleanup=false strip=true
utils.report("lua: compiling %s into %s",luafile,lucfile)
os.remove(lucfile)
local command = "-o " .. string.quote(lucfile) .. " " .. string.quote(luafile)
if strip ~= false then
command = "-s " .. command
end
local done = os.spawn("texluac " .. command) == 0 or os.spawn("luac " .. command) == 0
if done and cleanup == true and lfs.isfile(lucfile) and lfs.isfile(luafile) then
utils.report("lua: removing %s",luafile)
os.remove(luafile)
end
return done
end
|