1#! /bin/sh
2# grog -- guess options for groff command
3# Like doctype in Kernighan & Pike, Unix Programming Environment, pp 306-8.
4
5soelim=@g@soelim
6
7opts=
8sp="([	 ]|$)"
9
10for arg
11do
12	case "$arg" in
13	--)
14		shift; break;;
15	-)
16		break;;
17	-C)
18		sp=; opts="$opts -C"; shift; break;;
19	-v | --version)
20		echo "GNU grog (groff) version @VERSION@"
21		exit 0;;
22	--help)
23		echo "usage: grog [ option ...] [files...]"
24		exit 0;;
25	-*)
26		opts="$opts $arg"; shift;;
27	*)
28		break;;
29	esac
30done
31
32egrep -h "^\.(\[|\])|((P|PS|[PLI]P|[pnil]p|sh|Dd|Tp|Dp|De|Cx|Cl|Oo|.* Oo|Oc|.* Oc|TS|EQ|TH|SH|so|\[|R1|GS|G1|PH|SA)$sp)" $* \
33| sed -e '/^\.so/s/^.*$/.SO_START\
34&\
35.SO_END/' \
36| $soelim \
37| egrep '^\.(P|PS|[PLI]P|[pnil]p|sh|Dd|Tp|Dp|De|Cx|Cl|Oo|.* Oo|Oc|.* Oc|TS|EQ|TH|SH|\[|\]|R1|GS|G1|PH|SA|SO_START|SO_END)' \
38| awk '
39/^\.SO_START$/ { so = 1 }
40/^\.SO_END$/ { so = 0 }
41/^\.TS/ { tbl++; if (so > 0) soelim++ }
42/^\.PS([ 0-9.<].*)?$/ { pic++; if (so > 0) soelim++ }
43/^\.EQ/ { eqn++; if (so > 0) soelim++ }
44/^\.R1/ { refer++; if (so > 0) soelim++ }
45/^\.\[/ {refer_start++; if (so > 0) soelim++ }
46/^\.\]/ {refer_end++; if (so > 0) soelim++ }
47/^\.GS/ { grn++; if (so > 0) soelim++ }
48/^\.G1/ { grap++; pic++; if (so > 0) soelim++ }
49/^\.TH/ { TH++ }
50/^\.[PLI]P/ { PP++ }
51/^\.P$/ { P++ }
52/^\.SH/ { SH++ }
53/^\.(PH|SA)/ { mm++ }
54/^\.([pnil]p|sh)/ { me++ }
55/^\.Dd/ { mdoc++ }
56/^\.(Tp|Dp|De|Cx|Cl)/ { mdoc_old++ }
57/^\.(O[oc]|.* O[oc]( |$))/ {
58	sub(/\\\".*/, "")
59	gsub(/\"[^\"]*\"/, "")
60	sub(/\".*/, "")
61	sub(/^\.Oo/, " Oo ")
62	sub(/^\.Oc/, " Oc ")
63	sub(/ Oo$/, " Oo ")
64	sub(/ Oc$/, " Oc ")
65	while (/ Oo /) {
66		sub(/ Oo /, " ")
67		Oo++
68	}
69	while (/ Oc /) {
70		sub(/ Oc /, " ")
71		Oo--
72	}
73}
74/^\.(PRINTSTYLE|START)/ { mom++ }
75
76END {
77	if (files ~ /^-/)
78		files = "-- " files
79	printf "groff"
80	refer = refer || (refer_start && refer_end)
81	if (pic > 0 || tbl > 0 || grn > 0 || grap > 0 || eqn > 0 || refer > 0) {
82		printf " -"
83		if (soelim > 0) printf "s"
84		if (refer > 0) printf "R"
85		if (grn > 0) printf "g"
86		if (grap > 0) printf "G"
87		if (pic > 0) printf "p"
88		if (tbl > 0) printf "t"
89		if (eqn > 0) printf "e"
90	}
91	if (me > 0)
92		printf " -me"
93	else if (SH > 0 && TH > 0)
94		printf " -man"
95	else if (mom > 0)
96		printf " -mom"
97	else if (PP > 0)
98		printf " -ms"
99	else if (P > 0 || mm > 0)
100		printf " -mm"
101	else if (mdoc > 0) {
102		if (mdoc_old > 0 || Oo > 0)
103			printf " -mdoc-old"
104		else
105			printf " -mdoc"
106	}
107	if (opts != "")
108		printf "%s", opts
109	if (files != "")
110		printf " %s", files
111	print ""
112}' "opts=$opts" "files=$*" -
113