The other week, I had an itch to write a Roff snippet to report the name of a running Troff implementation. While this is *not* meant for serious use, it *does* work well to distinguish mandoc(1), groff(1) and Heirloom:
.\" Identify the formatter processing the document.
.\" The program's name is stored in the `T?` string.
.if !\n(T? \{
. nf
. nr A \n(.d
\v'2m'
. nr B \n(.d
\v'-2m'
. ie '\nA'\nB' .ds T? mandoc
. el \{
. ie 0<>1 .ds T? heirloom
. el \{
. nr A 1
. do if \n[A]=1 .ds T? groff
. \}
. \}
. rr A
. rr B
. if 'T?'' .ds T? unknown
.\}
\fBInterpreter\fP: \*(T?
*Output:*
$ mandoc which.roff
Interpreter: mandoc
> $ groff -Tutf8 which.roff
Interpreter: groff
> $ /usr/local/ucb/nroff which.roff
Interpreter: heirloom
$ /usr/local/ucb/nroff -x0 which.roff
Interpreter:
That last example demonstrates how it's of no use when running Heirloom
with extensions disabled. I haven't tested with older versions of each
interpreter, either, but I doubt the results should differ. So far, it's
already been more helpful than Groff's \n[.g] register (which we know other
modern implementations will spoof).
Feedback is warmly welcomed! I'm sure the output can be cleaned up too,
there're excess newlines everywhere... :\
- John
which.roff
Description: Troff document
