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() |