View difference between Paste ID: gqgTcNEV and Wy5vb6p0
SHOW: | | - or go back to the newest paste.
1
--Packager by CrazedProgrammer
2
3
b='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
4
function tobase64(data)
5
  return ((data:gsub('.', function(x) 
6
    local r,b='',x:byte()
7
    for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end
8
    return r;
9
  end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
10
    if (#x < 6) then return '' end
11
    local c=0
12
    for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end
13
    return b:sub(c+1,c+1)
14
  end)..({ '', '==', '=' })[#data%3+1])
15
end
16
function lzw_encode(str)
17
  local w = ''
18
  local result = {}
19
  local dict_size = 256
20
  local dict = {}
21
  for i = 0, dict_size-1 do
22
    dict[string.char(i)] = i
23
  end
24
  local i = dict_size
25
  for char in str:gmatch('.') do
26
    local wc = w .. char
27
    if dict[wc] then
28
      w = wc
29
    else
30
      table.insert(result, dict[w])
31
      dict[wc] = i
32
      i = i + 1
33
      w = char
34
    end
35
  end
36
  if w~='' then
37
    table.insert(result, dict[w])
38
  end
39
  local s = ""
40
  for k,v in pairs(result) do
41
    s = s..string.char(math.floor(v / 256))
42
    s = s..string.char(v % 256)
43
  end
44
  return s
45
end
46
function add(path)
47
  if fs.isDir(dir.."/"..path) then
48
    local files = 0
49
    for k,v in pairs(fs.list(dir.."/"..path)) do
50
      add(path.."/"..v)
51
      files = files + 1
52
    end
53
    if files == 0 then
54
      data = data..string.char(0)
55
      data = data..string.char(#path)
56
      data = data..path
57
      data = data..string.char(2)
58
    end
59
  elseif path ~= "" then
60
    local f = fs.open(dir.."/"..path, "r")
61
    local d = lzw_encode(f.readAll())
62
    data = data..string.char(0)
63
    data = data..string.char(#path)
64
    data = data..path
65
    data = data..string.char(1)
66
    data = data..string.char(math.floor(#d / 65536))
67
    data = data..string.char(math.floor(#d / 256) - math.floor(#d / 65536) * 256)
68
    data = data..string.char(#d % 256)
69
    data = data..d
70
    f.close()
71
  end
72
end
73
args = {...}
74
if #args < 2 then print("Usage: package <directory> <output file> [display name]") return end
75
dir = args[1]
76
if dir:sub(1, 1) ~= "/" then
77
  dir = "/"..fs.getDir(shell.getRunningProgram()).."/"..dir
78
end
79
file = args[2]
80
if file:sub(1, 1) ~= "/" then
81
  file = "/"..fs.getDir(shell.getRunningProgram()).."/"..file
82
end
83
fs.delete(file)
84
name = args[3] or fs.getName(dir)
85
if not fs.isDir(dir) then print("Directory "..dir.." doesn't exist") return end
86
data = ""
87
add("")
88
program = "--Created with Packager by CrazedProgrammer\nb='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' function frombase64(data) data = string.gsub(data, '[^'..b..'=]', '') return (data:gsub('.', function(x) if (x == '=') then return '' end local r,f='',(b:find(x)-1) for i=6,1,-1 do r=r..(f%2^i-f%2^(i-1)>0 and '1' or '0') end return r; end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x) if (#x ~= 8) then return '' end local c=0 for i=1,8 do c=c+(x:sub(i,i)=='1' and 2^(8-i) or 0) end return string.char(c) end)) end function lzw_decode(s) local str = { } for i=1,#s/2,1 do table.insert(str, s:byte(i * 2 - 1) * 256 + s:byte(i * 2)) end local dict_size = 256 local dict = {} for i = 0, dict_size-1 do dict[i] = string.char(i) end local w = string.char(str[1]) local result = w for i = 2, #str do local k = str[i] local entry = '' if dict[k] then entry = dict[k] elseif k == dict_size then entry = w .. w:sub(1,1) else return nil end result = result .. entry dict[dict_size] = w .. entry:sub(1,1) dict_size = dict_size + 1 w = entry end return result end d = '"..tobase64(data).."' data = frombase64(d) print('Where do you want to extract "..name.."?') dir = read() if dir:sub(1,1) ~= '/' then dir = '/'..fs.getDir(shell.getRunningProgram())..'/'..dir end fs.delete(dir) local i = 1 local path = '' while i <= #data do local c = data:byte(i) if c == 0 then i = i + 1 local l = data:byte(i) path = dir..'/'..data:sub(i + 1, i + l) i = i + l + 1 elseif c == 1 then i = i + 3 local l = data:byte(i - 2) * 65536 + data:byte(i - 1) * 256 + data:byte(i) local f = fs.open(path, 'w') f.write(lzw_decode(data:sub(i + 1, i + l))) f.close() i = i + l + 1 elseif c == 2 then fs.makeDir(path) i = i + 1 end end print('Extraced to '..dir..'.')"
89
local f = fs.open(file, "w")
90
f.write(program)
91
f.close()