BangleApps/apps/spacew/prep/minitar.js

80 lines
1.8 KiB
JavaScript
Executable File

#!/usr/bin/nodejs
// https://stackoverflow.com/questions/49129643/how-do-i-merge-an-array-of-uint8arrays
var pc = 1;
const hs = require('./heatshrink.js');
if (pc) {
fs = require('fs');
var print=console.log;
}
function writeDir(json) {
json_str = JSON.stringify(json, "", " ");
dirent = '' + json_str.length;
while (dirent.length < 6)
dirent = dirent + ' ';
return dirent + json_str;
}
function writeTar(tar, dir) {
var h_len = 16;
var cur = h_len;
files = fs.readdirSync(dir);
let data = [];
var directory = '';
var json = {};
for (f of files) {
let f_rec = {};
d = fs.readFileSync(dir+f);
if (0) {
cs = hs.compress(d);
f_rec.comp = "hs";
} else
cs = d;
print("Processing", f, cur, d.length, cs.length);
data.push(cs);
f_rec.st = cur;
var len = cs.length;
f_rec.si = len;
cur = cur + len;
json[f] = f_rec;
json_str = JSON.stringify(json, "", " ");
if (json_str.length < 16000)
continue;
directory += writeDir(json);
json = {};
}
directory += writeDir(json);
directory += '-1 ';
size = cur;
header = '' + size;
while (header.length < h_len) {
header = header+' ';
}
fs.writeFileSync(tar, header);
for (d of data)
fs.appendFileSync(tar, Buffer.from(d));
fs.appendFileSync(tar, directory);
}
function readTarFile(tar, f) {
const st = require('Storage');
json_off = st.read(tar, 0, 16) * 1;
print(json_off);
json = st.read(tar, json_off, -1);
files = JSON.parse(json);
rec = files[f];
return st.read(tar, rec.st, rec.si);
}
if (pc)
writeTar("delme.mtar", "delme/");
else {
print(readTarFile("delme.mtar", "ahoj"));
print(readTarFile("delme.mtar", "nazdar"));
}