From 50cfb2bbf2462de27773dee070cc2aacfc0c31d1 Mon Sep 17 00:00:00 2001 From: Sam Roxanne Date: Tue, 2 Jun 2020 19:09:37 -0500 Subject: [PATCH] s m o l --- .buildactions/00_init.lua | 6 +++ .buildactions/10_zlua.lua | 19 ++++++++ .buildactions/90_package.lua | 6 +++ build.sh | 16 +------ build.sh.old | 14 ++++++ escape.lua | 22 ++++++++++ luabuild.lua | 47 ++++++++++++++++++++ module/bootloader.lua | 21 +++++++++ psychos.tsar | Bin 0 -> 28506 bytes test.lua | Bin 0 -> 5838 bytes zlua.lua | 82 +++++++++++++++++++++++++++++++++++ 11 files changed, 219 insertions(+), 14 deletions(-) create mode 100644 .buildactions/00_init.lua create mode 100644 .buildactions/10_zlua.lua create mode 100644 .buildactions/90_package.lua create mode 100755 build.sh.old create mode 100644 escape.lua create mode 100644 luabuild.lua create mode 100644 module/bootloader.lua create mode 100644 psychos.tsar create mode 100644 test.lua create mode 100644 zlua.lua diff --git a/.buildactions/00_init.lua b/.buildactions/00_init.lua new file mode 100644 index 0000000..1bcda07 --- /dev/null +++ b/.buildactions/00_init.lua @@ -0,0 +1,6 @@ +function actions.init() + os.execute("mkdir -p target") + os.execute("luacomp module/bootloader.lua -O target/init.lua") +end + +actions[#actions+1] = "init" \ No newline at end of file diff --git a/.buildactions/10_zlua.lua b/.buildactions/10_zlua.lua new file mode 100644 index 0000000..1a490e6 --- /dev/null +++ b/.buildactions/10_zlua.lua @@ -0,0 +1,19 @@ +local function makezlua(file) + local path = file:match("^(.+)/.+%..+$") + os.execute("mkdir -p target/"..path) + os.execute("cat "..file.." | luamin -c | lua zlua.lua > target/"..file) +end + +function actions.files() + local libs = find("lib", "*.lua") + local svcs = find("service", "*.lua") + for i=1, #libs do + makezlua(libs[i]) + end + + for i=1, #svcs do + makezlua(svcs[i]) + end +end + +actions[#actions+1] = "files" \ No newline at end of file diff --git a/.buildactions/90_package.lua b/.buildactions/90_package.lua new file mode 100644 index 0000000..1137183 --- /dev/null +++ b/.buildactions/90_package.lua @@ -0,0 +1,6 @@ +function actions.package() + os.execute("cp -r cfg target") + os.execute("cd target; find $".."(ls) -depth | tsar -o > ../psychos.tsar") +end + +actions[#actions+1] = "package" \ No newline at end of file diff --git a/build.sh b/build.sh index a20c7b7..8d55862 100755 --- a/build.sh +++ b/build.sh @@ -1,14 +1,2 @@ -#!/bin/bash -LUA=${LUA:-lua} -rm -r target/* -mkdir -p target/doc &>/dev/null -$LUA luapreproc.lua module/init.lua target/init.lua -echo _OSVERSION=\"PsychOS 2.0a2-$(git rev-parse --short HEAD)\" > target/version.lua -cat target/version.lua target/init.lua > target/tinit.lua -mv target/tinit.lua target/init.lua -cp -r service/ lib/ cfg/ target/ -rm target/version.lua -rm -r doc/ &>/dev/null -$LUA finddesc.lua doc/ $(find lib/ module/ -type f|sort) -$LUA gendoc.lua target/doc/kernel.dict $(find module/ -type f|sort) -pandoc doc/apidoc.md docs-metadata.yml --template=template.tex -o doc/apidoc.pdf +#!/usr/bin/env bash +luacomp luabuild.lua 2>/dev/null | lua - $@ \ No newline at end of file diff --git a/build.sh.old b/build.sh.old new file mode 100755 index 0000000..a20c7b7 --- /dev/null +++ b/build.sh.old @@ -0,0 +1,14 @@ +#!/bin/bash +LUA=${LUA:-lua} +rm -r target/* +mkdir -p target/doc &>/dev/null +$LUA luapreproc.lua module/init.lua target/init.lua +echo _OSVERSION=\"PsychOS 2.0a2-$(git rev-parse --short HEAD)\" > target/version.lua +cat target/version.lua target/init.lua > target/tinit.lua +mv target/tinit.lua target/init.lua +cp -r service/ lib/ cfg/ target/ +rm target/version.lua +rm -r doc/ &>/dev/null +$LUA finddesc.lua doc/ $(find lib/ module/ -type f|sort) +$LUA gendoc.lua target/doc/kernel.dict $(find module/ -type f|sort) +pandoc doc/apidoc.md docs-metadata.yml --template=template.tex -o doc/apidoc.pdf diff --git a/escape.lua b/escape.lua new file mode 100644 index 0000000..8ee51f2 --- /dev/null +++ b/escape.lua @@ -0,0 +1,22 @@ +local function mkstr(d) + local dat = "\"" + for i=1, #d do + if (d:sub(i,i) == "\\") then + dat = dat .. ("\\\\") + elseif (d:sub(i,i) == "\"") then + dat = dat .. ("\\\"") + elseif (d:sub(i,i) == "\n") then + dat = dat .. ("\\n") + elseif (d:sub(i,i) == "\r") then + dat = dat .. ("\\r") + elseif (d:sub(i,i) == "\t") then + dat = dat .. ("\\t") + else + dat = dat .. (d:sub(i,i)) + end + end + dat = dat .. ("\"") + return dat +end + +io.stdout:write(mkstr(io.stdin:read("*a"))) \ No newline at end of file diff --git a/luabuild.lua b/luabuild.lua new file mode 100644 index 0000000..2a86453 --- /dev/null +++ b/luabuild.lua @@ -0,0 +1,47 @@ +local actions = {} + +local function list(dir) + local h = io.popen("ls \""..dir.."\"", "r") + local ents = {} + for l in h:lines() do + ents[#ents+1] = l + end + h:close() + return ents +end + +local function find(dir, pattern, inverse, ctype) + local h = io.popen("find \""..dir.."\" "..(((inverse) and "-not ") or "")..(((ctype) and "-type "..ctype.." ") or "").."-name \""..pattern.."\"", "r") + local ents = {} + for l in h:lines() do + ents[#ents+1] = l + end + h:close() + return ents +end + +local function lastmod(file) + local h = io.popen("stat -c %Y \""..file.."\"") + local num = tonumber(h:read("*a")) + h:close() + return num +end + +@[[local h = io.popen("ls .buildactions", "r") +for line in h:lines() do]] +--#include @[{".buildactions/"..line}] +@[[end]] + +function actions.all() + for i=1, #actions do + actions[actions[i]]() + end +end + +if not arg[1] then + arg[1] = "all" +end + +actions[arg[1]]() + +print("Build complete.") \ No newline at end of file diff --git a/module/bootloader.lua b/module/bootloader.lua new file mode 100644 index 0000000..7916e3e --- /dev/null +++ b/module/bootloader.lua @@ -0,0 +1,21 @@ +_OSVERSION="PsychOS 2.0a2-$[[git rev-parse --short HEAD]]" +function lzss_decompress(a)local b,c,d,e,j,i,h,g=1,'',''while b<=#a do +e=c.byte(a,b)b=b+1 +for k=0,7 do h=c.sub +g=h(a,b,b)if e>>k&1<1 and b<#a then +i=c.unpack('>I2',a,b)j=1+(i>>4)g=h(d,j,j+(i&15)+2)b=b+1 +end +b=b+1 +c=c..g +d=h(d..g,-4^6)end +end +return c end +local oload = load +function load(src, ...) + if (src:sub(1,4) == "\27ZLS") then + src = lzss_decompress(src:sub(5)) + end + return oload(src, ...) +end + +load($[[ luacomp -mluamin module/init.lua | lua zlua.lua | lua escape.lua ]])() \ No newline at end of file diff --git a/psychos.tsar b/psychos.tsar new file mode 100644 index 0000000000000000000000000000000000000000..da8a4fe3b2349165635b7edf10b409edeb45c685 GIT binary patch literal 28506 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 literal 0 HcmV?d00001 diff --git a/test.lua b/test.lua new file mode 100644 index 0000000000000000000000000000000000000000..9c2edfe5797014189b0e46b60a6ed7264fa36959 GIT binary patch literal 5838 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 literal 0 HcmV?d00001 diff --git a/zlua.lua b/zlua.lua new file mode 100644 index 0000000..f959b6b --- /dev/null +++ b/zlua.lua @@ -0,0 +1,82 @@ +local f = io.stdin:read("*a") + +--[[---------------------------------------------------------------------------- + LZSS - encoder / decoder + This is free and unencumbered software released into the public domain. + Anyone is free to copy, modify, publish, use, compile, sell, or + distribute this software, either in source code form or as a compiled + binary, for any purpose, commercial or non-commercial, and by any + means. + In jurisdictions that recognize copyright laws, the author or authors + of this software dedicate any and all copyright interest in the + software to the public domain. We make this dedication for the benefit + of the public at large and to the detriment of our heirs and + successors. We intend this dedication to be an overt act of + relinquishment in perpetuity of all present and future rights to this + software under copyright law. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + For more information, please refer to +--]]---------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +local M = {} +local string, table = string, table + +-------------------------------------------------------------------------------- +local POS_BITS = 12 +local LEN_BITS = 16 - POS_BITS +local POS_SIZE = 1 << POS_BITS +local LEN_SIZE = 1 << LEN_BITS +local LEN_MIN = 3 + +-------------------------------------------------------------------------------- +function M.compress(input) + local offset, output = 1, {} + local window = '' + + local function search() + for i = LEN_SIZE + LEN_MIN - 1, LEN_MIN, -1 do + local str = string.sub(input, offset, offset + i - 1) + local pos = string.find(window, str, 1, true) + if pos then + return pos, str + end + end + end + + while offset <= #input do + local flags, buffer = 0, {} + + for i = 0, 7 do + if offset <= #input then + local pos, str = search() + if pos and #str >= LEN_MIN then + local tmp = ((pos - 1) << LEN_BITS) | (#str - LEN_MIN) + buffer[#buffer + 1] = string.pack('>I2', tmp) + else + flags = flags | (1 << i) + str = string.sub(input, offset, offset) + buffer[#buffer + 1] = str + end + window = string.sub(window .. str, -POS_SIZE) + offset = offset + #str + else + break + end + end + + if #buffer > 0 then + output[#output + 1] = string.char(flags) + output[#output + 1] = table.concat(buffer) + end + end + + return table.concat(output) +end + +io.stdout:write("\27ZLS"..M.compress(f)) \ No newline at end of file