about summary refs log tree commit diff
path: root/exman.in
diff options
context:
space:
mode:
Diffstat (limited to 'exman.in')
-rw-r--r--exman.in52
1 files changed, 52 insertions, 0 deletions
diff --git a/exman.in b/exman.in
new file mode 100644
index 0000000..7d4a9c8
--- /dev/null
+++ b/exman.in
@@ -0,0 +1,52 @@
+#!/bin/sh
+set -eu
+
+die() {
+	echo "$@" >&2
+	exit 1
+}
+
+system=${1:-}
+[ -n "${system}" ] || die 'What system do you want?'
+shift
+
+export MANPATH="%%EXMANDIR%%/${system}"
+[ -d "${MANPATH}" ] || die "No manuals for ${system}"
+
+export MANSECT
+for sect in "${MANPATH}"/man*/; do
+	sect=${sect%/}
+	sect=${sect##*/man}
+	MANSECT="${MANSECT:-}${MANSECT:+:}${sect}"
+done
+
+# macOS man(1) refuses to search in directories such as "man3p", so do it
+# manually here unless there are other flags passed.
+hack() {
+	case "${1:-}" in
+		(-*) exec man "$@";;
+		([0-9]*) MANSECT=$1; shift;;
+	esac
+	[ $# -gt 0 ] || die 'What manual page do you want?'
+	for page in "$@"; do
+		found=0
+		IFS=:
+		for sect in $MANSECT; do
+			path="${MANPATH}/man${sect}/${page}"
+			for ext in ".${sect}" ".${sect}.gz"; do
+				[ -f "${path}${ext}" ] || continue
+				man "${path}${ext}"
+				found=1
+				break
+			done
+			[ $found -eq 0 ] || break
+		done
+		[ $found -ne 0 ] || die "No manual entry for ${page}"
+	done
+}
+
+if [ "$(uname)" = 'Darwin' ]; then
+	hack "$@"
+else
+	exec man "$@"
+fi