ff tab counter
parent
b8d4874625
commit
dfbfab5102
|
@ -0,0 +1,55 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <endian.h>
|
||||||
|
|
||||||
|
#include <simdjson.h>
|
||||||
|
#include <lz4.h>
|
||||||
|
using namespace simdjson;
|
||||||
|
// /home/yorick/.mozilla/firefox/sdgle03g.default/sessionstore-backups/recovery.jsonlz4
|
||||||
|
// jq '.windows | map(.tabs | length) | add'
|
||||||
|
|
||||||
|
padded_string read_mozlz4a_file(const std::string& file) {
|
||||||
|
std::ifstream is(file, std::ifstream::binary);
|
||||||
|
if (!is) {
|
||||||
|
std::cerr << "error opening file" << std::endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
is.seekg(0, is.end);
|
||||||
|
size_t insz = is.tellg();
|
||||||
|
is.seekg(0, is.beg);
|
||||||
|
char * buffer = new char[insz];
|
||||||
|
is.read(buffer, insz);
|
||||||
|
if (!is) {
|
||||||
|
std::cerr << "error reading file" << std::endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
is.close();
|
||||||
|
if (memcmp(buffer, "mozLz40", 8)) {
|
||||||
|
std::cerr << "not a mozLZa file" << std::endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
size_t outsz = le32toh(*(uint32_t *) (buffer + 8));
|
||||||
|
padded_string out(outsz);
|
||||||
|
if (LZ4_decompress_safe_partial(buffer + 12, out.data(), insz - 12, outsz, outsz) < 0) {
|
||||||
|
std::cerr << "decompression error" << std::endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int ac, char **av) {
|
||||||
|
ondemand::parser parser;
|
||||||
|
if (ac < 2) {
|
||||||
|
std::cerr << "usage: " << av[0] << " .mozilla/firefox/*.default/sessionstore-backups/recovery.jsonlz4" << std::endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
padded_string json = read_mozlz4a_file(av[1]);
|
||||||
|
ondemand::document session = parser.iterate(json);
|
||||||
|
ondemand::array windows = session["windows"];
|
||||||
|
size_t n = 0;
|
||||||
|
for (auto i : windows) {
|
||||||
|
ondemand::array tabs = i["tabs"];
|
||||||
|
n += tabs.count_elements();
|
||||||
|
}
|
||||||
|
std::cout << n << std::endl;
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
stdenv, simdjson, lz4
|
||||||
|
}:
|
||||||
|
stdenv.mkDerivation {
|
||||||
|
name = "countfftabs";
|
||||||
|
src = ./.;
|
||||||
|
buildInputs = [simdjson lz4];
|
||||||
|
buildPhase = ''
|
||||||
|
runHook preBuild
|
||||||
|
g++ -o ./countfftabs count.cpp -I${simdjson}/include -L${simdjson}/lib -lsimdjson -llz4
|
||||||
|
runHook postBuild
|
||||||
|
'';
|
||||||
|
installPhase = "mkdir -p $out/bin; mv ./countfftabs $out/bin/";
|
||||||
|
}
|
|
@ -15,5 +15,23 @@
|
||||||
playerctl = super.playerctl.overrideAttrs (o: {
|
playerctl = super.playerctl.overrideAttrs (o: {
|
||||||
patches = (o.patches or []) ++ [ ./playerctl-solid-emoji.diff ];
|
patches = (o.patches or []) ++ [ ./playerctl-solid-emoji.diff ];
|
||||||
});
|
});
|
||||||
|
countfftabs = super.callPackage ./countfftabs {};
|
||||||
|
lz4json = super.stdenv.mkDerivation (o: {
|
||||||
|
pname = "lz4json";
|
||||||
|
version = "20191229";
|
||||||
|
src = super.fetchFromGitHub {
|
||||||
|
repo = o.pname;
|
||||||
|
owner = "andikleen";
|
||||||
|
rev = "c44c51005c505de2636cc1e59cde764490de7632";
|
||||||
|
hash = "sha256-rLjJ7qy7Tx0htW1VxrfCCqVbC6jNCr9H2vdDAfosxCA=";
|
||||||
|
};
|
||||||
|
buildInputs = [ super.lz4 ];
|
||||||
|
nativeBuildInputs = [ super.pkg-config ];
|
||||||
|
installPhase = ''
|
||||||
|
runHook preInstall
|
||||||
|
install -D -t $out/bin lz4jsoncat
|
||||||
|
runHook postInstall
|
||||||
|
'';
|
||||||
|
});
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue