From f7cb1a14484bcbbc16fc26df69445affeef99f6d Mon Sep 17 00:00:00 2001 From: Profpatsch Date: Thu, 6 Apr 2017 06:08:56 +0200 Subject: pkgs/profpatsch: add nman --- pkgs/profpatsch/nman/default.nix | 12 ++++++ pkgs/profpatsch/nman/nman.c | 80 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 pkgs/profpatsch/nman/default.nix create mode 100644 pkgs/profpatsch/nman/nman.c (limited to 'pkgs/profpatsch/nman') diff --git a/pkgs/profpatsch/nman/default.nix b/pkgs/profpatsch/nman/default.nix new file mode 100644 index 00000000..10e5417f --- /dev/null +++ b/pkgs/profpatsch/nman/default.nix @@ -0,0 +1,12 @@ +{ lib, runCommandCC }: + +runCommandCC "nman" { + meta = with lib; { + description = "Invoke manpage in temporary nix-shell"; + license = licenses.gpl3; + }; +} '' + cc -o nman ${./nman.c} + install -D nman $out/bin/nman +'' + diff --git a/pkgs/profpatsch/nman/nman.c b/pkgs/profpatsch/nman/nman.c new file mode 100644 index 00000000..0e02ff3e --- /dev/null +++ b/pkgs/profpatsch/nman/nman.c @@ -0,0 +1,80 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include + +const char* USAGE = + "nman drvAttr [section|page] [page]\n" + "\n" + "Open man pages in a temporary nix-shell.\n" + "1 If one argument is given, the drvAttr & page have the same name.\n" + "2 If two arguments are given and the second arg is\n" + " a ) like 1, but in man section \n" + " a ) like 1, but open the page \n" + "3 If three arguments are given, the order is \n"; + +void execNixShell(char const* drvAttr, int manSection, const char* manPage) { + assert(manSection >= -1); + char* manCmd; + // holy debug printf + //printf("attr: %s, sect: %d, page: %s\n", drvAttr, manSection, manPage); + int ret; + if (-1 == manSection) { + ret = asprintf(&manCmd, "man %s", manPage); + } else { + ret = asprintf(&manCmd, "man %d %s", manSection, manPage); + } + assert(ret != -1); + + if (-1 == execlp("nix-shell", "nix-shell", "-p", drvAttr, "--run", manCmd, NULL)) { + fprintf(stderr, "%s\n", strerror(errno)); + exit(-1); + } + free(manCmd); +} + +int main(int argc, char** argv) { + int manSection = -1; + char* drvAttr; + char* manPage; + if (argc >= 3) { + // man section or -1 if no man section + int i = strtol(argv[2], NULL, 10); + if (i > 1) { + manSection = i; + } + } + // the first argument is always a derivation attribute + drvAttr = argv[1]; + + // nman does a convenient selection based on the number + // of attributes given, in order to do what the user means. + switch (argc) { + case 1: + fprintf(stderr, "%s", USAGE); + exit(-1); + break; + case 2: + // arg is package and drv attr + manPage = argv[1]; + break; + case 3: + if (manSection == -1) { + // like 2:, but arg 2 is package + manPage = argv[2]; + } else { + // man section given, page is arg 1 + manPage = argv[1]; + } + break; + case 4: + // arg 2 is manSection, arg 3 is package + manPage = argv[3]; + break; + } + + execNixShell(drvAttr, manSection, manPage); +} -- cgit 1.4.1