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

Attachment: which.roff
Description: Troff document

Reply via email to