diff --git a/pkgs/countfftabs/count.cpp b/pkgs/countfftabs/count.cpp new file mode 100644 index 0000000..b771342 --- /dev/null +++ b/pkgs/countfftabs/count.cpp @@ -0,0 +1,55 @@ +#include +#include +#include + +#include +#include +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; +} diff --git a/pkgs/countfftabs/default.nix b/pkgs/countfftabs/default.nix new file mode 100644 index 0000000..d71f9da --- /dev/null +++ b/pkgs/countfftabs/default.nix @@ -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/"; +} diff --git a/pkgs/default.nix b/pkgs/default.nix index fa65623..12fb31e 100644 --- a/pkgs/default.nix +++ b/pkgs/default.nix @@ -15,5 +15,23 @@ playerctl = super.playerctl.overrideAttrs (o: { 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 + ''; + }); })