80 lines
1.3 KiB
Lua
80 lines
1.3 KiB
Lua
-- mark up comments and strings
|
|
STR1 = "\001"
|
|
STR2 = "\002"
|
|
STR3 = "\003"
|
|
STR4 = "\004"
|
|
REM = "\005"
|
|
ANY = "([\001-\005])"
|
|
ESC1 = "\006"
|
|
ESC2 = "\007"
|
|
|
|
MASK = { -- the substitution order is important
|
|
{ESC1, "\\'"},
|
|
{ESC2, '\\"'},
|
|
{STR1, "'"},
|
|
{STR2, '"'},
|
|
{STR3, "%[%["},
|
|
{STR4, "%]%]"},
|
|
{REM , "%-%-"},
|
|
}
|
|
|
|
function mask (s)
|
|
for i = 1,getn(MASK) do
|
|
s = gsub(s,MASK[i][2],MASK[i][1])
|
|
end
|
|
return s
|
|
end
|
|
|
|
function unmask (s)
|
|
for i = 1,getn(MASK) do
|
|
s = gsub(s,MASK[i][1],MASK[i][2])
|
|
end
|
|
return s
|
|
end
|
|
|
|
function clean (s)
|
|
-- check for compilation error
|
|
local code = "return function ()\n" .. s .. "\n end"
|
|
if not dostring(code) then
|
|
return nil
|
|
end
|
|
|
|
if flags['C'] then
|
|
return s
|
|
end
|
|
|
|
local S = "" -- saved string
|
|
|
|
s = mask(s)
|
|
|
|
-- remove blanks and comments
|
|
while 1 do
|
|
local b,e,d = strfind(s,ANY)
|
|
if b then
|
|
S = S..strsub(s,1,b-1)
|
|
s = strsub(s,b+1)
|
|
if d==STR1 or d==STR2 then
|
|
e = strfind(s,d)
|
|
S = S ..d..strsub(s,1,e)
|
|
s = strsub(s,e+1)
|
|
elseif d==STR3 then
|
|
e = strfind(s,STR4)
|
|
S = S..d..strsub(s,1,e)
|
|
s = strsub(s,e+1)
|
|
elseif d==REM then
|
|
s = gsub(s,"[^\n]*(\n?)","%1",1)
|
|
end
|
|
else
|
|
S = S..s
|
|
break
|
|
end
|
|
end
|
|
-- eliminate unecessary spaces
|
|
S = gsub(S,"[ \t]+"," ")
|
|
S = gsub(S,"[ \t]*\n[ \t]*","\n")
|
|
S = gsub(S,"\n+","\n")
|
|
S = unmask(S)
|
|
return S
|
|
end
|
|
|