xref: /aosp_15_r20/external/iputils/doc/docbook2man-spec.pl (revision bd1f8aeb6080fa6544ec30aeca3eb4da100f359f)
1*bd1f8aebSAndroid Build Coastguard Worker=head1 NAME
2*bd1f8aebSAndroid Build Coastguard Worker
3*bd1f8aebSAndroid Build Coastguard Workerdocbook2man-spec - convert DocBook RefEntries to Unix manpages
4*bd1f8aebSAndroid Build Coastguard Worker
5*bd1f8aebSAndroid Build Coastguard Worker=head1 SYNOPSIS
6*bd1f8aebSAndroid Build Coastguard Worker
7*bd1f8aebSAndroid Build Coastguard WorkerThe SGMLSpm package from CPAN.  This contains the sgmlspl script which
8*bd1f8aebSAndroid Build Coastguard Workeris used to grok this file.  Use it like this:
9*bd1f8aebSAndroid Build Coastguard Worker
10*bd1f8aebSAndroid Build Coastguard Workernsgmls some-docbook-document.sgml | sgmlspl docbook2man-spec.pl
11*bd1f8aebSAndroid Build Coastguard Worker
12*bd1f8aebSAndroid Build Coastguard Worker=head1 DESCRIPTION
13*bd1f8aebSAndroid Build Coastguard Worker
14*bd1f8aebSAndroid Build Coastguard WorkerThis is a sgmlspl spec file that produces Unix-style
15*bd1f8aebSAndroid Build Coastguard Workermanpages from RefEntry markup.
16*bd1f8aebSAndroid Build Coastguard Worker
17*bd1f8aebSAndroid Build Coastguard WorkerSee the accompanying RefEntry man page for 'plain new' documentation. :)
18*bd1f8aebSAndroid Build Coastguard Worker
19*bd1f8aebSAndroid Build Coastguard Worker=head1 LIMITATIONS
20*bd1f8aebSAndroid Build Coastguard Worker
21*bd1f8aebSAndroid Build Coastguard WorkerTrying docbook2man on non-DocBook or non-conformant SGML results in
22*bd1f8aebSAndroid Build Coastguard Workerundefined behavior. :-)
23*bd1f8aebSAndroid Build Coastguard Worker
24*bd1f8aebSAndroid Build Coastguard WorkerThis program is a slow, dodgy Perl script.
25*bd1f8aebSAndroid Build Coastguard Worker
26*bd1f8aebSAndroid Build Coastguard WorkerThis program does not come close to supporting all the possible markup
27*bd1f8aebSAndroid Build Coastguard Workerin DocBook, and will produce wrong output in some cases with supported
28*bd1f8aebSAndroid Build Coastguard Workermarkup.
29*bd1f8aebSAndroid Build Coastguard Worker
30*bd1f8aebSAndroid Build Coastguard Worker=head1 TODO
31*bd1f8aebSAndroid Build Coastguard Worker
32*bd1f8aebSAndroid Build Coastguard WorkerAdd new element handling and fix existing handling.  Be robust.
33*bd1f8aebSAndroid Build Coastguard WorkerProduce cleanest, readable man output as possible (unlike some
34*bd1f8aebSAndroid Build Coastguard Workerother converters).  Follow Linux man(7) convention.
35*bd1f8aebSAndroid Build Coastguard WorkerIf this results in added logic in this script,
36*bd1f8aebSAndroid Build Coastguard Workerthat's okay.  The code should still be reasonably organized.
37*bd1f8aebSAndroid Build Coastguard Worker
38*bd1f8aebSAndroid Build Coastguard WorkerMake it faster.  If Perl sucks port it to another language.
39*bd1f8aebSAndroid Build Coastguard Worker
40*bd1f8aebSAndroid Build Coastguard Worker=head1 COPYRIGHT
41*bd1f8aebSAndroid Build Coastguard Worker
42*bd1f8aebSAndroid Build Coastguard WorkerCopyright (C) 1998-1999 Steve Cheng <[email protected]>
43*bd1f8aebSAndroid Build Coastguard Worker
44*bd1f8aebSAndroid Build Coastguard WorkerThis program is free software; you can redistribute it and/or modify it
45*bd1f8aebSAndroid Build Coastguard Workerunder the terms of the GNU General Public License as published by the Free
46*bd1f8aebSAndroid Build Coastguard WorkerSoftware Foundation; either version 2, or (at your option) any later
47*bd1f8aebSAndroid Build Coastguard Workerversion.
48*bd1f8aebSAndroid Build Coastguard Worker
49*bd1f8aebSAndroid Build Coastguard WorkerYou should have received a copy of the GNU General Public License along with
50*bd1f8aebSAndroid Build Coastguard Workerthis program; see the file COPYING.  If not, please write to the Free
51*bd1f8aebSAndroid Build Coastguard WorkerSoftware Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
52*bd1f8aebSAndroid Build Coastguard Worker
53*bd1f8aebSAndroid Build Coastguard Worker=cut
54*bd1f8aebSAndroid Build Coastguard Worker
55*bd1f8aebSAndroid Build Coastguard Worker# $Id: docbook2man-spec.pl,v 1.1 2000/07/21 20:22:30 rosalia Exp $
56*bd1f8aebSAndroid Build Coastguard Worker
57*bd1f8aebSAndroid Build Coastguard Workeruse SGMLS;			# Use the SGMLS package.
58*bd1f8aebSAndroid Build Coastguard Workeruse SGMLS::Output;		# Use stack-based output.
59*bd1f8aebSAndroid Build Coastguard Workeruse SGMLS::Refs;
60*bd1f8aebSAndroid Build Coastguard Worker
61*bd1f8aebSAndroid Build Coastguard Worker########################################################################
62*bd1f8aebSAndroid Build Coastguard Worker# SGMLSPL script produced automatically by the script sgmlspl.pl
63*bd1f8aebSAndroid Build Coastguard Worker#
64*bd1f8aebSAndroid Build Coastguard Worker# Document Type: any, but processes only RefEntries
65*bd1f8aebSAndroid Build Coastguard Worker# Edited by: me :)
66*bd1f8aebSAndroid Build Coastguard Worker########################################################################
67*bd1f8aebSAndroid Build Coastguard Worker
68*bd1f8aebSAndroid Build Coastguard Worker$write_manpages = 0;
69*bd1f8aebSAndroid Build Coastguard Worker$blank_xrefs = 0;
70*bd1f8aebSAndroid Build Coastguard Worker
71*bd1f8aebSAndroid Build Coastguard Workersgml('start', sub {
72*bd1f8aebSAndroid Build Coastguard Worker	push_output('nul');
73*bd1f8aebSAndroid Build Coastguard Worker	$raw_cdata = 1;			# Makes it a bit faster.
74*bd1f8aebSAndroid Build Coastguard Worker
75*bd1f8aebSAndroid Build Coastguard Worker	# Links file
76*bd1f8aebSAndroid Build Coastguard Worker	open(LINKSFILE, ">manpage.links");
77*bd1f8aebSAndroid Build Coastguard Worker
78*bd1f8aebSAndroid Build Coastguard Worker	$Refs = new SGMLS::Refs("manpage.refs");
79*bd1f8aebSAndroid Build Coastguard Worker});
80*bd1f8aebSAndroid Build Coastguard Workersgml('end', sub {
81*bd1f8aebSAndroid Build Coastguard Worker	close(LINKSFILE);
82*bd1f8aebSAndroid Build Coastguard Worker	if($blank_xrefs) {
83*bd1f8aebSAndroid Build Coastguard Worker		print STDERR "Warning: output contains unresolved XRefs\n";
84*bd1f8aebSAndroid Build Coastguard Worker	}
85*bd1f8aebSAndroid Build Coastguard Worker});
86*bd1f8aebSAndroid Build Coastguard Worker
87*bd1f8aebSAndroid Build Coastguard Worker
88*bd1f8aebSAndroid Build Coastguard Worker
89*bd1f8aebSAndroid Build Coastguard Worker
90*bd1f8aebSAndroid Build Coastguard Worker########################################################################
91*bd1f8aebSAndroid Build Coastguard Worker#
92*bd1f8aebSAndroid Build Coastguard Worker# Output helpers
93*bd1f8aebSAndroid Build Coastguard Worker#
94*bd1f8aebSAndroid Build Coastguard Worker########################################################################
95*bd1f8aebSAndroid Build Coastguard Worker
96*bd1f8aebSAndroid Build Coastguard Worker# Our own version of sgml() and output() to allow simple string output
97*bd1f8aebSAndroid Build Coastguard Worker# to play well with roff's stupid whitespace rules.
98*bd1f8aebSAndroid Build Coastguard Worker
99*bd1f8aebSAndroid Build Coastguard Workersub man_sgml
100*bd1f8aebSAndroid Build Coastguard Worker{
101*bd1f8aebSAndroid Build Coastguard Worker	if(ref($_[1]) eq 'CODE') {
102*bd1f8aebSAndroid Build Coastguard Worker		return &sgml;
103*bd1f8aebSAndroid Build Coastguard Worker	}
104*bd1f8aebSAndroid Build Coastguard Worker
105*bd1f8aebSAndroid Build Coastguard Worker	my $s = $_[1];
106*bd1f8aebSAndroid Build Coastguard Worker
107*bd1f8aebSAndroid Build Coastguard Worker	$s =~ s/\\/\\\\/g;
108*bd1f8aebSAndroid Build Coastguard Worker	$s =~ s/'/\\'/g;
109*bd1f8aebSAndroid Build Coastguard Worker
110*bd1f8aebSAndroid Build Coastguard Worker	# \n at the beginning means start at beginning of line
111*bd1f8aebSAndroid Build Coastguard Worker	if($s =~ s/^\n//) {
112*bd1f8aebSAndroid Build Coastguard Worker		$sub = 'sub { output "\n" unless $newline_last++; ';
113*bd1f8aebSAndroid Build Coastguard Worker		if($s eq '') {
114*bd1f8aebSAndroid Build Coastguard Worker			sgml($_[0], eval('sub { output "\n" unless $newline_last++; }'));
115*bd1f8aebSAndroid Build Coastguard Worker		} elsif($s =~ /\n$/) {
116*bd1f8aebSAndroid Build Coastguard Worker			sgml($_[0], eval("sub { output \"\\n\" unless \$newline_last++; output '$s'; }"));
117*bd1f8aebSAndroid Build Coastguard Worker		} else {
118*bd1f8aebSAndroid Build Coastguard Worker			sgml($_[0], eval("sub { output \"\\n\" unless \$newline_last; output '$s'; \$newline_last = 0; }"));
119*bd1f8aebSAndroid Build Coastguard Worker		}
120*bd1f8aebSAndroid Build Coastguard Worker	} else {
121*bd1f8aebSAndroid Build Coastguard Worker		if($s =~ /\n$/) {
122*bd1f8aebSAndroid Build Coastguard Worker			sgml($_[0], eval("sub { output '$s'; \$newline_last = 1; }"));
123*bd1f8aebSAndroid Build Coastguard Worker		} else {
124*bd1f8aebSAndroid Build Coastguard Worker			sgml($_[0], eval("sub { output '$s'; \$newline_last = 0; }"));
125*bd1f8aebSAndroid Build Coastguard Worker		}
126*bd1f8aebSAndroid Build Coastguard Worker	}
127*bd1f8aebSAndroid Build Coastguard Worker}
128*bd1f8aebSAndroid Build Coastguard Worker
129*bd1f8aebSAndroid Build Coastguard Workersub man_output
130*bd1f8aebSAndroid Build Coastguard Worker{
131*bd1f8aebSAndroid Build Coastguard Worker	$_ = shift;
132*bd1f8aebSAndroid Build Coastguard Worker	if(s/^\n//) {
133*bd1f8aebSAndroid Build Coastguard Worker		output "\n" unless $newline_last++;
134*bd1f8aebSAndroid Build Coastguard Worker	}
135*bd1f8aebSAndroid Build Coastguard Worker	return if $_ eq '';
136*bd1f8aebSAndroid Build Coastguard Worker
137*bd1f8aebSAndroid Build Coastguard Worker	output $_;
138*bd1f8aebSAndroid Build Coastguard Worker
139*bd1f8aebSAndroid Build Coastguard Worker	if(@_) {
140*bd1f8aebSAndroid Build Coastguard Worker		output @_;
141*bd1f8aebSAndroid Build Coastguard Worker		$newline_last = (pop(@_) =~ /\n$/);
142*bd1f8aebSAndroid Build Coastguard Worker	} else {
143*bd1f8aebSAndroid Build Coastguard Worker		$newline_last = ($_ =~ /\n$/)
144*bd1f8aebSAndroid Build Coastguard Worker	}
145*bd1f8aebSAndroid Build Coastguard Worker}
146*bd1f8aebSAndroid Build Coastguard Worker
147*bd1f8aebSAndroid Build Coastguard Worker# Fold lines into one, quote some characters
148*bd1f8aebSAndroid Build Coastguard Workersub fold_string
149*bd1f8aebSAndroid Build Coastguard Worker{
150*bd1f8aebSAndroid Build Coastguard Worker	$_ = shift;
151*bd1f8aebSAndroid Build Coastguard Worker
152*bd1f8aebSAndroid Build Coastguard Worker	s/\\/\\\\/g;
153*bd1f8aebSAndroid Build Coastguard Worker	s/"/\\\&"/g;
154*bd1f8aebSAndroid Build Coastguard Worker
155*bd1f8aebSAndroid Build Coastguard Worker	# Change tabs to spaces
156*bd1f8aebSAndroid Build Coastguard Worker	tr/\t\n/  /;
157*bd1f8aebSAndroid Build Coastguard Worker
158*bd1f8aebSAndroid Build Coastguard Worker	# Trim whitespace from beginning and end.
159*bd1f8aebSAndroid Build Coastguard Worker	s/^ +//;
160*bd1f8aebSAndroid Build Coastguard Worker	s/ +$//;
161*bd1f8aebSAndroid Build Coastguard Worker
162*bd1f8aebSAndroid Build Coastguard Worker	return $_;
163*bd1f8aebSAndroid Build Coastguard Worker}
164*bd1f8aebSAndroid Build Coastguard Worker
165*bd1f8aebSAndroid Build Coastguard Workersub save_cdata()
166*bd1f8aebSAndroid Build Coastguard Worker{
167*bd1f8aebSAndroid Build Coastguard Worker	$raw_cdata++;
168*bd1f8aebSAndroid Build Coastguard Worker	push_output('string');
169*bd1f8aebSAndroid Build Coastguard Worker}
170*bd1f8aebSAndroid Build Coastguard Worker
171*bd1f8aebSAndroid Build Coastguard Workersub bold_on()
172*bd1f8aebSAndroid Build Coastguard Worker{
173*bd1f8aebSAndroid Build Coastguard Worker	# If the last font is also bold, don't change anything.
174*bd1f8aebSAndroid Build Coastguard Worker	# Basically this is to just get more readable man output.
175*bd1f8aebSAndroid Build Coastguard Worker	if($fontstack[$#fontstack] ne 'bold') {
176*bd1f8aebSAndroid Build Coastguard Worker		if(!$raw_cdata) {
177*bd1f8aebSAndroid Build Coastguard Worker			output '\fB';
178*bd1f8aebSAndroid Build Coastguard Worker			$newline_last = 0;
179*bd1f8aebSAndroid Build Coastguard Worker		}
180*bd1f8aebSAndroid Build Coastguard Worker	}
181*bd1f8aebSAndroid Build Coastguard Worker	push(@fontstack, 'bold');
182*bd1f8aebSAndroid Build Coastguard Worker}
183*bd1f8aebSAndroid Build Coastguard Worker
184*bd1f8aebSAndroid Build Coastguard Workersub italic_on()
185*bd1f8aebSAndroid Build Coastguard Worker{
186*bd1f8aebSAndroid Build Coastguard Worker	# If the last font is also italic, don't change anything.
187*bd1f8aebSAndroid Build Coastguard Worker	if($fontstack[$#fontstack] ne 'italic') {
188*bd1f8aebSAndroid Build Coastguard Worker		if(!$raw_cdata) {
189*bd1f8aebSAndroid Build Coastguard Worker			output '\fI';
190*bd1f8aebSAndroid Build Coastguard Worker			$newline_last = 0;
191*bd1f8aebSAndroid Build Coastguard Worker		}
192*bd1f8aebSAndroid Build Coastguard Worker	}
193*bd1f8aebSAndroid Build Coastguard Worker	push(@fontstack, 'italic');
194*bd1f8aebSAndroid Build Coastguard Worker}
195*bd1f8aebSAndroid Build Coastguard Worker
196*bd1f8aebSAndroid Build Coastguard Workersub font_off()
197*bd1f8aebSAndroid Build Coastguard Worker{
198*bd1f8aebSAndroid Build Coastguard Worker	my $thisfont = pop(@fontstack);
199*bd1f8aebSAndroid Build Coastguard Worker	my $lastfont = $fontstack[$#fontstack];
200*bd1f8aebSAndroid Build Coastguard Worker
201*bd1f8aebSAndroid Build Coastguard Worker	# Only output font change if it is different
202*bd1f8aebSAndroid Build Coastguard Worker	if($thisfont ne $lastfont) {
203*bd1f8aebSAndroid Build Coastguard Worker		if($raw_cdata)			{ return; }
204*bd1f8aebSAndroid Build Coastguard Worker		elsif($lastfont eq 'bold') 	{ output '\fB'; }
205*bd1f8aebSAndroid Build Coastguard Worker		elsif($lastfont eq 'italic')	{ output '\fI'; }
206*bd1f8aebSAndroid Build Coastguard Worker		else				{ output '\fR'; }
207*bd1f8aebSAndroid Build Coastguard Worker
208*bd1f8aebSAndroid Build Coastguard Worker		$newline_last = 0;
209*bd1f8aebSAndroid Build Coastguard Worker	}
210*bd1f8aebSAndroid Build Coastguard Worker}
211*bd1f8aebSAndroid Build Coastguard Worker
212*bd1f8aebSAndroid Build Coastguard Worker
213*bd1f8aebSAndroid Build Coastguard Worker
214*bd1f8aebSAndroid Build Coastguard Worker
215*bd1f8aebSAndroid Build Coastguard Worker
216*bd1f8aebSAndroid Build Coastguard Worker
217*bd1f8aebSAndroid Build Coastguard Worker########################################################################
218*bd1f8aebSAndroid Build Coastguard Worker#
219*bd1f8aebSAndroid Build Coastguard Worker# Manpage management
220*bd1f8aebSAndroid Build Coastguard Worker#
221*bd1f8aebSAndroid Build Coastguard Worker########################################################################
222*bd1f8aebSAndroid Build Coastguard Worker
223*bd1f8aebSAndroid Build Coastguard Workersgml('<REFENTRY>', sub {
224*bd1f8aebSAndroid Build Coastguard Worker	# This will be overwritten at end of REFMETA, when we know the name of the page.
225*bd1f8aebSAndroid Build Coastguard Worker	pop_output();
226*bd1f8aebSAndroid Build Coastguard Worker
227*bd1f8aebSAndroid Build Coastguard Worker	$write_manpages = 1;		# Currently writing manpage.
228*bd1f8aebSAndroid Build Coastguard Worker
229*bd1f8aebSAndroid Build Coastguard Worker	$nocollapse_whitespace = 0;	# Current whitespace collapse counter.
230*bd1f8aebSAndroid Build Coastguard Worker	$newline_last = 1;		# At beginning of line?
231*bd1f8aebSAndroid Build Coastguard Worker		# Just a bit of warning, you will see this variable manipulated
232*bd1f8aebSAndroid Build Coastguard Worker		# manually a lot.  It makes the code harder to follow but it
233*bd1f8aebSAndroid Build Coastguard Worker		# saves you from having to worry about collapsing at the end of
234*bd1f8aebSAndroid Build Coastguard Worker		# parse, stopping at verbatims, etc.
235*bd1f8aebSAndroid Build Coastguard Worker	$raw_cdata = 0;                 # Instructs certain output functions to
236*bd1f8aebSAndroid Build Coastguard Worker					# leave CDATA alone, so we can assign
237*bd1f8aebSAndroid Build Coastguard Worker					# it to a string and process it, etc.
238*bd1f8aebSAndroid Build Coastguard Worker	@fontstack = ();		# Fonts being activated.
239*bd1f8aebSAndroid Build Coastguard Worker
240*bd1f8aebSAndroid Build Coastguard Worker	$manpage_title = '';		# Needed for indexing.
241*bd1f8aebSAndroid Build Coastguard Worker	$manpage_sect = '';
242*bd1f8aebSAndroid Build Coastguard Worker	@manpage_names = ();
243*bd1f8aebSAndroid Build Coastguard Worker
244*bd1f8aebSAndroid Build Coastguard Worker	$manpage_misc = '';
245*bd1f8aebSAndroid Build Coastguard Worker
246*bd1f8aebSAndroid Build Coastguard Worker	$list_nestlevel = 0;		# Indent certain nested content.
247*bd1f8aebSAndroid Build Coastguard Worker});
248*bd1f8aebSAndroid Build Coastguard Workersgml('</REFENTRY>', sub {
249*bd1f8aebSAndroid Build Coastguard Worker	if(!$newline_last) {
250*bd1f8aebSAndroid Build Coastguard Worker		output "\n";
251*bd1f8aebSAndroid Build Coastguard Worker	}
252*bd1f8aebSAndroid Build Coastguard Worker
253*bd1f8aebSAndroid Build Coastguard Worker	$write_manpages = 0;
254*bd1f8aebSAndroid Build Coastguard Worker	$raw_cdata = 1;
255*bd1f8aebSAndroid Build Coastguard Worker	push_output('nul');
256*bd1f8aebSAndroid Build Coastguard Worker});
257*bd1f8aebSAndroid Build Coastguard Worker
258*bd1f8aebSAndroid Build Coastguard Workersgml('</REFMETA>', sub {
259*bd1f8aebSAndroid Build Coastguard Worker	push_output('file', "$manpage_title.$manpage_sect");
260*bd1f8aebSAndroid Build Coastguard Worker
261*bd1f8aebSAndroid Build Coastguard Worker	output <<_END_BANNER;
262*bd1f8aebSAndroid Build Coastguard Worker.\\" This manpage has been automatically generated by docbook2man
263*bd1f8aebSAndroid Build Coastguard Worker.\\" from a DocBook document.  This tool can be found at:
264*bd1f8aebSAndroid Build Coastguard Worker.\\" <http://shell.ipoline.com/~elmert/comp/docbook2X/>
265*bd1f8aebSAndroid Build Coastguard Worker.\\" Please send any bug reports, improvements, comments, patches,
266*bd1f8aebSAndroid Build Coastguard Worker.\\" etc. to Steve Cheng <steve\@ggi-project.org>.
267*bd1f8aebSAndroid Build Coastguard Worker_END_BANNER
268*bd1f8aebSAndroid Build Coastguard Worker
269*bd1f8aebSAndroid Build Coastguard Worker	my $manpage_date = `date "+%d %B %Y"`;
270*bd1f8aebSAndroid Build Coastguard Worker
271*bd1f8aebSAndroid Build Coastguard Worker	output '.TH "';
272*bd1f8aebSAndroid Build Coastguard Worker
273*bd1f8aebSAndroid Build Coastguard Worker	# If the title is not mixed-case, convention says to
274*bd1f8aebSAndroid Build Coastguard Worker	# uppercase the whole title.  (The canonical title is
275*bd1f8aebSAndroid Build Coastguard Worker	# lowercase.)
276*bd1f8aebSAndroid Build Coastguard Worker	if($manpage_title =~ /[A-Z]/) {
277*bd1f8aebSAndroid Build Coastguard Worker		output fold_string($manpage_title);
278*bd1f8aebSAndroid Build Coastguard Worker	} else {
279*bd1f8aebSAndroid Build Coastguard Worker		output uc(fold_string($manpage_title));
280*bd1f8aebSAndroid Build Coastguard Worker	}
281*bd1f8aebSAndroid Build Coastguard Worker
282*bd1f8aebSAndroid Build Coastguard Worker	output  '" "', fold_string($manpage_sect),
283*bd1f8aebSAndroid Build Coastguard Worker		'" "', fold_string(`date "+%d %B %Y"`),
284*bd1f8aebSAndroid Build Coastguard Worker		'" "', $manpage_misc,
285*bd1f8aebSAndroid Build Coastguard Worker		'" "', $manpage_manual,
286*bd1f8aebSAndroid Build Coastguard Worker		"\"\n";
287*bd1f8aebSAndroid Build Coastguard Worker
288*bd1f8aebSAndroid Build Coastguard Worker	$newline_last = 1;
289*bd1f8aebSAndroid Build Coastguard Worker
290*bd1f8aebSAndroid Build Coastguard Worker	# References to this RefEntry.
291*bd1f8aebSAndroid Build Coastguard Worker	my $id = $_[0]->parent->attribute('ID')->value;
292*bd1f8aebSAndroid Build Coastguard Worker	if($id ne '') {
293*bd1f8aebSAndroid Build Coastguard Worker		# The 'package name' part of the section should
294*bd1f8aebSAndroid Build Coastguard Worker		# not be used when citing it.
295*bd1f8aebSAndroid Build Coastguard Worker		my ($sectnum) = ($manpage_sect =~ /([0-9]*)/);
296*bd1f8aebSAndroid Build Coastguard Worker
297*bd1f8aebSAndroid Build Coastguard Worker		if($_[0]->parent->attribute('XREFLABEL')->value eq '') {
298*bd1f8aebSAndroid Build Coastguard Worker			$Refs->put("refentry:$id", "$manpage_title($sectnum)");
299*bd1f8aebSAndroid Build Coastguard Worker		} else {
300*bd1f8aebSAndroid Build Coastguard Worker			$Refs->put("refentry:$id",
301*bd1f8aebSAndroid Build Coastguard Worker				$_[0]->parent->attribute('XREFLABEL')->value .
302*bd1f8aebSAndroid Build Coastguard Worker				"($sectnum)");
303*bd1f8aebSAndroid Build Coastguard Worker		}
304*bd1f8aebSAndroid Build Coastguard Worker	}
305*bd1f8aebSAndroid Build Coastguard Worker});
306*bd1f8aebSAndroid Build Coastguard Worker
307*bd1f8aebSAndroid Build Coastguard Workersgml('<REFENTRYTITLE>', sub {
308*bd1f8aebSAndroid Build Coastguard Worker	if($_[0]->in('REFMETA')) {
309*bd1f8aebSAndroid Build Coastguard Worker		save_cdata();
310*bd1f8aebSAndroid Build Coastguard Worker	} else {
311*bd1f8aebSAndroid Build Coastguard Worker		# Manpage citations are in bold.
312*bd1f8aebSAndroid Build Coastguard Worker		bold_on();
313*bd1f8aebSAndroid Build Coastguard Worker	}
314*bd1f8aebSAndroid Build Coastguard Worker});
315*bd1f8aebSAndroid Build Coastguard Workersgml('</REFENTRYTITLE>', sub {
316*bd1f8aebSAndroid Build Coastguard Worker	if($_[0]->in('REFMETA')) {
317*bd1f8aebSAndroid Build Coastguard Worker		$raw_cdata--;
318*bd1f8aebSAndroid Build Coastguard Worker		$manpage_title = pop_output();
319*bd1f8aebSAndroid Build Coastguard Worker	}
320*bd1f8aebSAndroid Build Coastguard Worker	else { font_off(); }
321*bd1f8aebSAndroid Build Coastguard Worker});
322*bd1f8aebSAndroid Build Coastguard Worker
323*bd1f8aebSAndroid Build Coastguard Workersgml('<MANVOLNUM>', sub {
324*bd1f8aebSAndroid Build Coastguard Worker	if($_[0]->in('REFMETA')) {
325*bd1f8aebSAndroid Build Coastguard Worker		save_cdata();
326*bd1f8aebSAndroid Build Coastguard Worker	} else {
327*bd1f8aebSAndroid Build Coastguard Worker		# Manpage citations use ().
328*bd1f8aebSAndroid Build Coastguard Worker		output '(';
329*bd1f8aebSAndroid Build Coastguard Worker	}
330*bd1f8aebSAndroid Build Coastguard Worker});
331*bd1f8aebSAndroid Build Coastguard Workersgml('</MANVOLNUM>', sub {
332*bd1f8aebSAndroid Build Coastguard Worker	if($_[0]->in('REFMETA')) {
333*bd1f8aebSAndroid Build Coastguard Worker		$raw_cdata--;
334*bd1f8aebSAndroid Build Coastguard Worker		$manpage_sect = pop_output();
335*bd1f8aebSAndroid Build Coastguard Worker	}
336*bd1f8aebSAndroid Build Coastguard Worker	else { output ')' }
337*bd1f8aebSAndroid Build Coastguard Worker});
338*bd1f8aebSAndroid Build Coastguard Worker
339*bd1f8aebSAndroid Build Coastguard Workersgml('<REFMISCINFO>', \&save_cdata);
340*bd1f8aebSAndroid Build Coastguard Workersgml('</REFMISCINFO>', sub {
341*bd1f8aebSAndroid Build Coastguard Worker	$raw_cdata--;
342*bd1f8aebSAndroid Build Coastguard Worker	$manpage_misc = fold_string(pop_output());
343*bd1f8aebSAndroid Build Coastguard Worker});
344*bd1f8aebSAndroid Build Coastguard Worker
345*bd1f8aebSAndroid Build Coastguard Worker
346*bd1f8aebSAndroid Build Coastguard Worker# NAME section
347*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<REFNAMEDIV>', "\n.SH NAME\n");
348*bd1f8aebSAndroid Build Coastguard Worker
349*bd1f8aebSAndroid Build Coastguard Workersgml('<REFNAME>', \&save_cdata);
350*bd1f8aebSAndroid Build Coastguard Workersgml('</REFNAME>', sub {
351*bd1f8aebSAndroid Build Coastguard Worker	$raw_cdata--;
352*bd1f8aebSAndroid Build Coastguard Worker	push(@manpage_names, pop_output());
353*bd1f8aebSAndroid Build Coastguard Worker});
354*bd1f8aebSAndroid Build Coastguard Worker
355*bd1f8aebSAndroid Build Coastguard Workersgml('<REFPURPOSE>', \&save_cdata);
356*bd1f8aebSAndroid Build Coastguard Workersgml('</REFPURPOSE>', sub {
357*bd1f8aebSAndroid Build Coastguard Worker	$raw_cdata--;
358*bd1f8aebSAndroid Build Coastguard Worker	my $manpage_purpose = fold_string(pop_output());
359*bd1f8aebSAndroid Build Coastguard Worker
360*bd1f8aebSAndroid Build Coastguard Worker	for(my $i = 0; $i < $#manpage_names; $i++) {
361*bd1f8aebSAndroid Build Coastguard Worker		output fold_string($manpage_names[$i]), ', ';
362*bd1f8aebSAndroid Build Coastguard Worker	}
363*bd1f8aebSAndroid Build Coastguard Worker
364*bd1f8aebSAndroid Build Coastguard Worker	output fold_string($manpage_names[$#manpage_names]);
365*bd1f8aebSAndroid Build Coastguard Worker	output " \\- $manpage_purpose\n";
366*bd1f8aebSAndroid Build Coastguard Worker
367*bd1f8aebSAndroid Build Coastguard Worker	$newline_last = 1;
368*bd1f8aebSAndroid Build Coastguard Worker
369*bd1f8aebSAndroid Build Coastguard Worker	foreach(@manpage_names) {
370*bd1f8aebSAndroid Build Coastguard Worker		# Don't link to itself
371*bd1f8aebSAndroid Build Coastguard Worker		if($_ ne $manpage_title) {
372*bd1f8aebSAndroid Build Coastguard Worker			print LINKSFILE "$manpage_title.$manpage_sect	$_.$manpage_sect\n";
373*bd1f8aebSAndroid Build Coastguard Worker		}
374*bd1f8aebSAndroid Build Coastguard Worker	}
375*bd1f8aebSAndroid Build Coastguard Worker});
376*bd1f8aebSAndroid Build Coastguard Worker
377*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<REFCLASS>', "\n.sp\n");
378*bd1f8aebSAndroid Build Coastguard Worker
379*bd1f8aebSAndroid Build Coastguard Worker#RefDescriptor
380*bd1f8aebSAndroid Build Coastguard Worker
381*bd1f8aebSAndroid Build Coastguard Worker
382*bd1f8aebSAndroid Build Coastguard Worker
383*bd1f8aebSAndroid Build Coastguard Worker
384*bd1f8aebSAndroid Build Coastguard Worker
385*bd1f8aebSAndroid Build Coastguard Worker########################################################################
386*bd1f8aebSAndroid Build Coastguard Worker#
387*bd1f8aebSAndroid Build Coastguard Worker# SYNOPSIS section and synopses
388*bd1f8aebSAndroid Build Coastguard Worker#
389*bd1f8aebSAndroid Build Coastguard Worker########################################################################
390*bd1f8aebSAndroid Build Coastguard Worker
391*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<REFSYNOPSISDIV>', "\n.SH SYNOPSIS\n");
392*bd1f8aebSAndroid Build Coastguard Workerman_sgml('</REFSYNOPSISDIV>', "\n");
393*bd1f8aebSAndroid Build Coastguard Worker
394*bd1f8aebSAndroid Build Coastguard Worker## FIXME! Must be made into block elements!!
395*bd1f8aebSAndroid Build Coastguard Worker#sgml('<FUNCSYNOPSIS>', \&bold_on);
396*bd1f8aebSAndroid Build Coastguard Worker#sgml('</FUNCSYNOPSIS>', \&font_off);
397*bd1f8aebSAndroid Build Coastguard Worker#sgml('<CMDSYNOPSIS>', \&bold_on);
398*bd1f8aebSAndroid Build Coastguard Worker#sgml('</CMDSYNOPSIS>', \&font_off);
399*bd1f8aebSAndroid Build Coastguard Worker
400*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<FUNCSYNOPSIS>', sub {
401*bd1f8aebSAndroid Build Coastguard Worker	man_output("\n.sp\n");
402*bd1f8aebSAndroid Build Coastguard Worker	bold_on();
403*bd1f8aebSAndroid Build Coastguard Worker});
404*bd1f8aebSAndroid Build Coastguard Workerman_sgml('</FUNCSYNOPSIS>', sub {
405*bd1f8aebSAndroid Build Coastguard Worker	font_off();
406*bd1f8aebSAndroid Build Coastguard Worker	man_output("\n");
407*bd1f8aebSAndroid Build Coastguard Worker});
408*bd1f8aebSAndroid Build Coastguard Worker
409*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<CMDSYNOPSIS>', "\n\n");
410*bd1f8aebSAndroid Build Coastguard Workerman_sgml('</CMDSYNOPSIS>', "\n\n");
411*bd1f8aebSAndroid Build Coastguard Worker
412*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<FUNCPROTOTYPE>', "\n.sp\n");
413*bd1f8aebSAndroid Build Coastguard Worker
414*bd1f8aebSAndroid Build Coastguard Worker# Arguments to functions.  This is C convention.
415*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<PARAMDEF>', '(');
416*bd1f8aebSAndroid Build Coastguard Workerman_sgml('</PARAMDEF>', ");\n");
417*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<VOID>', "(void);\n");
418*bd1f8aebSAndroid Build Coastguard Worker
419*bd1f8aebSAndroid Build Coastguard Worker
420*bd1f8aebSAndroid Build Coastguard Worker
421*bd1f8aebSAndroid Build Coastguard Workersub arg_start
422*bd1f8aebSAndroid Build Coastguard Worker{
423*bd1f8aebSAndroid Build Coastguard Worker	# my $choice = $_[0]->attribute('CHOICE')->value;
424*bd1f8aebSAndroid Build Coastguard Worker
425*bd1f8aebSAndroid Build Coastguard Worker	# The content model for CmdSynopsis doesn't include #PCDATA,
426*bd1f8aebSAndroid Build Coastguard Worker	# so we won't see any of the whitespace in the source file,
427*bd1f8aebSAndroid Build Coastguard Worker	# so we have to add it after each component.
428*bd1f8aebSAndroid Build Coastguard Worker	output ' ';
429*bd1f8aebSAndroid Build Coastguard Worker
430*bd1f8aebSAndroid Build Coastguard Worker	if($_[0]->attribute('CHOICE')->value =~ /opt/i) {
431*bd1f8aebSAndroid Build Coastguard Worker		output '[';
432*bd1f8aebSAndroid Build Coastguard Worker	}
433*bd1f8aebSAndroid Build Coastguard Worker	bold_on();
434*bd1f8aebSAndroid Build Coastguard Worker}
435*bd1f8aebSAndroid Build Coastguard Workersub arg_end
436*bd1f8aebSAndroid Build Coastguard Worker{
437*bd1f8aebSAndroid Build Coastguard Worker	font_off();
438*bd1f8aebSAndroid Build Coastguard Worker	if($_[0]->attribute('REP')->value =~ /^Repeat/i) {
439*bd1f8aebSAndroid Build Coastguard Worker		italic_on();
440*bd1f8aebSAndroid Build Coastguard Worker		output ' ...';
441*bd1f8aebSAndroid Build Coastguard Worker		font_off();
442*bd1f8aebSAndroid Build Coastguard Worker	}
443*bd1f8aebSAndroid Build Coastguard Worker	if($_[0]->attribute('CHOICE')->value =~ /opt/i) {
444*bd1f8aebSAndroid Build Coastguard Worker		output ']';
445*bd1f8aebSAndroid Build Coastguard Worker	}
446*bd1f8aebSAndroid Build Coastguard Worker}
447*bd1f8aebSAndroid Build Coastguard Worker
448*bd1f8aebSAndroid Build Coastguard Workersgml('<ARG>', \&arg_start);
449*bd1f8aebSAndroid Build Coastguard Workersgml('</ARG>', \&arg_end);
450*bd1f8aebSAndroid Build Coastguard Workersgml('<GROUP>', \&arg_start);
451*bd1f8aebSAndroid Build Coastguard Workersgml('</GROUP>', \&arg_end);
452*bd1f8aebSAndroid Build Coastguard Worker
453*bd1f8aebSAndroid Build Coastguard Workersgml('<OPTION>', \&bold_on);
454*bd1f8aebSAndroid Build Coastguard Workersgml('</OPTION>', \&font_off);
455*bd1f8aebSAndroid Build Coastguard Worker
456*bd1f8aebSAndroid Build Coastguard Worker# FIXME: This is one _blank_ line.
457*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<SBR>', "\n\n");
458*bd1f8aebSAndroid Build Coastguard Worker
459*bd1f8aebSAndroid Build Coastguard Worker
460*bd1f8aebSAndroid Build Coastguard Worker########################################################################
461*bd1f8aebSAndroid Build Coastguard Worker#
462*bd1f8aebSAndroid Build Coastguard Worker# General sections
463*bd1f8aebSAndroid Build Coastguard Worker#
464*bd1f8aebSAndroid Build Coastguard Worker########################################################################
465*bd1f8aebSAndroid Build Coastguard Worker
466*bd1f8aebSAndroid Build Coastguard Worker# The name of the section is handled by TITLE.  This just sets
467*bd1f8aebSAndroid Build Coastguard Worker# up the roff markup.
468*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<REFSECT1>', "\n.SH ");
469*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<REFSECT2>', "\n.SS ");
470*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<REFSECT3>', "\n.SS ");
471*bd1f8aebSAndroid Build Coastguard Worker
472*bd1f8aebSAndroid Build Coastguard Worker
473*bd1f8aebSAndroid Build Coastguard Worker########################################################################
474*bd1f8aebSAndroid Build Coastguard Worker#
475*bd1f8aebSAndroid Build Coastguard Worker# Titles, metadata.
476*bd1f8aebSAndroid Build Coastguard Worker#
477*bd1f8aebSAndroid Build Coastguard Worker########################################################################
478*bd1f8aebSAndroid Build Coastguard Worker
479*bd1f8aebSAndroid Build Coastguard Workersgml('<TITLE>', sub {
480*bd1f8aebSAndroid Build Coastguard Worker	if($_[0]->in('REFERENCE') or $_[0]->in('BOOK')) {
481*bd1f8aebSAndroid Build Coastguard Worker		$write_manpages = 1;
482*bd1f8aebSAndroid Build Coastguard Worker	}
483*bd1f8aebSAndroid Build Coastguard Worker	save_cdata();
484*bd1f8aebSAndroid Build Coastguard Worker});
485*bd1f8aebSAndroid Build Coastguard Workersgml('</TITLE>', sub {
486*bd1f8aebSAndroid Build Coastguard Worker	my $title = fold_string(pop_output());
487*bd1f8aebSAndroid Build Coastguard Worker	$raw_cdata--;
488*bd1f8aebSAndroid Build Coastguard Worker
489*bd1f8aebSAndroid Build Coastguard Worker	if($_[0]->in('REFERENCE') or $_[0]->in('BOOK')) {
490*bd1f8aebSAndroid Build Coastguard Worker		# We use TITLE of enclosing Reference or Book as manual name
491*bd1f8aebSAndroid Build Coastguard Worker		$manpage_manual = $title;
492*bd1f8aebSAndroid Build Coastguard Worker		$write_manpages = 0;
493*bd1f8aebSAndroid Build Coastguard Worker	}
494*bd1f8aebSAndroid Build Coastguard Worker	elsif(exists $_[0]->parent->ext->{'title'}) {
495*bd1f8aebSAndroid Build Coastguard Worker		# By far the easiest case.  Just fold the string as
496*bd1f8aebSAndroid Build Coastguard Worker		# above, and then set the parent element's variable.
497*bd1f8aebSAndroid Build Coastguard Worker		$_[0]->parent->ext->{'title'} = $title;
498*bd1f8aebSAndroid Build Coastguard Worker	}
499*bd1f8aebSAndroid Build Coastguard Worker	else {
500*bd1f8aebSAndroid Build Coastguard Worker		# If the parent element's handlers are lazy,
501*bd1f8aebSAndroid Build Coastguard Worker		# output the folded string for them :)
502*bd1f8aebSAndroid Build Coastguard Worker		# We assume they want uppercase and a newline.
503*bd1f8aebSAndroid Build Coastguard Worker		output '"', uc($title), "\"\n";
504*bd1f8aebSAndroid Build Coastguard Worker		$newline_last = 1;
505*bd1f8aebSAndroid Build Coastguard Worker	}
506*bd1f8aebSAndroid Build Coastguard Worker});
507*bd1f8aebSAndroid Build Coastguard Worker
508*bd1f8aebSAndroid Build Coastguard Workersgml('<ATTRIBUTION>', sub { push_output('string') });
509*bd1f8aebSAndroid Build Coastguard Workersgml('</ATTRIBUTION>', sub { $_[0]->parent->ext->{'attribution'} = pop_output(); });
510*bd1f8aebSAndroid Build Coastguard Worker
511*bd1f8aebSAndroid Build Coastguard Worker
512*bd1f8aebSAndroid Build Coastguard Worker# IGNORE.
513*bd1f8aebSAndroid Build Coastguard Workersgml('<DOCINFO>', sub { push_output('nul'); });
514*bd1f8aebSAndroid Build Coastguard Workersgml('</DOCINFO>', sub { pop_output(); });
515*bd1f8aebSAndroid Build Coastguard Workersgml('<REFSECT1INFO>', sub { push_output('nul'); });
516*bd1f8aebSAndroid Build Coastguard Workersgml('</REFSECT1INFO>', sub { pop_output(); });
517*bd1f8aebSAndroid Build Coastguard Workersgml('<REFSECT2INFO>', sub { push_output('nul'); });
518*bd1f8aebSAndroid Build Coastguard Workersgml('</REFSECT2INFO>', sub { pop_output(); });
519*bd1f8aebSAndroid Build Coastguard Workersgml('<REFSECT3INFO>', sub { push_output('nul'); });
520*bd1f8aebSAndroid Build Coastguard Workersgml('</REFSECT3INFO>', sub { pop_output(); });
521*bd1f8aebSAndroid Build Coastguard Worker
522*bd1f8aebSAndroid Build Coastguard Workersgml('<INDEXTERM>', sub { push_output('nul'); });
523*bd1f8aebSAndroid Build Coastguard Workersgml('</INDEXTERM>', sub { pop_output(); });
524*bd1f8aebSAndroid Build Coastguard Worker
525*bd1f8aebSAndroid Build Coastguard Worker
526*bd1f8aebSAndroid Build Coastguard Worker########################################################################
527*bd1f8aebSAndroid Build Coastguard Worker#
528*bd1f8aebSAndroid Build Coastguard Worker# Set bold on enclosed content
529*bd1f8aebSAndroid Build Coastguard Worker#
530*bd1f8aebSAndroid Build Coastguard Worker########################################################################
531*bd1f8aebSAndroid Build Coastguard Worker
532*bd1f8aebSAndroid Build Coastguard Workersgml('<APPLICATION>', \&bold_on);	sgml('</APPLICATION>', \&font_off);
533*bd1f8aebSAndroid Build Coastguard Worker
534*bd1f8aebSAndroid Build Coastguard Workersgml('<CLASSNAME>', \&bold_on);		sgml('</CLASSNAME>', \&font_off);
535*bd1f8aebSAndroid Build Coastguard Workersgml('<STRUCTNANE>', \&bold_on);	sgml('</STRUCTNAME>', \&font_off);
536*bd1f8aebSAndroid Build Coastguard Workersgml('<STRUCTFIELD>', \&bold_on);	sgml('</STRUCTFIELD>', \&font_off);
537*bd1f8aebSAndroid Build Coastguard Workersgml('<SYMBOL>', \&bold_on);		sgml('</SYMBOL>', \&font_off);
538*bd1f8aebSAndroid Build Coastguard Workersgml('<TYPE>', \&bold_on);		sgml('</TYPE>', \&font_off);
539*bd1f8aebSAndroid Build Coastguard Worker
540*bd1f8aebSAndroid Build Coastguard Workersgml('<ENVAR>', \&bold_on);	sgml('</ENVAR>', \&font_off);
541*bd1f8aebSAndroid Build Coastguard Worker
542*bd1f8aebSAndroid Build Coastguard Workersgml('<FUNCTION>', \&bold_on);	sgml('</FUNCTION>', \&font_off);
543*bd1f8aebSAndroid Build Coastguard Worker
544*bd1f8aebSAndroid Build Coastguard Workersgml('<EMPHASIS>', \&bold_on);	sgml('</EMPHASIS>', \&font_off);
545*bd1f8aebSAndroid Build Coastguard Worker
546*bd1f8aebSAndroid Build Coastguard Workersgml('<ERRORNAME>', \&bold_on);	sgml('</ERRORNAME>', \&font_off);
547*bd1f8aebSAndroid Build Coastguard Worker# ERRORTYPE
548*bd1f8aebSAndroid Build Coastguard Worker
549*bd1f8aebSAndroid Build Coastguard Workersgml('<COMMAND>', \&bold_on);	sgml('</COMMAND>', \&font_off);
550*bd1f8aebSAndroid Build Coastguard Worker
551*bd1f8aebSAndroid Build Coastguard Workersgml('<GUIBUTTON>', \&bold_on);	sgml('</GUIBUTTON>', \&font_off);
552*bd1f8aebSAndroid Build Coastguard Workersgml('<GUIICON>', \&bold_on);	sgml('</GUIICON>', \&font_off);
553*bd1f8aebSAndroid Build Coastguard Worker# GUILABEL
554*bd1f8aebSAndroid Build Coastguard Worker# GUIMENU
555*bd1f8aebSAndroid Build Coastguard Worker# GUIMENUITEM
556*bd1f8aebSAndroid Build Coastguard Worker# GUISUBMENU
557*bd1f8aebSAndroid Build Coastguard Worker# MENUCHOICE
558*bd1f8aebSAndroid Build Coastguard Worker# MOUSEBUTTON
559*bd1f8aebSAndroid Build Coastguard Worker
560*bd1f8aebSAndroid Build Coastguard Workersgml('<ACCEL>', \&bold_on);	sgml('</ACCEL>', \&font_off);
561*bd1f8aebSAndroid Build Coastguard Workersgml('<KEYCAP>', \&bold_on);	sgml('</KEYCAP>', \&font_off);
562*bd1f8aebSAndroid Build Coastguard Workersgml('<KEYSYM>', \&bold_on);	sgml('</KEYSYM>', \&font_off);
563*bd1f8aebSAndroid Build Coastguard Worker# KEYCODE
564*bd1f8aebSAndroid Build Coastguard Worker# KEYCOMBO
565*bd1f8aebSAndroid Build Coastguard Worker# SHORTCUT
566*bd1f8aebSAndroid Build Coastguard Worker
567*bd1f8aebSAndroid Build Coastguard Workersgml('<USERINPUT>', \&bold_on);	sgml('</USERINPUT>', \&font_off);
568*bd1f8aebSAndroid Build Coastguard Worker
569*bd1f8aebSAndroid Build Coastguard Workersgml('<INTERFACEDEFINITION>', \&bold_on);
570*bd1f8aebSAndroid Build Coastguard Workersgml('</INTERFACEDEFINITION>', \&font_off);
571*bd1f8aebSAndroid Build Coastguard Worker
572*bd1f8aebSAndroid Build Coastguard Worker# May need to look at the CLASS
573*bd1f8aebSAndroid Build Coastguard Workersgml('<SYSTEMITEM>', \&bold_on);
574*bd1f8aebSAndroid Build Coastguard Workersgml('</SYSTEMITEM>', \&font_off);
575*bd1f8aebSAndroid Build Coastguard Worker
576*bd1f8aebSAndroid Build Coastguard Worker
577*bd1f8aebSAndroid Build Coastguard Worker
578*bd1f8aebSAndroid Build Coastguard Worker
579*bd1f8aebSAndroid Build Coastguard Worker
580*bd1f8aebSAndroid Build Coastguard Worker########################################################################
581*bd1f8aebSAndroid Build Coastguard Worker#
582*bd1f8aebSAndroid Build Coastguard Worker# Set italic on enclosed content
583*bd1f8aebSAndroid Build Coastguard Worker#
584*bd1f8aebSAndroid Build Coastguard Worker########################################################################
585*bd1f8aebSAndroid Build Coastguard Worker
586*bd1f8aebSAndroid Build Coastguard Workersgml('<FIRSTTERM>', \&italic_on);	sgml('</FIRSTTERM>', \&font_off);
587*bd1f8aebSAndroid Build Coastguard Worker
588*bd1f8aebSAndroid Build Coastguard Workersgml('<FILENAME>', \&italic_on);	sgml('</FILENAME>', \&font_off);
589*bd1f8aebSAndroid Build Coastguard Workersgml('<PARAMETER>', \&italic_on);	sgml('</PARAMETER>', \&font_off);
590*bd1f8aebSAndroid Build Coastguard Workersgml('<PROPERTY>', \&italic_on);	sgml('</PROPERTY>', \&font_off);
591*bd1f8aebSAndroid Build Coastguard Worker
592*bd1f8aebSAndroid Build Coastguard Workersgml('<REPLACEABLE>', sub {
593*bd1f8aebSAndroid Build Coastguard Worker	italic_on();
594*bd1f8aebSAndroid Build Coastguard Worker	if($_[0]->in('TOKEN')) {
595*bd1f8aebSAndroid Build Coastguard Worker		# When tokenizing, follow more 'intuitive' convention
596*bd1f8aebSAndroid Build Coastguard Worker		output "<";
597*bd1f8aebSAndroid Build Coastguard Worker	}
598*bd1f8aebSAndroid Build Coastguard Worker});
599*bd1f8aebSAndroid Build Coastguard Workersgml('</REPLACEABLE>', sub {
600*bd1f8aebSAndroid Build Coastguard Worker	if($_[0]->in('TOKEN')) {
601*bd1f8aebSAndroid Build Coastguard Worker		output ">";
602*bd1f8aebSAndroid Build Coastguard Worker	}
603*bd1f8aebSAndroid Build Coastguard Worker	font_off();
604*bd1f8aebSAndroid Build Coastguard Worker});
605*bd1f8aebSAndroid Build Coastguard Worker
606*bd1f8aebSAndroid Build Coastguard Workersgml('<CITETITLE>', \&italic_on);	sgml('</CITETITLE>', \&font_off);
607*bd1f8aebSAndroid Build Coastguard Workersgml('<FOREIGNPHRASE>', \&italic_on);	sgml('</FOREIGNPHRASE>', \&font_off);
608*bd1f8aebSAndroid Build Coastguard Worker
609*bd1f8aebSAndroid Build Coastguard Workersgml('<LINEANNOTATION>', \&italic_on);	sgml('</LINEANNOTATION>', \&font_off);
610*bd1f8aebSAndroid Build Coastguard Worker
611*bd1f8aebSAndroid Build Coastguard Worker
612*bd1f8aebSAndroid Build Coastguard Worker
613*bd1f8aebSAndroid Build Coastguard Worker
614*bd1f8aebSAndroid Build Coastguard Worker
615*bd1f8aebSAndroid Build Coastguard Worker
616*bd1f8aebSAndroid Build Coastguard Worker########################################################################
617*bd1f8aebSAndroid Build Coastguard Worker#
618*bd1f8aebSAndroid Build Coastguard Worker# Other 'inline' elements
619*bd1f8aebSAndroid Build Coastguard Worker#
620*bd1f8aebSAndroid Build Coastguard Worker########################################################################
621*bd1f8aebSAndroid Build Coastguard Worker
622*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<EMAIL>', '<');
623*bd1f8aebSAndroid Build Coastguard Workerman_sgml('</EMAIL>', '>');
624*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<OPTIONAL>', '[');
625*bd1f8aebSAndroid Build Coastguard Workerman_sgml('</OPTIONAL>', ']');
626*bd1f8aebSAndroid Build Coastguard Worker
627*bd1f8aebSAndroid Build Coastguard Workerman_sgml('</TRADEMARK>', "\\u\\s-2TM\\s+2\\d");
628*bd1f8aebSAndroid Build Coastguard Worker
629*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<COMMENT>', "[Comment: ");
630*bd1f8aebSAndroid Build Coastguard Workerman_sgml('</COMMENT>', "]");
631*bd1f8aebSAndroid Build Coastguard Worker
632*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<QUOTE>', "``");
633*bd1f8aebSAndroid Build Coastguard Workerman_sgml('</QUOTE>', "''");
634*bd1f8aebSAndroid Build Coastguard Worker
635*bd1f8aebSAndroid Build Coastguard Worker#man_sgml('<LITERAL>', '"');
636*bd1f8aebSAndroid Build Coastguard Worker#man_sgml('</LITERAL>', '"');
637*bd1f8aebSAndroid Build Coastguard Worker
638*bd1f8aebSAndroid Build Coastguard Worker# No special presentation:
639*bd1f8aebSAndroid Build Coastguard Worker
640*bd1f8aebSAndroid Build Coastguard Worker# AUTHOR
641*bd1f8aebSAndroid Build Coastguard Worker# AUTHORINITIALS
642*bd1f8aebSAndroid Build Coastguard Worker
643*bd1f8aebSAndroid Build Coastguard Worker# ABBREV
644*bd1f8aebSAndroid Build Coastguard Worker# ACTION
645*bd1f8aebSAndroid Build Coastguard Worker# ACRONYM
646*bd1f8aebSAndroid Build Coastguard Worker# ALT
647*bd1f8aebSAndroid Build Coastguard Worker# CITATION
648*bd1f8aebSAndroid Build Coastguard Worker# PHRASE
649*bd1f8aebSAndroid Build Coastguard Worker# QUOTE
650*bd1f8aebSAndroid Build Coastguard Worker# WORDASWORD
651*bd1f8aebSAndroid Build Coastguard Worker
652*bd1f8aebSAndroid Build Coastguard Worker# COMPUTEROUTPUT
653*bd1f8aebSAndroid Build Coastguard Worker# MARKUP
654*bd1f8aebSAndroid Build Coastguard Worker# PROMPT
655*bd1f8aebSAndroid Build Coastguard Worker# RETURNVALUE
656*bd1f8aebSAndroid Build Coastguard Worker# SGMLTAG
657*bd1f8aebSAndroid Build Coastguard Worker# TOKEN
658*bd1f8aebSAndroid Build Coastguard Worker
659*bd1f8aebSAndroid Build Coastguard Worker# DATABASE
660*bd1f8aebSAndroid Build Coastguard Worker# HARDWARE
661*bd1f8aebSAndroid Build Coastguard Worker# INTERFACE
662*bd1f8aebSAndroid Build Coastguard Worker# MEDIALABEL
663*bd1f8aebSAndroid Build Coastguard Worker
664*bd1f8aebSAndroid Build Coastguard Worker# There doesn't seem to be a good way to represent LITERAL in -man
665*bd1f8aebSAndroid Build Coastguard Worker
666*bd1f8aebSAndroid Build Coastguard Worker
667*bd1f8aebSAndroid Build Coastguard Worker
668*bd1f8aebSAndroid Build Coastguard Worker########################################################################
669*bd1f8aebSAndroid Build Coastguard Worker#
670*bd1f8aebSAndroid Build Coastguard Worker# Paragraph and paragraph-like elements
671*bd1f8aebSAndroid Build Coastguard Worker#
672*bd1f8aebSAndroid Build Coastguard Worker########################################################################
673*bd1f8aebSAndroid Build Coastguard Worker
674*bd1f8aebSAndroid Build Coastguard Workersub para_start {
675*bd1f8aebSAndroid Build Coastguard Worker	output "\n" unless $newline_last++;
676*bd1f8aebSAndroid Build Coastguard Worker
677*bd1f8aebSAndroid Build Coastguard Worker	# In lists, etc., don't start paragraph with .PP since
678*bd1f8aebSAndroid Build Coastguard Worker	# the indentation will be gone.
679*bd1f8aebSAndroid Build Coastguard Worker
680*bd1f8aebSAndroid Build Coastguard Worker	if($_[0]->parent->ext->{'nobreak'}==1) {
681*bd1f8aebSAndroid Build Coastguard Worker		# Usually this is the FIRST element of
682*bd1f8aebSAndroid Build Coastguard Worker		# a hanging tag, so we MUST not do a full
683*bd1f8aebSAndroid Build Coastguard Worker		# paragraph break.
684*bd1f8aebSAndroid Build Coastguard Worker		$_[0]->parent->ext->{'nobreak'} = 2;
685*bd1f8aebSAndroid Build Coastguard Worker	} elsif($_[0]->parent->ext->{'nobreak'}==2) {
686*bd1f8aebSAndroid Build Coastguard Worker		# Usually these are the NEXT elements of
687*bd1f8aebSAndroid Build Coastguard Worker		# a hanging tag.  If we break using a blank
688*bd1f8aebSAndroid Build Coastguard Worker		# line, we're okay.
689*bd1f8aebSAndroid Build Coastguard Worker		output "\n";
690*bd1f8aebSAndroid Build Coastguard Worker	} else {
691*bd1f8aebSAndroid Build Coastguard Worker		# Normal case. (For indented blocks too, at least
692*bd1f8aebSAndroid Build Coastguard Worker		# -man isn't so braindead in this area.)
693*bd1f8aebSAndroid Build Coastguard Worker		output ".PP\n";
694*bd1f8aebSAndroid Build Coastguard Worker	}
695*bd1f8aebSAndroid Build Coastguard Worker}
696*bd1f8aebSAndroid Build Coastguard Worker# Actually applies to a few other block elements as well
697*bd1f8aebSAndroid Build Coastguard Workersub para_end {
698*bd1f8aebSAndroid Build Coastguard Worker	output "\n" unless $newline_last++;
699*bd1f8aebSAndroid Build Coastguard Worker}
700*bd1f8aebSAndroid Build Coastguard Worker
701*bd1f8aebSAndroid Build Coastguard Workersgml('<PARA>', \&para_start);
702*bd1f8aebSAndroid Build Coastguard Workersgml('</PARA>', \&para_end);
703*bd1f8aebSAndroid Build Coastguard Workersgml('<SIMPARA>', \&para_start);
704*bd1f8aebSAndroid Build Coastguard Workersgml('</SIMPARA>', \&para_end);
705*bd1f8aebSAndroid Build Coastguard Worker
706*bd1f8aebSAndroid Build Coastguard Worker# Nothing special, except maybe FIXME set nobreak.
707*bd1f8aebSAndroid Build Coastguard Workersgml('<INFORMALEXAMPLE>', \&para_start);
708*bd1f8aebSAndroid Build Coastguard Workersgml('</INFORMALEXAMPLE>', \&para_end);
709*bd1f8aebSAndroid Build Coastguard Worker
710*bd1f8aebSAndroid Build Coastguard Worker
711*bd1f8aebSAndroid Build Coastguard Worker
712*bd1f8aebSAndroid Build Coastguard Worker
713*bd1f8aebSAndroid Build Coastguard Worker
714*bd1f8aebSAndroid Build Coastguard Worker########################################################################
715*bd1f8aebSAndroid Build Coastguard Worker#
716*bd1f8aebSAndroid Build Coastguard Worker# Blocks using SS sections
717*bd1f8aebSAndroid Build Coastguard Worker#
718*bd1f8aebSAndroid Build Coastguard Worker########################################################################
719*bd1f8aebSAndroid Build Coastguard Worker
720*bd1f8aebSAndroid Build Coastguard Worker# FIXME: We need to consider the effects of SS
721*bd1f8aebSAndroid Build Coastguard Worker# in a hanging tag :(
722*bd1f8aebSAndroid Build Coastguard Worker
723*bd1f8aebSAndroid Build Coastguard Worker# Complete with the optional-title dilemma (again).
724*bd1f8aebSAndroid Build Coastguard Workersgml('<ABSTRACT>', sub {
725*bd1f8aebSAndroid Build Coastguard Worker	$_[0]->ext->{'title'} = 'ABSTRACT';
726*bd1f8aebSAndroid Build Coastguard Worker	output "\n" unless $newline_last++;
727*bd1f8aebSAndroid Build Coastguard Worker	push_output('string');
728*bd1f8aebSAndroid Build Coastguard Worker});
729*bd1f8aebSAndroid Build Coastguard Workersgml('</ABSTRACT>', sub {
730*bd1f8aebSAndroid Build Coastguard Worker	my $content = pop_output();
731*bd1f8aebSAndroid Build Coastguard Worker
732*bd1f8aebSAndroid Build Coastguard Worker	# As ABSTRACT is never on the same level as RefSect1,
733*bd1f8aebSAndroid Build Coastguard Worker	# this leaves us with only .SS in terms of -man macros.
734*bd1f8aebSAndroid Build Coastguard Worker	output ".SS \"", uc($_[0]->ext->{'title'}), "\"\n";
735*bd1f8aebSAndroid Build Coastguard Worker
736*bd1f8aebSAndroid Build Coastguard Worker	output $content;
737*bd1f8aebSAndroid Build Coastguard Worker	output "\n" unless $newline_last++;
738*bd1f8aebSAndroid Build Coastguard Worker});
739*bd1f8aebSAndroid Build Coastguard Worker
740*bd1f8aebSAndroid Build Coastguard Worker# Ah, I needed a break.  Example always has a title.
741*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<EXAMPLE>', "\n.SS ");
742*bd1f8aebSAndroid Build Coastguard Workersgml('</EXAMPLE>', \&para_end);
743*bd1f8aebSAndroid Build Coastguard Worker
744*bd1f8aebSAndroid Build Coastguard Worker# Same with sidebar.
745*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<SIDEBAR>', "\n.SS ");
746*bd1f8aebSAndroid Build Coastguard Workersgml('</SIDEBAR>', \&para_end);
747*bd1f8aebSAndroid Build Coastguard Worker
748*bd1f8aebSAndroid Build Coastguard Worker# NO title.
749*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<HIGHLIGHTS>', "\n.SS HIGHLIGHTS\n");
750*bd1f8aebSAndroid Build Coastguard Workersgml('</HIGHLIGHTS>', \&para_end);
751*bd1f8aebSAndroid Build Coastguard Worker
752*bd1f8aebSAndroid Build Coastguard Worker
753*bd1f8aebSAndroid Build Coastguard Worker
754*bd1f8aebSAndroid Build Coastguard Worker
755*bd1f8aebSAndroid Build Coastguard Worker########################################################################
756*bd1f8aebSAndroid Build Coastguard Worker#
757*bd1f8aebSAndroid Build Coastguard Worker# Indented 'Block' elements
758*bd1f8aebSAndroid Build Coastguard Worker#
759*bd1f8aebSAndroid Build Coastguard Worker########################################################################
760*bd1f8aebSAndroid Build Coastguard Worker
761*bd1f8aebSAndroid Build Coastguard Workersub indent_block_start
762*bd1f8aebSAndroid Build Coastguard Worker{
763*bd1f8aebSAndroid Build Coastguard Worker	output "\n" unless $newline_last++;
764*bd1f8aebSAndroid Build Coastguard Worker	output ".sp\n.RS\n";
765*bd1f8aebSAndroid Build Coastguard Worker}
766*bd1f8aebSAndroid Build Coastguard Workersub indent_block_end
767*bd1f8aebSAndroid Build Coastguard Worker{
768*bd1f8aebSAndroid Build Coastguard Worker	output "\n" unless $newline_last++;
769*bd1f8aebSAndroid Build Coastguard Worker	output ".RE\n";
770*bd1f8aebSAndroid Build Coastguard Worker}
771*bd1f8aebSAndroid Build Coastguard Worker
772*bd1f8aebSAndroid Build Coastguard Worker# This element is almost like an admonition (below),
773*bd1f8aebSAndroid Build Coastguard Worker# only the default title is blank :)
774*bd1f8aebSAndroid Build Coastguard Worker
775*bd1f8aebSAndroid Build Coastguard Workersgml('<BLOCKQUOTE>', sub {
776*bd1f8aebSAndroid Build Coastguard Worker	$_[0]->ext->{'title'} = '';
777*bd1f8aebSAndroid Build Coastguard Worker	output "\n" unless $newline_last++;
778*bd1f8aebSAndroid Build Coastguard Worker	push_output('string');
779*bd1f8aebSAndroid Build Coastguard Worker});
780*bd1f8aebSAndroid Build Coastguard Workersgml('</BLOCKQUOTE>', sub {
781*bd1f8aebSAndroid Build Coastguard Worker	my $content = pop_output();
782*bd1f8aebSAndroid Build Coastguard Worker
783*bd1f8aebSAndroid Build Coastguard Worker	indent_block_start();
784*bd1f8aebSAndroid Build Coastguard Worker
785*bd1f8aebSAndroid Build Coastguard Worker	if($_[0]->ext->{'title'}) {
786*bd1f8aebSAndroid Build Coastguard Worker		output ".B \"", $_[0]->ext->{'title'}, ":\"\n";
787*bd1f8aebSAndroid Build Coastguard Worker	}
788*bd1f8aebSAndroid Build Coastguard Worker
789*bd1f8aebSAndroid Build Coastguard Worker	output $content;
790*bd1f8aebSAndroid Build Coastguard Worker
791*bd1f8aebSAndroid Build Coastguard Worker	if($_[0]->ext->{'attribution'}) {
792*bd1f8aebSAndroid Build Coastguard Worker		output "\n" unless $newline_last++;
793*bd1f8aebSAndroid Build Coastguard Worker		# One place where roff's space-sensitivity makes sense :)
794*bd1f8aebSAndroid Build Coastguard Worker		output "\n                -- ";
795*bd1f8aebSAndroid Build Coastguard Worker		output $_[0]->ext->{'attribution'} . "\n";
796*bd1f8aebSAndroid Build Coastguard Worker	}
797*bd1f8aebSAndroid Build Coastguard Worker
798*bd1f8aebSAndroid Build Coastguard Worker	indent_block_end();
799*bd1f8aebSAndroid Build Coastguard Worker});
800*bd1f8aebSAndroid Build Coastguard Worker
801*bd1f8aebSAndroid Build Coastguard Worker# Set off admonitions from the rest of the text by indenting.
802*bd1f8aebSAndroid Build Coastguard Worker# FIXME: Need to check if this works inside paragraphs, not enclosing them.
803*bd1f8aebSAndroid Build Coastguard Workersub admonition_end {
804*bd1f8aebSAndroid Build Coastguard Worker	my $content = pop_output();
805*bd1f8aebSAndroid Build Coastguard Worker
806*bd1f8aebSAndroid Build Coastguard Worker	indent_block_start();
807*bd1f8aebSAndroid Build Coastguard Worker
808*bd1f8aebSAndroid Build Coastguard Worker	# When the admonition is only one paragraph,
809*bd1f8aebSAndroid Build Coastguard Worker	# it looks nicer if the title was inline.
810*bd1f8aebSAndroid Build Coastguard Worker	my $num_para;
811*bd1f8aebSAndroid Build Coastguard Worker	while ($content =~ /^\.PP/gm) { $num_para++ }
812*bd1f8aebSAndroid Build Coastguard Worker	if($num_para==1) {
813*bd1f8aebSAndroid Build Coastguard Worker		$content =~ s/^\.PP\n//;
814*bd1f8aebSAndroid Build Coastguard Worker	}
815*bd1f8aebSAndroid Build Coastguard Worker
816*bd1f8aebSAndroid Build Coastguard Worker	output ".B \"" . $_[0]->ext->{'title'} . ":\"\n";
817*bd1f8aebSAndroid Build Coastguard Worker	output $content;
818*bd1f8aebSAndroid Build Coastguard Worker
819*bd1f8aebSAndroid Build Coastguard Worker	indent_block_end();
820*bd1f8aebSAndroid Build Coastguard Worker}
821*bd1f8aebSAndroid Build Coastguard Worker
822*bd1f8aebSAndroid Build Coastguard Workersgml('<NOTE>', sub {
823*bd1f8aebSAndroid Build Coastguard Worker	# We can't see right now whether or not there is a TITLE
824*bd1f8aebSAndroid Build Coastguard Worker	# element, so we have to save the output now and add it back
825*bd1f8aebSAndroid Build Coastguard Worker	# at the end of this admonition.
826*bd1f8aebSAndroid Build Coastguard Worker	$_[0]->ext->{'title'} = 'Note';
827*bd1f8aebSAndroid Build Coastguard Worker
828*bd1f8aebSAndroid Build Coastguard Worker	# Although admonition_end's indent_block_start will do this,
829*bd1f8aebSAndroid Build Coastguard Worker	# we need to synchronize the output _now_
830*bd1f8aebSAndroid Build Coastguard Worker	output "\n" unless $newline_last++;
831*bd1f8aebSAndroid Build Coastguard Worker
832*bd1f8aebSAndroid Build Coastguard Worker	push_output('string');
833*bd1f8aebSAndroid Build Coastguard Worker});
834*bd1f8aebSAndroid Build Coastguard Workersgml('</NOTE>', \&admonition_end);
835*bd1f8aebSAndroid Build Coastguard Worker
836*bd1f8aebSAndroid Build Coastguard Worker# Same as above.
837*bd1f8aebSAndroid Build Coastguard Workersgml('<WARNING>', sub {
838*bd1f8aebSAndroid Build Coastguard Worker	$_[0]->ext->{'title'} = 'Warning';
839*bd1f8aebSAndroid Build Coastguard Worker	output "\n" unless $newline_last++;
840*bd1f8aebSAndroid Build Coastguard Worker	push_output('string');
841*bd1f8aebSAndroid Build Coastguard Worker});
842*bd1f8aebSAndroid Build Coastguard Workersgml('</WARNING>', \&admonition_end);
843*bd1f8aebSAndroid Build Coastguard Worker
844*bd1f8aebSAndroid Build Coastguard Workersgml('<TIP>', sub {
845*bd1f8aebSAndroid Build Coastguard Worker	$_[0]->ext->{'title'} = 'Tip';
846*bd1f8aebSAndroid Build Coastguard Worker	output "\n" unless $newline_last++;
847*bd1f8aebSAndroid Build Coastguard Worker	push_output('string');
848*bd1f8aebSAndroid Build Coastguard Worker});
849*bd1f8aebSAndroid Build Coastguard Workersgml('</TIP>', \&admonition_end);
850*bd1f8aebSAndroid Build Coastguard Workersgml('<CAUTION>', sub {
851*bd1f8aebSAndroid Build Coastguard Worker	$_[0]->ext->{'title'} = 'Caution';
852*bd1f8aebSAndroid Build Coastguard Worker	output "\n" unless $newline_last++;
853*bd1f8aebSAndroid Build Coastguard Worker	push_output('string');
854*bd1f8aebSAndroid Build Coastguard Worker});
855*bd1f8aebSAndroid Build Coastguard Workersgml('</CAUTION>', \&admonition_end);
856*bd1f8aebSAndroid Build Coastguard Worker
857*bd1f8aebSAndroid Build Coastguard Workersgml('<IMPORTANT>', sub {
858*bd1f8aebSAndroid Build Coastguard Worker	$_[0]->ext->{'title'} = 'Important';
859*bd1f8aebSAndroid Build Coastguard Worker	output "\n" unless $newline_last++;
860*bd1f8aebSAndroid Build Coastguard Worker	push_output('string');
861*bd1f8aebSAndroid Build Coastguard Worker});
862*bd1f8aebSAndroid Build Coastguard Workersgml('</IMPORTANT>', \&admonition_end);
863*bd1f8aebSAndroid Build Coastguard Worker
864*bd1f8aebSAndroid Build Coastguard Worker
865*bd1f8aebSAndroid Build Coastguard Worker
866*bd1f8aebSAndroid Build Coastguard Worker
867*bd1f8aebSAndroid Build Coastguard Worker
868*bd1f8aebSAndroid Build Coastguard Worker
869*bd1f8aebSAndroid Build Coastguard Worker
870*bd1f8aebSAndroid Build Coastguard Worker
871*bd1f8aebSAndroid Build Coastguard Worker
872*bd1f8aebSAndroid Build Coastguard Worker
873*bd1f8aebSAndroid Build Coastguard Worker
874*bd1f8aebSAndroid Build Coastguard Worker
875*bd1f8aebSAndroid Build Coastguard Worker########################################################################
876*bd1f8aebSAndroid Build Coastguard Worker#
877*bd1f8aebSAndroid Build Coastguard Worker# Verbatim displays.
878*bd1f8aebSAndroid Build Coastguard Worker#
879*bd1f8aebSAndroid Build Coastguard Worker########################################################################
880*bd1f8aebSAndroid Build Coastguard Worker
881*bd1f8aebSAndroid Build Coastguard Workersub verbatim_start {
882*bd1f8aebSAndroid Build Coastguard Worker	output "\n" unless $newline_last++;
883*bd1f8aebSAndroid Build Coastguard Worker
884*bd1f8aebSAndroid Build Coastguard Worker	if($_[0]->parent->ext->{'nobreak'}==1) {
885*bd1f8aebSAndroid Build Coastguard Worker		# Usually this is the FIRST element of
886*bd1f8aebSAndroid Build Coastguard Worker		# a hanging tag, so we MUST not do a full
887*bd1f8aebSAndroid Build Coastguard Worker		# paragraph break.
888*bd1f8aebSAndroid Build Coastguard Worker		$_[0]->parent->ext->{'nobreak'} = 2;
889*bd1f8aebSAndroid Build Coastguard Worker	} else {
890*bd1f8aebSAndroid Build Coastguard Worker		output "\n";
891*bd1f8aebSAndroid Build Coastguard Worker	}
892*bd1f8aebSAndroid Build Coastguard Worker
893*bd1f8aebSAndroid Build Coastguard Worker	output(".nf\n") unless $nocollapse_whitespace++;
894*bd1f8aebSAndroid Build Coastguard Worker}
895*bd1f8aebSAndroid Build Coastguard Worker
896*bd1f8aebSAndroid Build Coastguard Workersub verbatim_end {
897*bd1f8aebSAndroid Build Coastguard Worker	output "\n" unless $newline_last++;
898*bd1f8aebSAndroid Build Coastguard Worker	output(".fi\n") unless --$nocollapse_whitespace;
899*bd1f8aebSAndroid Build Coastguard Worker}
900*bd1f8aebSAndroid Build Coastguard Worker
901*bd1f8aebSAndroid Build Coastguard Workersgml('<PROGRAMLISTING>', \&verbatim_start);
902*bd1f8aebSAndroid Build Coastguard Workersgml('</PROGRAMLISTING>', \&verbatim_end);
903*bd1f8aebSAndroid Build Coastguard Worker
904*bd1f8aebSAndroid Build Coastguard Workersgml('<SCREEN>', \&verbatim_start);
905*bd1f8aebSAndroid Build Coastguard Workersgml('</SCREEN>', \&verbatim_end);
906*bd1f8aebSAndroid Build Coastguard Worker
907*bd1f8aebSAndroid Build Coastguard Workersgml('<LITERALLAYOUT>', \&verbatim_start);
908*bd1f8aebSAndroid Build Coastguard Workersgml('</LITERALLAYOUT>', \&verbatim_end);
909*bd1f8aebSAndroid Build Coastguard Worker
910*bd1f8aebSAndroid Build Coastguard Worker#sgml('<SYNOPSIS>', sub {
911*bd1f8aebSAndroid Build Coastguard Worker#	if($_[0]->attribute('FORMAT')->value =~ /linespecific/i) {
912*bd1f8aebSAndroid Build Coastguard Worker#		&verbatim_start;
913*bd1f8aebSAndroid Build Coastguard Worker#	} else {
914*bd1f8aebSAndroid Build Coastguard Worker#		roffcmd("");
915*bd1f8aebSAndroid Build Coastguard Worker#	}
916*bd1f8aebSAndroid Build Coastguard Worker#});
917*bd1f8aebSAndroid Build Coastguard Worker#
918*bd1f8aebSAndroid Build Coastguard Worker#sgml('</SYNOPSIS>', sub {
919*bd1f8aebSAndroid Build Coastguard Worker#	if($_[0]->attribute('FORMAT')->value =~ /linespecific/i) {
920*bd1f8aebSAndroid Build Coastguard Worker#		&verbatim_end;
921*bd1f8aebSAndroid Build Coastguard Worker#	}
922*bd1f8aebSAndroid Build Coastguard Worker#	else {
923*bd1f8aebSAndroid Build Coastguard Worker#		roffcmd("");# not sure about this.
924*bd1f8aebSAndroid Build Coastguard Worker#	}
925*bd1f8aebSAndroid Build Coastguard Worker#});
926*bd1f8aebSAndroid Build Coastguard Workersgml('<SYNOPSIS>', \&verbatim_start);
927*bd1f8aebSAndroid Build Coastguard Workersgml('</SYNOPSIS>', \&verbatim_end);
928*bd1f8aebSAndroid Build Coastguard Worker
929*bd1f8aebSAndroid Build Coastguard Worker
930*bd1f8aebSAndroid Build Coastguard Worker
931*bd1f8aebSAndroid Build Coastguard Worker
932*bd1f8aebSAndroid Build Coastguard Worker
933*bd1f8aebSAndroid Build Coastguard Worker
934*bd1f8aebSAndroid Build Coastguard Worker
935*bd1f8aebSAndroid Build Coastguard Worker
936*bd1f8aebSAndroid Build Coastguard Worker
937*bd1f8aebSAndroid Build Coastguard Worker########################################################################
938*bd1f8aebSAndroid Build Coastguard Worker#
939*bd1f8aebSAndroid Build Coastguard Worker# Lists
940*bd1f8aebSAndroid Build Coastguard Worker#
941*bd1f8aebSAndroid Build Coastguard Worker########################################################################
942*bd1f8aebSAndroid Build Coastguard Worker
943*bd1f8aebSAndroid Build Coastguard Worker# Indent nested lists.
944*bd1f8aebSAndroid Build Coastguard Workersub indent_list_start {
945*bd1f8aebSAndroid Build Coastguard Worker	if($list_nestlevel++) {
946*bd1f8aebSAndroid Build Coastguard Worker		output "\n" unless $newline_last++;
947*bd1f8aebSAndroid Build Coastguard Worker		output ".RS\n";
948*bd1f8aebSAndroid Build Coastguard Worker	}
949*bd1f8aebSAndroid Build Coastguard Worker}
950*bd1f8aebSAndroid Build Coastguard Workersub indent_list_end {
951*bd1f8aebSAndroid Build Coastguard Worker	if(--$list_nestlevel) {
952*bd1f8aebSAndroid Build Coastguard Worker		output "\n" unless $newline_last++;
953*bd1f8aebSAndroid Build Coastguard Worker		output ".RE\n";
954*bd1f8aebSAndroid Build Coastguard Worker	}
955*bd1f8aebSAndroid Build Coastguard Worker}
956*bd1f8aebSAndroid Build Coastguard Worker
957*bd1f8aebSAndroid Build Coastguard Workersgml('<VARIABLELIST>', \&indent_list_start);
958*bd1f8aebSAndroid Build Coastguard Workersgml('</VARIABLELIST>', \&indent_list_end);
959*bd1f8aebSAndroid Build Coastguard Workersgml('<ITEMIZEDLIST>', \&indent_list_start);
960*bd1f8aebSAndroid Build Coastguard Workersgml('</ITEMIZEDLIST>', \&indent_list_end);
961*bd1f8aebSAndroid Build Coastguard Workersgml('<ORDEREDLIST>', sub {
962*bd1f8aebSAndroid Build Coastguard Worker	indent_list_start();
963*bd1f8aebSAndroid Build Coastguard Worker	$_[0]->ext->{'count'} = 1;
964*bd1f8aebSAndroid Build Coastguard Worker});
965*bd1f8aebSAndroid Build Coastguard Workersgml('</ORDEREDLIST>', \&indent_list_end);
966*bd1f8aebSAndroid Build Coastguard Worker
967*bd1f8aebSAndroid Build Coastguard Worker# Output content on one line, bolded.
968*bd1f8aebSAndroid Build Coastguard Workersgml('<TERM>', sub {
969*bd1f8aebSAndroid Build Coastguard Worker	output "\n" unless $newline_last++;
970*bd1f8aebSAndroid Build Coastguard Worker	output ".TP\n";
971*bd1f8aebSAndroid Build Coastguard Worker	bold_on();
972*bd1f8aebSAndroid Build Coastguard Worker	push_output('string');
973*bd1f8aebSAndroid Build Coastguard Worker});
974*bd1f8aebSAndroid Build Coastguard Workersgml('</TERM>', sub {
975*bd1f8aebSAndroid Build Coastguard Worker	my $term = pop_output();
976*bd1f8aebSAndroid Build Coastguard Worker	$term =~ tr/\n/ /;
977*bd1f8aebSAndroid Build Coastguard Worker	output $term;
978*bd1f8aebSAndroid Build Coastguard Worker	font_off();
979*bd1f8aebSAndroid Build Coastguard Worker	output "\n";
980*bd1f8aebSAndroid Build Coastguard Worker	$newline_last = 1;
981*bd1f8aebSAndroid Build Coastguard Worker});
982*bd1f8aebSAndroid Build Coastguard Worker
983*bd1f8aebSAndroid Build Coastguard Workersgml('<LISTITEM>', sub {
984*bd1f8aebSAndroid Build Coastguard Worker	# A bulleted list.
985*bd1f8aebSAndroid Build Coastguard Worker	if($_[0]->in('ITEMIZEDLIST')) {
986*bd1f8aebSAndroid Build Coastguard Worker		output "\n" unless $newline_last++;
987*bd1f8aebSAndroid Build Coastguard Worker		output ".TP 0.2i\n\\(bu\n";
988*bd1f8aebSAndroid Build Coastguard Worker	}
989*bd1f8aebSAndroid Build Coastguard Worker
990*bd1f8aebSAndroid Build Coastguard Worker	# Need numbers.
991*bd1f8aebSAndroid Build Coastguard Worker	# Assume Arabic numeration for now.
992*bd1f8aebSAndroid Build Coastguard Worker	elsif($_[0]->in('ORDEREDLIST')) {
993*bd1f8aebSAndroid Build Coastguard Worker		output "\n" unless $newline_last++;
994*bd1f8aebSAndroid Build Coastguard Worker		output ".TP ", $_[0]->parent->ext->{'count'}++, ". \n";
995*bd1f8aebSAndroid Build Coastguard Worker	}
996*bd1f8aebSAndroid Build Coastguard Worker
997*bd1f8aebSAndroid Build Coastguard Worker	$_[0]->ext->{'nobreak'} = 1;
998*bd1f8aebSAndroid Build Coastguard Worker});
999*bd1f8aebSAndroid Build Coastguard Worker
1000*bd1f8aebSAndroid Build Coastguard Workersgml('<SIMPLELIST>', sub {
1001*bd1f8aebSAndroid Build Coastguard Worker	$_[0]->ext->{'first_member'} = 1;
1002*bd1f8aebSAndroid Build Coastguard Worker});
1003*bd1f8aebSAndroid Build Coastguard Worker
1004*bd1f8aebSAndroid Build Coastguard Workersgml('<MEMBER>', sub {
1005*bd1f8aebSAndroid Build Coastguard Worker	my $parent = $_[0]->parent;
1006*bd1f8aebSAndroid Build Coastguard Worker
1007*bd1f8aebSAndroid Build Coastguard Worker	if($parent->attribute('TYPE')->value =~ /Inline/i) {
1008*bd1f8aebSAndroid Build Coastguard Worker		if($parent->ext->{'first_member'}) {
1009*bd1f8aebSAndroid Build Coastguard Worker			# If this is the first member don't put any commas
1010*bd1f8aebSAndroid Build Coastguard Worker			$parent->ext->{'first_member'} = 0;
1011*bd1f8aebSAndroid Build Coastguard Worker		} else {
1012*bd1f8aebSAndroid Build Coastguard Worker			output ", ";
1013*bd1f8aebSAndroid Build Coastguard Worker		}
1014*bd1f8aebSAndroid Build Coastguard Worker	} elsif($parent->attribute('TYPE')->value =~ /Vert/i) {
1015*bd1f8aebSAndroid Build Coastguard Worker		output "\n" unless $newline_last++;
1016*bd1f8aebSAndroid Build Coastguard Worker		output "\n";
1017*bd1f8aebSAndroid Build Coastguard Worker	}
1018*bd1f8aebSAndroid Build Coastguard Worker});
1019*bd1f8aebSAndroid Build Coastguard Worker
1020*bd1f8aebSAndroid Build Coastguard Worker
1021*bd1f8aebSAndroid Build Coastguard Worker
1022*bd1f8aebSAndroid Build Coastguard Worker
1023*bd1f8aebSAndroid Build Coastguard Worker
1024*bd1f8aebSAndroid Build Coastguard Worker########################################################################
1025*bd1f8aebSAndroid Build Coastguard Worker#
1026*bd1f8aebSAndroid Build Coastguard Worker# Stuff we don't know how to handle (yet)
1027*bd1f8aebSAndroid Build Coastguard Worker#
1028*bd1f8aebSAndroid Build Coastguard Worker########################################################################
1029*bd1f8aebSAndroid Build Coastguard Worker
1030*bd1f8aebSAndroid Build Coastguard Worker# Address blocks:
1031*bd1f8aebSAndroid Build Coastguard Worker
1032*bd1f8aebSAndroid Build Coastguard Worker# Credit stuff:
1033*bd1f8aebSAndroid Build Coastguard Worker# ACKNO
1034*bd1f8aebSAndroid Build Coastguard Worker# ADDRESS
1035*bd1f8aebSAndroid Build Coastguard Worker# AFFILIATION
1036*bd1f8aebSAndroid Build Coastguard Worker# ARTPAGENUMS
1037*bd1f8aebSAndroid Build Coastguard Worker# ATTRIBUTION
1038*bd1f8aebSAndroid Build Coastguard Worker# AUTHORBLURB
1039*bd1f8aebSAndroid Build Coastguard Worker# AUTHORGROUP
1040*bd1f8aebSAndroid Build Coastguard Worker# OTHERCREDIT
1041*bd1f8aebSAndroid Build Coastguard Worker# HONORIFIC
1042*bd1f8aebSAndroid Build Coastguard Worker
1043*bd1f8aebSAndroid Build Coastguard Worker# Areas:
1044*bd1f8aebSAndroid Build Coastguard Worker# AREA
1045*bd1f8aebSAndroid Build Coastguard Worker# AREASET
1046*bd1f8aebSAndroid Build Coastguard Worker# AREASPEC
1047*bd1f8aebSAndroid Build Coastguard Worker
1048*bd1f8aebSAndroid Build Coastguard Worker
1049*bd1f8aebSAndroid Build Coastguard Worker
1050*bd1f8aebSAndroid Build Coastguard Worker
1051*bd1f8aebSAndroid Build Coastguard Worker
1052*bd1f8aebSAndroid Build Coastguard Worker########################################################################
1053*bd1f8aebSAndroid Build Coastguard Worker#
1054*bd1f8aebSAndroid Build Coastguard Worker# Linkage, cross references
1055*bd1f8aebSAndroid Build Coastguard Worker#
1056*bd1f8aebSAndroid Build Coastguard Worker########################################################################
1057*bd1f8aebSAndroid Build Coastguard Worker
1058*bd1f8aebSAndroid Build Coastguard Worker# Print the URL
1059*bd1f8aebSAndroid Build Coastguard Workersgml('</ULINK>', sub {
1060*bd1f8aebSAndroid Build Coastguard Worker#	output ' <URL:', $_[0]->attribute('URL')->value, '>';
1061*bd1f8aebSAndroid Build Coastguard Worker	$newline_last = 0;
1062*bd1f8aebSAndroid Build Coastguard Worker});
1063*bd1f8aebSAndroid Build Coastguard Worker
1064*bd1f8aebSAndroid Build Coastguard Worker# If cross reference target is a RefEntry,
1065*bd1f8aebSAndroid Build Coastguard Worker# output CiteRefEntry-style references.
1066*bd1f8aebSAndroid Build Coastguard Workersgml('<XREF>', sub {
1067*bd1f8aebSAndroid Build Coastguard Worker	my $id = $_[0]->attribute('LINKEND')->value;
1068*bd1f8aebSAndroid Build Coastguard Worker	my $manref = $Refs->get("refentry:$id");
1069*bd1f8aebSAndroid Build Coastguard Worker
1070*bd1f8aebSAndroid Build Coastguard Worker	if($manref) {
1071*bd1f8aebSAndroid Build Coastguard Worker		my ($title, $sect) = ($manref =~ /(.*)(\(.*\))/);
1072*bd1f8aebSAndroid Build Coastguard Worker		bold_on();
1073*bd1f8aebSAndroid Build Coastguard Worker		output $title;
1074*bd1f8aebSAndroid Build Coastguard Worker		font_off();
1075*bd1f8aebSAndroid Build Coastguard Worker		output $sect;
1076*bd1f8aebSAndroid Build Coastguard Worker	} else {
1077*bd1f8aebSAndroid Build Coastguard Worker		$blank_xrefs++ if $write_manpages;
1078*bd1f8aebSAndroid Build Coastguard Worker		output "[XRef to $id]";
1079*bd1f8aebSAndroid Build Coastguard Worker	}
1080*bd1f8aebSAndroid Build Coastguard Worker
1081*bd1f8aebSAndroid Build Coastguard Worker	$newline_last = 0;
1082*bd1f8aebSAndroid Build Coastguard Worker});
1083*bd1f8aebSAndroid Build Coastguard Worker
1084*bd1f8aebSAndroid Build Coastguard Worker# Anchor
1085*bd1f8aebSAndroid Build Coastguard Worker
1086*bd1f8aebSAndroid Build Coastguard Worker
1087*bd1f8aebSAndroid Build Coastguard Worker
1088*bd1f8aebSAndroid Build Coastguard Worker
1089*bd1f8aebSAndroid Build Coastguard Worker########################################################################
1090*bd1f8aebSAndroid Build Coastguard Worker#
1091*bd1f8aebSAndroid Build Coastguard Worker# Other handlers
1092*bd1f8aebSAndroid Build Coastguard Worker#
1093*bd1f8aebSAndroid Build Coastguard Worker########################################################################
1094*bd1f8aebSAndroid Build Coastguard Worker
1095*bd1f8aebSAndroid Build Coastguard Workerman_sgml('|[lt    ]|', '<');
1096*bd1f8aebSAndroid Build Coastguard Workerman_sgml('|[gt    ]|', '>');
1097*bd1f8aebSAndroid Build Coastguard Workerman_sgml('|[amp   ]|', '&');
1098*bd1f8aebSAndroid Build Coastguard Worker
1099*bd1f8aebSAndroid Build Coastguard Worker#
1100*bd1f8aebSAndroid Build Coastguard Worker# Default handlers (uncomment these if needed).  Right now, these are set
1101*bd1f8aebSAndroid Build Coastguard Worker# up to gag on any unrecognised elements, sdata, processing-instructions,
1102*bd1f8aebSAndroid Build Coastguard Worker# or entities.
1103*bd1f8aebSAndroid Build Coastguard Worker#
1104*bd1f8aebSAndroid Build Coastguard Worker# sgml('start_element',sub { die "Unknown element: " . $_[0]->name; });
1105*bd1f8aebSAndroid Build Coastguard Worker# sgml('end_element','');
1106*bd1f8aebSAndroid Build Coastguard Worker
1107*bd1f8aebSAndroid Build Coastguard Worker# This is for weeding out and escaping certain characters.
1108*bd1f8aebSAndroid Build Coastguard Worker# This looks like it's inefficient since it's done on every line, but
1109*bd1f8aebSAndroid Build Coastguard Worker# in reality, SGMLSpm and sgmlspl parsing ESIS takes _much_ longer.
1110*bd1f8aebSAndroid Build Coastguard Worker
1111*bd1f8aebSAndroid Build Coastguard Workersgml('cdata', sub
1112*bd1f8aebSAndroid Build Coastguard Worker{
1113*bd1f8aebSAndroid Build Coastguard Worker	if(!$write_manpages) { return; }
1114*bd1f8aebSAndroid Build Coastguard Worker	elsif($raw_cdata) { output $_[0]; return; }
1115*bd1f8aebSAndroid Build Coastguard Worker
1116*bd1f8aebSAndroid Build Coastguard Worker	# Escape backslashes
1117*bd1f8aebSAndroid Build Coastguard Worker	$_[0] =~ s/\\/\\\\/g;
1118*bd1f8aebSAndroid Build Coastguard Worker
1119*bd1f8aebSAndroid Build Coastguard Worker	# In non-'pre'-type elements:
1120*bd1f8aebSAndroid Build Coastguard Worker	if(!$nocollapse_whitespace) {
1121*bd1f8aebSAndroid Build Coastguard Worker		# Change tabs to spaces
1122*bd1f8aebSAndroid Build Coastguard Worker		$_[0] =~ tr/\t/ /;
1123*bd1f8aebSAndroid Build Coastguard Worker
1124*bd1f8aebSAndroid Build Coastguard Worker		# Do not allow indents at beginning of line
1125*bd1f8aebSAndroid Build Coastguard Worker		# groff chokes on that.
1126*bd1f8aebSAndroid Build Coastguard Worker		if($newline_last) {
1127*bd1f8aebSAndroid Build Coastguard Worker			$_[0] =~ s/^ +//;
1128*bd1f8aebSAndroid Build Coastguard Worker
1129*bd1f8aebSAndroid Build Coastguard Worker			# If the line is all blank, don't do anything.
1130*bd1f8aebSAndroid Build Coastguard Worker			if($_[0] eq '') { return; }
1131*bd1f8aebSAndroid Build Coastguard Worker
1132*bd1f8aebSAndroid Build Coastguard Worker			$_[0] =~ s/^\./\\\&\./;
1133*bd1f8aebSAndroid Build Coastguard Worker
1134*bd1f8aebSAndroid Build Coastguard Worker			# Argh... roff doesn't like ' either...
1135*bd1f8aebSAndroid Build Coastguard Worker			$_[0] =~ s/^\'/\\\&\'/;
1136*bd1f8aebSAndroid Build Coastguard Worker		}
1137*bd1f8aebSAndroid Build Coastguard Worker	}
1138*bd1f8aebSAndroid Build Coastguard Worker
1139*bd1f8aebSAndroid Build Coastguard Worker	$newline_last = 0;
1140*bd1f8aebSAndroid Build Coastguard Worker
1141*bd1f8aebSAndroid Build Coastguard Worker	output $_[0];
1142*bd1f8aebSAndroid Build Coastguard Worker});
1143*bd1f8aebSAndroid Build Coastguard Worker
1144*bd1f8aebSAndroid Build Coastguard Worker
1145*bd1f8aebSAndroid Build Coastguard Worker# When in whitespace-collapsing mode, we disallow consecutive newlines.
1146*bd1f8aebSAndroid Build Coastguard Worker
1147*bd1f8aebSAndroid Build Coastguard Workersgml('re', sub
1148*bd1f8aebSAndroid Build Coastguard Worker{
1149*bd1f8aebSAndroid Build Coastguard Worker	if($nocollapse_whitespace || !$newline_last) {
1150*bd1f8aebSAndroid Build Coastguard Worker		output "\n";
1151*bd1f8aebSAndroid Build Coastguard Worker	}
1152*bd1f8aebSAndroid Build Coastguard Worker
1153*bd1f8aebSAndroid Build Coastguard Worker	$newline_last = 1;
1154*bd1f8aebSAndroid Build Coastguard Worker});
1155*bd1f8aebSAndroid Build Coastguard Worker
1156*bd1f8aebSAndroid Build Coastguard Workersgml('sdata',sub { die "Unknown SDATA: " . $_[0]; });
1157*bd1f8aebSAndroid Build Coastguard Workersgml('pi',sub { die "Unknown processing instruction: " . $_[0]; });
1158*bd1f8aebSAndroid Build Coastguard Workersgml('entity',sub { die "Unknown external entity: " . $_[0]->name; });
1159*bd1f8aebSAndroid Build Coastguard Workersgml('start_subdoc',sub { die "Unknown subdoc entity: " . $_[0]->name; });
1160*bd1f8aebSAndroid Build Coastguard Workersgml('end_subdoc','');
1161*bd1f8aebSAndroid Build Coastguard Workersgml('conforming','');
1162*bd1f8aebSAndroid Build Coastguard Worker
1163*bd1f8aebSAndroid Build Coastguard Worker1;
1164*bd1f8aebSAndroid Build Coastguard Worker
1165