* tmac/doc.tmac (doc-tag-list): Force horizontal mode after tag
[s-roff.git] / tmac / doc.tmac
blob97672b375c408272c34a067937e1ae4d7ee4d96f
1 .\" Copyright (c) 1991, 1993
2 .\"     The Regents of the University of California.  All rights reserved.
3 .\"
4 .\" Redistribution and use in source and binary forms, with or without
5 .\" modification, are permitted provided that the following conditions
6 .\" are met:
7 .\" 1. Redistributions of source code must retain the above copyright
8 .\"    notice, this list of conditions and the following disclaimer.
9 .\" 2. Redistributions in binary form must reproduce the above copyright
10 .\"    notice, this list of conditions and the following disclaimer in the
11 .\"    documentation and/or other materials provided with the distribution.
12 .\" 3. All advertising materials mentioning features or use of this software
13 .\"    must display the following acknowledgement:
14 .\"      This product includes software developed by the University of
15 .\"      California, Berkeley and its contributors.
16 .\" 4. Neither the name of the University nor the names of its contributors
17 .\"    may be used to endorse or promote products derived from this software
18 .\"    without specific prior written permission.
19 .\"
20 .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 .\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 .\" SUCH DAMAGE.
31 .\"
32 .\"     @(#)doc 8.1 (Berkeley) 06/08/93
33 .\"
34 .\" Modified by jjc@jclark.com as follows: the doc-* files are assumed to be
35 .\" installed as mdoc/doc-* rather than tmac.doc-* (the filename
36 .\" `tmac.doc-common' would be too long); when using groff, the doc-* files
37 .\" are loaded using the `mso' request.
38 .\"
39 .\" Modified by
40 .\"
41 .\"   Werner LEMBERG <wl@gnu.org>      and
42 .\"   Ruslan Ermilov <ru@freebsd.org>
43 .\"
44 .\" to make it more readable: using long names and many groff features,
45 .\" updating and extending documentation, etc.
46 .\"
47 .\" %beginstrip%
50 .if !\n(.g \
51 .  ab This version of mdoc can be run with GNU troff only!
54 .do if d Dd .nx
57 .cp 0
60 .if (\n[.x]\n[.y] < 118) \
61 .  ab You need GNU troff version 1.18 or higher to run this version of mdoc!
64 .\" Load start-up files
65 .ie t \
66 .  mso mdoc/doc-ditroff
67 .el \
68 .  mso mdoc/doc-nroff
70 .mso mdoc/doc-common
71 .mso mdoc/doc-syms
74 .eo
77 .\" NS doc-macro-name global string
78 .\" NS   name of calling request (set in each user-requestable macro)
80 .ds doc-macro-name
81 .als doc-arg0 doc-macro-name
84 .\" NS doc-arg-limit global register
85 .\" NS   total number of arguments
87 .nr doc-arg-limit 0
90 .\" NS doc-num-args global register
91 .\" NS   number of arguments to handle (must be set to \n[.$] prior to
92 .\" NS   `doc-parse-arg-vector' request)
94 .nr doc-num-args 0
97 .\" NS doc-arg-ptr global register
98 .\" NS   argument pointer
100 .nr doc-arg-ptr 0
103 .\" NS doc-argXXX global string
104 .\" NS   argument vector
105 .\" NS
106 .\" NS limit:
107 .\" NS   doc-arg-limit
109 .ds doc-arg1
112 .\" NS doc-typeXXX global register
113 .\" NS   argument type vector (macro=1, string=2, punctuation suffix=3,
114 .\" NS   punctuation prefix=4)
115 .\" NS
116 .\" NS limit:
117 .\" NS   doc-arg-limit
119 .nr doc-type1 0
122 .\" NS doc-spaceXXX global string
123 .\" NS   space vector
124 .\" NS
125 .\" NS limit:
126 .\" NS   doc-arg-limit
128 .ds doc-space1
131 .\" NS doc-parse-args macro
132 .\" NS   parse arguments (recursively) (`.doc-parse-args arg ...')
133 .\" NS
134 .\" NS modifies:
135 .\" NS   doc-arg-limit
136 .\" NS   doc-arg-ptr
137 .\" NS   doc-argXXX
138 .\" NS   doc-spaceXXX
139 .\" NS   doc-typeXXX
140 .\" NS   doc-arg-ptr
141 .\" NS   doc-have-space
142 .\" NS
143 .\" NS local variables:
144 .\" NS   doc-reg-dpa
145 .\" NS   doc-reg-dpa1
146 .\" NS   doc-str-dpa
148 .de doc-parse-args
149 .  if !\n[doc-arg-limit] \
150 .    doc-set-spacing-1
152 .  nr doc-have-space 0
154 .  if !\n[.$] \
155 .    return
157 .  nr doc-arg-limit +1
159 .  \" handle `|' and `...' specially
160 .  ie        "\$1"|" \
161 .    ds doc-arg\n[doc-arg-limit] \f[R]|\f[]
162 .  el \{ .ie "\$1"..." \
163 .    ds doc-arg\n[doc-arg-limit] \|.\|.\|.
164 .  el \
165 .    ds doc-arg\n[doc-arg-limit] "\$1
166 .  \}
168 .  \" get argument type and set spacing
169 .  doc-get-arg-type* \n[doc-arg-limit]
170 .  nr doc-type\n[doc-arg-limit] \n[doc-arg-type]
171 .  doc-set-spacing-\n[doc-arg-type]
173 .  \" check whether we have processed the last parameter
174 .  ie (\n[.$] == 1) \
175 .    nr doc-arg-ptr 0
176 .  el \{\
177 .    shift
178 .    doc-parse-args \$@
179 .  \}
181 .  nh
185 .\" NS doc-parse-arg-vector macro
186 .\" NS   parse argument vector (recursive)
187 .\" NS
188 .\" NS   cf. comments in doc-parse-args
189 .\" NS
190 .\" NS modifies:
191 .\" NS   doc-arg-limit
192 .\" NS   doc-arg-ptr
193 .\" NS   doc-argXXX
194 .\" NS   doc-num-args
195 .\" NS   doc-spaceXXX
196 .\" NS   doc-typeXXX
197 .\" NS
198 .\" NS local variables:
199 .\" NS   doc-reg-dpav
200 .\" NS   doc-reg-dpav1
201 .\" NS   doc-str-dpav
203 .de doc-parse-arg-vector
204 .  if !\n[doc-arg-limit] \
205 .    doc-set-spacing-1
207 .  nr doc-arg-limit +1
209 .  ie        "\*[doc-arg\n[doc-arg-limit]]"|" \
210 .    ds doc-arg\n[doc-arg-limit] \f[R]|\f[]
211 .  el \{ .if "\*[doc-arg\n[doc-arg-limit]]"..." \
212 .    ds doc-arg\n[doc-arg-limit] \|.\|.\|.
213 .  \}
215 .  doc-get-arg-type* \n[doc-arg-limit]
216 .  nr doc-type\n[doc-arg-limit] \n[doc-arg-type]
217 .  doc-set-spacing-\n[doc-arg-type]
219 .  ie (\n[doc-num-args] == 1) \{\
220 .    nr doc-arg-ptr 0
221 .    nr doc-num-args 0
222 .  \}
223 .  el \{\
224 .    nr doc-num-args -1
225 .    doc-parse-arg-vector
226 .  \}
228 .  nh
232 .\" NS doc-parse-space-vector macro
233 .\" NS   parse space vector (recursive)
234 .\" NS
235 .\" NS modifies:
236 .\" NS   doc-arg-limit
237 .\" NS   doc-num-args
238 .\" NS   doc-spaceXXX
240 .de doc-parse-space-vector
241 .  nr doc-arg-limit +1
243 .  doc-set-spacing-\n[doc-type\n[doc-arg-limit]]
245 .  ie (\n[doc-num-args] == 1) \
246 .    nr doc-num-args 0
247 .  el \{\
248 .    nr doc-num-args -1
249 .    doc-parse-space-vector
250 .  \}
254 .\" NS doc-remaining-args macro
255 .\" NS   output remaining arguments as-is, separated by spaces (until
256 .\" NS   `doc-num-args' is exhausted)
257 .\" NS
258 .\" NS modifies:
259 .\" NS   doc-arg-ptr
260 .\" NS   doc-num-args
262 .de doc-remaining-args
263 .  nr doc-arg-ptr +1
264 .  nop \)\*[doc-arg\n[doc-arg-ptr]]\c
266 .  ie (\n[doc-num-args] == 1) \{\
267 .    nr doc-arg-ptr 0
268 .    nr doc-num-args 0
269 .  \}
270 .  el \{\
271 .    nop \)\*[doc-space]\c
272 .    nr doc-num-args -1
273 .    doc-remaining-args
274 .  \}
278 .\" NS doc-append-arg macro
279 .\" NS   append one argument to argument vector:
280 .\" NS   `.doc-append-arg [arg] [type]'
281 .\" NS
282 .\" NS modifies:
283 .\" NS   doc-arg-limit
284 .\" NS   doc-argXXX
285 .\" NS   doc-typeXXX
287 .de doc-append-arg
288 .  nr doc-arg-limit +1
289 .  ds doc-arg\n[doc-arg-limit] "\$1
290 .  nr doc-type\n[doc-arg-limit] \$2
291 .  doc-set-spacing-\$2
295 .\" NS doc-print-and-reset macro
296 .\" NS   finish input line and clean up argument vectors
298 .de doc-print-and-reset
299 .  if \n[doc-space-mode] \
300 .    nop \)
301 .  doc-reset-args
305 .\" NS doc-reset-args macro
306 .\" NS   reset argument counters
307 .\" NS
308 .\" NS modifies:
309 .\" NS   doc-arg-limit
310 .\" NS   doc-arg-ptr
311 .\" NS   doc-have-slot
313 .de doc-reset-args
314 .  nr doc-arg-limit 0
315 .  nr doc-arg-ptr 0
316 .  nr doc-have-slot 0
318 .  hy \n[doc-hyphen-flags]
324 .\" NS doc-curr-font global register
325 .\" NS   saved current font
327 .nr doc-curr-font \n[.f]
330 .\" NS doc-curr-size global register
331 .\" NS   saved current font size
333 .nr doc-curr-size \n[.ps]
338 .\" NS Fl user macro
339 .\" NS   handle flags (appends `-' and prints flags): `.Fl [arg ...]'
340 .\" NS
341 .\" NS modifies:
342 .\" NS   doc-arg-ptr
343 .\" NS   doc-curr-font
344 .\" NS   doc-curr-size
345 .\" NS   doc-macro-name
346 .\" NS
347 .\" NS local variables:
348 .\" NS   doc-reg-Fl (for communication with doc-flag-recursion)
349 .\" NS
350 .\" NS width register `Fl' set in doc-common
352 .de Fl
353 .  nr doc-curr-font \n[.f]
354 .  nr doc-curr-size \n[.ps]
355 .  nop \*[doc-Fl-font]\c
357 .  if !\n[doc-arg-limit] \{\
358 .    ds doc-macro-name Fl
359 .    doc-parse-args \$@
361 .    if !\n[.$] \{\
362 .      \" no arguments
363 .      nop \|\-\|\f[]\s[0]
364 .  \}\}
366 .  if !\n[doc-arg-limit] \
367 .    return
369 .  nr doc-arg-ptr +1
370 .  ie (\n[doc-arg-limit] < \n[doc-arg-ptr]) \{\
371 .    \" last argument
372 .    nop \|\-\f[]\s[0]\c
373 .    doc-print-and-reset
374 .  \}
375 .  el \{\
376 .    ie (\n[doc-type\n[doc-arg-ptr]] == 1) \{\
377 .      nop \|\-\f[]\s[0]\c
378 .      \*[doc-arg\n[doc-arg-ptr]]
379 .    \}
380 .    el \{\
381 .      if (\n[doc-type\n[doc-arg-ptr]] == 3) \
382 .        nop \|\-\|\c
384 .      nr doc-reg-Fl 1
385 .      doc-flag-recursion
386 .  \}\}
390 .\" NS doc-flag-recursion macro
391 .\" NS   `Fl' flag recursion routine (special handling)
392 .\" NS
393 .\" NS modifies:
394 .\" NS   doc-arg-ptr
395 .\" NS
396 .\" NS local variables:
397 .\" NS   doc-reg-dfr
398 .\" NS   doc-reg-dfr1
399 .\" NS   doc-str-dfr
401 .de doc-flag-recursion
402 .  nr doc-reg-dfr1 \n[doc-type\n[doc-arg-ptr]]
403 .  ds doc-str-dfr "\*[doc-arg\n[doc-arg-ptr]]
405 .  ie (\n[doc-reg-dfr1] == 1) \{\
406 .    nop \f[]\s[0]\c
407 .    \*[doc-str-dfr]
408 .  \}
409 .  el \{\
410 .    nr doc-reg-dfr \n[doc-arg-ptr]
412 .    ie (\n[doc-reg-dfr1] == 2) \{\
413 .      \" handle vertical bar -- doc-reg-Fl is set for the first call of
414 .      \" doc-flag-recursion only; we need this to make `.Fl | ...' work
415 .      \" correctly
416 .      ie "\*[doc-str-dfr]"\*[Ba]" \{\
417 .        if \n[doc-reg-Fl] \
418 .          nop \|\-\*[doc-space]\c
419 .        nop \)\*[Ba]\c
420 .      \}
421 .      el \{\
422 .        ie "\*[doc-str-dfr]"\f[R]|\f[]" \{\
423 .          if \n[doc-reg-Fl] \
424 .            nop \|\-\*[doc-space]\c
425 .          nop \f[R]|\f[]\c
426 .        \}
427 .        el \{\
428 .          \" two consecutive hyphen characters?
429 .          ie "\*[doc-str-dfr]"-" \
430 .            nop \|\-\^\-\|\c
431 .          el \
432 .            nop \|\%\-\*[doc-str-dfr]\&\c
433 .    \}\}\}
434 .    el \{\
435 .      nop \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]\c
436 .      nop \)\*[doc-str-dfr]\f[]\s[0]\c
437 .    \}
439 .    ie (\n[doc-arg-limit] == \n[doc-arg-ptr]) \{\
440 .      \" last argument
441 .      if (\n[doc-reg-dfr1] == 4) \
442 .        nop \|\-\c
443 .      nop \f[]\s[0]\c
444 .      doc-print-and-reset
445 .    \}
446 .    el \{\
447 .      nr doc-arg-ptr +1
448 .      ie (\n[doc-type\n[doc-arg-ptr]] == 3) \{\
449 .        ie (\n[doc-type\n[doc-reg-dfr]] == 4) \
450 .          nop \|\-\c
451 .        el \
452 .          nop \)\*[doc-space\n[doc-reg-dfr]]\c
453 .      \}
454 .      el \
455 .        nop \)\*[doc-space\n[doc-reg-dfr]]\c
457 .      shift
458 .      nr doc-reg-Fl 0
459 .      doc-flag-recursion \$@
460 .  \}\}
464 .\" NS doc-print-recursive macro
465 .\" NS   general name recursion routine (print remaining arguments)
466 .\" NS
467 .\" NS modifies:
468 .\" NS   doc-arg-ptr
469 .\" NS
470 .\" NS local variables:
471 .\" NS   doc-reg-dpr
472 .\" NS   doc-reg-dpr1
473 .\" NS   doc-str-dpr
475 .de doc-print-recursive
476 .  nr doc-reg-dpr1 \n[doc-type\n[doc-arg-ptr]]
477 .  ds doc-str-dpr "\*[doc-arg\n[doc-arg-ptr]]
479 .  ie (\n[doc-reg-dpr1] == 1) \{\
480 .    nop \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]\c
481 .    \*[doc-str-dpr]
482 .  \}
483 .  el \{\
484 .    nr doc-reg-dpr \n[doc-arg-ptr]
486 .    ie (\n[doc-reg-dpr1] == 2) \
487 .      \" the `\%' prevents hyphenation on a dash (`-')
488 .      nop \%\*[doc-str-dpr]\&\c
489 .    el \{\
490 .      \" punctuation character
491 .      nop \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]\c
492 .      nop \)\*[doc-str-dpr]\f[]\s[0]\c
493 .    \}
495 .    nr doc-arg-ptr +1
496 .    ie (\n[doc-arg-limit] < \n[doc-arg-ptr]) \{\
497 .      \" last argument
498 .      nop \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]\c
499 .      doc-print-and-reset
500 .    \}
501 .    el \{\
502 .      nop \)\*[doc-space\n[doc-reg-dpr]]\c
503 .      doc-print-recursive
504 .  \}\}
508 .\" NS doc-print-prefixes macro
509 .\" NS   print leading prefixes
510 .\" NS
511 .\" NS modifies:
512 .\" NS   doc-arg-ptr
514 .de doc-print-prefixes
515 .  while (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
516 .    if !(\n[doc-type\n[doc-arg-ptr]] == 4) \
517 .      break
518 .    nop \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]\c
519 .    nop \)\*[doc-arg\n[doc-arg-ptr]]\f[]\s[0]\c
520 .    nr doc-arg-ptr +1
521 .  \}
525 .\" NS doc-generic-macro macro
526 .\" NS   this is the skeleton for most simple macros
527 .\" NS
528 .\" NS modifies:
529 .\" NS   doc-arg-ptr
530 .\" NS   doc-curr-font
531 .\" NS   doc-curr-size
532 .\" NS   doc-macro-name
534 .de doc-generic-macro
535 .  if !\n[doc-arg-limit] \{\
536 .    ie \n[.$] \{\
537 .      ds doc-macro-name \$0
538 .      doc-parse-args \$@
539 .    \}
540 .    el \
541 .      tm Usage: .\$0 \*[doc-\$0-usage] ... (#\n[.c])
542 .  \}
544 .  if !\n[doc-arg-limit] \
545 .    return
547 .  nr doc-arg-ptr +1
548 .  ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
549 .    if (\n[doc-type\n[doc-arg-ptr]] == 1) \{\
550 .      tmc mdoc warning: Using a macro as first argument
551 .      tm1 " cancels effect of .\$0 (#\n[.c])
553 .      \" the right action here would be to reset the argument counters
554 .      \" and bail out -- unfortunately, a small number of manual pages
555 .      \" (less than 2% for FreeBSD which has been used for testing)
556 .      \" relied on the old behaviour (silently ignore this error),
557 .      \" so it is commented out
559 .\"    doc-reset-args
560 .    \}
561 .\"  el \{\
562 .      nr doc-curr-font \n[.f]
563 .      nr doc-curr-size \n[.ps]
564 .      nop \*[doc-\$0-font]\c
565 .      doc-print-recursive
566 .\"  \}
567 .  \}
568 .  el \{\
569 .    tm Usage: .\$0 \*[doc-\$0-usage] ... (#\n[.c])
570 .    doc-reset-args
571 .  \}
575 .\" NS Ar user macro
576 .\" NS   command line `argument' macro: `.Ar [args ...]'
577 .\" NS
578 .\" NS modifies:
579 .\" NS   doc-arg-ptr
580 .\" NS   doc-curr-font
581 .\" NS   doc-curr-size
582 .\" NS   doc-macro-name
583 .\" NS
584 .\" NS local variable:
585 .\" NS   doc-str-Ar-default
586 .\" NS
587 .\" NS width register `Ar' set in doc-common
589 .ds doc-str-Ar-default "file\ .\|.\|.
591 .de Ar
592 .  nr doc-curr-font \n[.f]
593 .  nr doc-curr-size \n[.ps]
594 .  nop \*[doc-Ar-font]\c
596 .  if !\n[doc-arg-limit] \{\
597 .    ds doc-macro-name Ar
598 .    doc-parse-args \$@
600 .    if !\n[.$] \{\
601 .      \" no argument
602 .      nop \)\*[doc-str-Ar-default]\&\f[]\s[0]
603 .  \}\}
605 .  if !\n[doc-arg-limit] \
606 .    return
608 .  nr doc-arg-ptr +1
609 .  doc-print-prefixes
610 .  ie (\n[doc-arg-limit] < \n[doc-arg-ptr]) \{\
611 .    nop \)\*[doc-str-Ar-default]\&\f[]\s[0]\c
612 .    doc-print-and-reset
613 .  \}
614 .  el \{\
615 .    if !(\n[doc-type\n[doc-arg-ptr]] == 2) \{\
616 .      \" replace previous argument (Ar) with default value
617 .      nr doc-arg-ptr -1
618 .      ds doc-arg\n[doc-arg-ptr] "\*[doc-str-Ar-default]
619 .      nr doc-type\n[doc-arg-ptr] 2
620 .      ds doc-space\n[doc-arg-ptr] "\*[doc-space]
622 .      \" recompute space vector for remaining arguments
623 .      nr doc-num-args (\n[doc-arg-limit] - \n[doc-arg-ptr])
624 .      nr doc-arg-limit \n[doc-arg-ptr]
625 .      doc-parse-space-vector
626 .    \}
627 .    doc-print-recursive
628 .  \}
632 .\" NS Ad user macro
633 .\" NS   Addresses
634 .\" NS
635 .\" NS width register `Ad' set in doc-common
637 .als Ad doc-generic-macro
638 .ds doc-Ad-usage address
641 .\" NS doc-indent-synopsis global register
642 .\" NS   indentation in synopsis
644 .nr doc-indent-synopsis 0
647 .\" NS doc-indent-synopsis-active global register (bool)
648 .\" NS   indentation in synopsis active
650 .nr doc-indent-synopsis-active 0
653 .\" NS Cd user macro
654 .\" NS   config declaration (for section 4 SYNOPSIS)
655 .\" NS
656 .\" NS   this function causes a break; it uses the `Nm' font
657 .\" NS
658 .\" NS modifies:
659 .\" NS   doc-arg-ptr
660 .\" NS   doc-curr-font
661 .\" NS   doc-curr-size
662 .\" NS   doc-indent-synopsis
663 .\" NS   doc-macro-name
664 .\" NS
665 .\" NS width register `Cd' set in doc-common
667 .de Cd
668 .  if !\n[doc-arg-limit] \{\
669 .    ie \n[.$] \{\
670 .      ds doc-macro-name Cd
671 .      doc-parse-args \$@
672 .    \}
673 .    el \
674 .      tm Usage: .Cd configuration_file_declaration ... (#\n[.c])
675 .  \}
677 .  if !\n[doc-arg-limit] \
678 .    return
680 .  nr doc-arg-ptr +1
681 .  ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
682 .    nr doc-curr-font \n[.f]
683 .    nr doc-curr-size \n[.ps]
685 .    ie \n[doc-in-synopsis-section] \{\
686 .      if "\*[doc-macro-name]"Cd" \{\
687 .        br
688 .        if !\n[doc-indent-synopsis] \
689 .          nr doc-indent-synopsis \n[doc-display-indent]u
690 .        if !\n[doc-indent-synopsis-active] \
691 .          in +\n[doc-indent-synopsis]u
692 .        ti -\n[doc-indent-synopsis]u
693 .        nop \*[doc-Nm-font]\c
694 .        doc-print-recursive
695 .        if !\n[doc-indent-synopsis-active] \
696 .          in -\n[doc-indent-synopsis]u
697 .    \}\}
698 .    el \{\
699 .      nop \*[doc-Nm-font]\c
700 .      doc-print-recursive
701 .  \}\}
702 .  el \{\
703 .    tm Usage: .Cd configuration_file_declaration ... (#\n[.c])
704 .    doc-reset-args
705 .  \}
709 .\" NS Cm user macro
710 .\" NS   interactive command modifier (flag)
711 .\" NS
712 .\" NS width register `Cm' set in doc-common
714 .als Cm doc-generic-macro
715 .ds doc-Cm-usage interactive_command_modifier
718 .\" NS Dv user macro
719 .\" NS   defined variable
720 .\" NS
721 .\" NS   this function uses the `Er' font
722 .\" NS
723 .\" NS width register `Dv' set in doc-common
725 .als Dv doc-generic-macro
726 .ds doc-Dv-usage defined_variable
727 .als doc-Dv-font doc-Er-font
730 .\" NS Em user macro
731 .\" NS   emphasis
732 .\" NS
733 .\" NS width register `Em' set in doc-common
735 .als Em doc-generic-macro
736 .ds doc-Em-usage text
739 .\" NS Er user macro
740 .\" NS   errno type
741 .\" NS
742 .\" NS width register `Er' set in doc-common
744 .als Er doc-generic-macro
745 .ds doc-Er-usage text
748 .\" NS Ev user macro
749 .\" NS   environment variable
750 .\" NS
751 .\" NS width register `Ev' set in doc-common
753 .als Ev doc-generic-macro
754 .ds doc-Ev-usage text
757 .\" NS doc-have-decl global register (bool)
758 .\" NS   subroutine test (in synopsis only)
760 .nr doc-have-decl 0
763 .\" NS doc-have-var global register (bool)
764 .\" NS   whether last type is a variable type
766 .nr doc-have-var 0
769 .\" NS doc-do-func-decl macro
770 .\" NS   do something special while in SYNOPSIS
771 .\" NS
772 .\" NS modifies:
773 .\" NS   doc-curr-font
774 .\" NS   doc-curr-size
775 .\" NS   doc-have-decl
776 .\" NS   doc-have-var
778 .de doc-do-func-decl
779 .  if \n[doc-in-synopsis-section] \{\
780 .    \" if a variable type was the last thing given, want vertical space
781 .    if \n[doc-have-var] \{\
782 .      doc-paragraph
783 .      nr doc-have-var 0
784 .    \}
785 .    \" if a subroutine was the last thing given, want vertical space
786 .    if \n[doc-have-func] \{\
787 .      ie \n[doc-have-decl] \
788 .        br
789 .      el \
790 .        doc-paragraph
791 .    \}
792 .    nr doc-have-decl 1
793 .  \}
795 .  nr doc-curr-font \n[.f]
796 .  nr doc-curr-size \n[.ps]
800 .\" NS Fd user macro
801 .\" NS   function declaration -- not callable
802 .\" NS
803 .\" NS   this function causes a break
804 .\" NS
805 .\" NS width register `Fd' set in doc-common
807 .de Fd
808 .  ie ((\n[.$] >= 1) & (\n[doc-arg-limit] == 0)) \{\
809 .    doc-do-func-decl
810 .    nop \*[doc-Fd-font]\$*
811 .    br
812 .    ft \n[doc-curr-font]
813 .    ps \n[doc-curr-size]u
814 .  \}
815 .  el \{\
816 .    tm Usage: .Fd function_declaration -- Fd is not callable (#\n[.c])
817 .    doc-reset-args
818 .  \}
822 .\" NS In user macro
823 .\" NS   #include statement - not callable
824 .\" NS
825 .\" NS   this function causes a break; it uses the `Fd' font
826 .\" NS
827 .\" NS width register `In' set in doc-common
829 .de In
830 .  ie ((\n[.$] == 1) & (\n[doc-arg-limit] == 0)) \{\
831 .    doc-do-func-decl
832 .    nop \*[doc-Fd-font]#include <\$1>
833 .    br
834 .    ft \n[doc-curr-font]
835 .    ps \n[doc-curr-size]u
836 .  \}
837 .  el \{\
838 .    tm Usage: .In include_file -- In is not callable (#\n[.c])
839 .    doc-reset-args
840 .  \}
844 .\" NS Fr user macro
845 .\" NS   function return value
846 .\" NS
847 .\" NS   this function uses the `Ar' font
848 .\" NS
849 .\" NS width register `Fr' set in doc-common
851 .als Fr doc-generic-macro
852 .ds doc-Fr-usage function_return_value
853 .als doc-Fr-font doc-Ar-font
856 .\" NS Ic user macro
857 .\" NS   interactive command
858 .\" NS
859 .\" NS width register `Ic' set in doc-common
861 .als Ic doc-generic-macro
862 .ds doc-Ic-usage interactive_command
865 .\" NS Li user macro
866 .\" NS   literals
867 .\" NS
868 .\" NS width register `Li' set in doc-common
870 .als Li doc-generic-macro
871 .ds doc-Li-usage argument
874 .\" NS Ms user macro
875 .\" NS   math symbol
876 .\" NS
877 .\" NS   this function uses the `Sy' font
878 .\" NS
879 .\" NS width register `Ms' set in doc-common
881 .als Ms doc-generic-macro
882 .ds doc-Ms-usage math_symbol
883 .als doc-Ms-font doc-Sy-font
886 .\" NS doc-command-name global string
887 .\" NS   save first invocation of .Nm
889 .ds doc-command-name
892 .\" NS Nm user macro
893 .\" NS   name of command or page topic
894 .\" NS
895 .\" NS modifies:
896 .\" NS   doc-arg-ptr
897 .\" NS   doc-command-name
898 .\" NS   doc-curr-font
899 .\" NS   doc-curr-size
900 .\" NS   doc-indent-synopsis
901 .\" NS   doc-indent-synopsis-active
902 .\" NS   doc-macro-name
903 .\" NS
904 .\" NS width register `Nm' set in doc-common
906 .de Nm
907 .  if !\n[doc-arg-limit] \{\
908 .    ds doc-macro-name Nm
909 .    ie \n[.$] \
910 .      doc-parse-args \$@
911 .    el \{\
912 .      ie "\*[doc-command-name]"" \
913 .        tm Usage: .Nm name ... (#\n[.c])
914 .      el \
915 .        doc-parse-args \*[doc-command-name]
916 .  \}\}
918 .  if !\n[doc-arg-limit] \
919 .    return
921 .  nr doc-arg-ptr +1
922 .  doc-print-prefixes
923 .  ie (\n[doc-arg-limit] < \n[doc-arg-ptr]) \{\
924 .    \" last argument
925 .    ie "\*[doc-command-name]"" \{\
926 .      tm Usage: .Nm name ... (#\n[.c])
927 .      doc-reset-args
928 .    \}
929 .    el \{\
930 .      nop \*[doc-Nm-font]\*[doc-command-name]\f[]\s[0]\c
931 .      doc-print-and-reset
932 .  \}\}
933 .  el \{\
934 .    nr doc-curr-font \n[.f]
935 .    nr doc-curr-size \n[.ps]
937 .    ie !(\n[doc-type\n[doc-arg-ptr]] == 2) \{\
938 .      ie "\*[doc-command-name]"" \
939 .        tm Usage: .Nm name ... (#\n[.c])
940 .      el \{\
941 .        \" replace previous argument (Nm) with default value
942 .        nr doc-arg-ptr -1
943 .        ds doc-arg\n[doc-arg-ptr] "\*[doc-Nm-font]\*[doc-command-name]\f[]\s[0]
944 .        nr doc-type\n[doc-arg-ptr] 2
945 .        ds doc-space\n[doc-arg-ptr] "\*[doc-space]
947 .        \" recompute space vector for remaining arguments
948 .        nr doc-num-args (\n[doc-arg-limit] - \n[doc-arg-ptr])
949 .        nr doc-arg-limit \n[doc-arg-ptr]
950 .        doc-parse-space-vector
951 .    \}\}
952 .    el \{\
953 .      \" handle `.Nm ...' in SYNOPSIS
954 .      if \n[doc-in-synopsis-section] \{\
955 .        if "\*[doc-macro-name]"Nm" \{\
956 .          br
957 .          if !\n[doc-indent-synopsis] \{\
958 .            doc-get-width "\*[doc-arg\n[doc-arg-ptr]]"
959 .            nr doc-indent-synopsis ((\n[doc-width]u + 1u) * \n[doc-fixed-width]u)
960 .          \}
961 .          if !\n[doc-indent-synopsis-active] \{\
962 .            in +\n[doc-indent-synopsis]u
963 .            nr doc-indent-synopsis-active 1
964 .          \}
965 .          ti -\n[doc-indent-synopsis]u
966 .      \}\}
967 .      if "\*[doc-command-name]"" \
968 .        ds doc-command-name "\*[doc-arg\n[doc-arg-ptr]]
970 .      nop \*[doc-Nm-font]\c
971 .    \}
972 .    doc-print-recursive
973 .  \}
977 .\" NS Pa user macro
978 .\" NS   pathname: `.Pa [arg ...]'
979 .\" NS
980 .\" NS modifies:
981 .\" NS   doc-arg-ptr
982 .\" NS   doc-curr-font
983 .\" NS   doc-curr-size
984 .\" NS   doc-macro-name
985 .\" NS
986 .\" NS width register `Pa' set in doc-common
988 .de Pa
989 .  if !\n[doc-arg-limit] \{\
990 .    ds doc-macro-name Pa
991 .    doc-parse-args \$@
993 .    if !\n[.$] \{\
994 .      \" default value
995 .      nop \*[doc-Pa-font]~\f[]\s[0]
996 .  \}\}
998 .  if !\n[doc-arg-limit] \
999 .    return
1001 .  nr doc-arg-ptr +1
1002 .  doc-print-prefixes
1003 .  ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
1004 .    nr doc-curr-font \n[.f]
1005 .    nr doc-curr-size \n[.ps]
1006 .    nop \*[doc-Pa-font]\c
1007 .    if !(\n[doc-type\n[doc-arg-ptr]] == 2) \{\
1008 .      \" replace previous argument (Pa) with default value
1009 .      nr doc-arg-ptr -1
1010 .      ds doc-arg\n[doc-arg-ptr] ~
1011 .      nr doc-type\n[doc-arg-ptr] 2
1012 .      ds doc-space\n[doc-arg-ptr] "\*[doc-space]
1014 .      \" recompute space vector for remaining arguments
1015 .      nr doc-num-args (\n[doc-arg-limit] - \n[doc-arg-ptr])
1016 .      nr doc-arg-limit \n[doc-arg-ptr]
1017 .      doc-parse-space-vector
1018 .    \}
1019 .    doc-print-recursive
1020 .  \}
1021 .  el \{\
1022 .    nop \*[doc-Pa-font]~\f[]\s[0]\c
1023 .    doc-print-and-reset
1024 .  \}
1028 .\" NS Sy user macro
1029 .\" NS   symbolics
1030 .\" NS
1031 .\" NS width register `Sy' set in doc-common
1033 .als Sy doc-generic-macro
1034 .ds doc-Sy-usage symbolic_text
1037 .\" NS Me user macro
1038 .\" NS   menu entries
1039 .\" NS
1040 .\" NS width register `Me' set in doc-common
1042 .als Me doc-generic-macro
1043 .ds doc-Me-usage menu_entry
1046 .\" NS Tn user macro
1047 .\" NS   trade name
1048 .\" NS
1049 .\" NS modifies:
1050 .\" NS   doc-arg-ptr
1051 .\" NS   doc-curr-font
1052 .\" NS   doc-curr-size
1053 .\" NS   doc-macro-name
1054 .\" NS
1055 .\" NS width register `Tn' set in doc-common
1057 .de Tn
1058 .  if !\n[doc-arg-limit] \{\
1059 .    ie \n[.$] \{\
1060 .      ds doc-macro-name Tn
1061 .      doc-parse-args \$@
1062 .    \}
1063 .    el \
1064 .      tm Usage: .Tn trade_name ... (#\n[.c])
1065 .  \}
1067 .  if !\n[doc-arg-limit] \
1068 .    return
1070 .  nr doc-arg-ptr +1
1071 .  ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
1072 .    nr doc-curr-font \n[.f]
1073 .    nr doc-curr-size \n[.ps]
1074 .    nop \)\*[doc-Tn-font-size]\c
1075 .    ie !\n[doc-is-reference] \{\
1076 .      nop \)\*[doc-Tn-font-shape]\c
1077 .      doc-print-recursive
1078 .    \}
1079 .    el \
1080 .      doc-do-references
1081 .  \}
1082 .  el \{\
1083 .    tm Usage: .Tn trade_name ... (#\n[.c])
1084 .    doc-reset-args
1085 .  \}
1089 .\" NS Va user macro
1090 .\" NS   variable name
1091 .\" NS
1092 .\" NS width register `Va' set in doc-common
1094 .als Va doc-generic-macro
1095 .ds doc-Va-usage variable_name
1098 .\" NS No user macro
1099 .\" NS   normal text macro (default text style if mess up)
1100 .\" NS
1101 .\" NS width register `No' set in doc-common
1103 .als No doc-generic-macro
1104 .ds doc-No-usage normal_text
1107 .\" NS doc-quote-left global string
1108 .\" NS   left quotation character for `doc-enclose-string' and
1109 .\" NS   `doc-enclose-open'
1111 .ds doc-quote-left
1114 .\" NS doc-quote-right global string
1115 .\" NS   right quotation character for `doc-enclose-string' and
1116 .\" NS   `doc-enclose-close'
1118 .ds doc-quote-right
1121 .\" NS Op user macro
1122 .\" NS   option expression (i.e., enclose string in square brackets)
1123 .\" NS
1124 .\" NS modifies:
1125 .\" NS   doc-macro-name
1126 .\" NS   doc-quote-left
1127 .\" NS   doc-quote-right
1128 .\" NS
1129 .\" NS width register `Op' set in doc-common
1131 .de Op
1132 .  if !\n[doc-arg-limit] \
1133 .    ds doc-macro-name Op
1135 .  ds doc-quote-left "\*[doc-left-bracket]
1136 .  ds doc-quote-right "\*[doc-right-bracket]
1138 .  doc-enclose-string \$@
1142 .\" NS Aq user macro
1143 .\" NS   enclose string in angle brackets
1144 .\" NS
1145 .\" NS modifies:
1146 .\" NS   doc-macro-name
1147 .\" NS   doc-quote-left
1148 .\" NS   doc-quote-right
1149 .\" NS
1150 .\" NS width register `Aq' set in doc-common
1152 .de Aq
1153 .  if !\n[doc-arg-limit] \
1154 .    ds doc-macro-name Aq
1156 .  ds doc-quote-left \[la]
1157 .  ds doc-quote-right \[ra]
1159 .  doc-enclose-string \$@
1163 .\" NS Bq user macro
1164 .\" NS   enclose string in square brackets
1165 .\" NS
1166 .\" NS modifies:
1167 .\" NS   doc-macro-name
1168 .\" NS   doc-quote-left
1169 .\" NS   doc-quote-right
1170 .\" NS
1171 .\" NS width register `Bq' set in doc-common
1173 .de Bq
1174 .  if !\n[doc-arg-limit] \
1175 .    ds doc-macro-name Bq
1177 .  ds doc-quote-left "\*[doc-left-bracket]
1178 .  ds doc-quote-right "\*[doc-right-bracket]
1180 .  doc-enclose-string \$@
1184 .\" NS Brq user macro
1185 .\" NS   enclose string in braces
1186 .\" NS
1187 .\" NS modifies:
1188 .\" NS   doc-macro-name
1189 .\" NS   doc-quote-left
1190 .\" NS   doc-quote-right
1191 .\" NS
1192 .\" NS width register `Brq' set in doc-common
1194 .de Brq
1195 .  if !\n[doc-arg-limit] \
1196 .    ds doc-macro-name Brq
1198 .  ds doc-quote-left {
1199 .  ds doc-quote-right }
1201 .  doc-enclose-string \$@
1205 .\" NS Dq user macro
1206 .\" NS   enclose string in double quotes
1207 .\" NS
1208 .\" NS modifies:
1209 .\" NS   doc-macro-name
1210 .\" NS   doc-quote-left
1211 .\" NS   doc-quote-right
1212 .\" NS
1213 .\" NS width register `Dq' set in doc-common
1215 .de Dq
1216 .  if !\n[doc-arg-limit] \
1217 .    ds doc-macro-name Dq
1219 .  ds doc-quote-left "\*[Lq]
1220 .  ds doc-quote-right "\*[Rq]
1222 .  doc-enclose-string \$@
1226 .\" NS Eq user macro
1227 .\" NS   enclose string in user-defined quotes (args 1 and 2)
1228 .\" NS
1229 .\" NS modifies:
1230 .\" NS   doc-macro-name
1231 .\" NS   doc-quote-left
1232 .\" NS   doc-quote-right
1233 .\" NS
1234 .\" NS width register `Eq' set in doc-common
1236 .de Eq
1237 .  if !\n[doc-arg-limit] \
1238 .    ds doc-macro-name Eq
1240 .  ds doc-quote-left "\$1
1241 .  ds doc-quote-right "\$2
1243 .  shift 2
1244 .  doc-enclose-string \$@
1248 .\" NS Pq user macro
1249 .\" NS   enclose string in parentheses
1250 .\" NS
1251 .\" NS modifies:
1252 .\" NS   doc-macro-name
1253 .\" NS   doc-quote-left
1254 .\" NS   doc-quote-right
1255 .\" NS
1256 .\" NS width register `Pq' set in doc-common
1258 .de Pq
1259 .  if !\n[doc-arg-limit] \
1260 .    ds doc-macro-name Pq
1262 .  ds doc-quote-left "\*[doc-left-parenthesis]
1263 .  ds doc-quote-right "\*[doc-right-parenthesis]
1265 .  doc-enclose-string \$@
1269 .\" NS Ql user macro
1270 .\" NS   quoted literal
1272 .\"   is in file doc-[dit|n]roff
1275 .\" NS Qq user macro
1276 .\" NS   enclose string in straight double quotes
1277 .\" NS
1278 .\" NS modifies:
1279 .\" NS   doc-macro-name
1280 .\" NS   doc-quote-left
1281 .\" NS   doc-quote-right
1282 .\" NS
1283 .\" NS width register `Qq' set in doc-common
1285 .de Qq
1286 .  if !\n[doc-arg-limit] \
1287 .    ds doc-macro-name Qq
1289 .  ds doc-quote-left "\*[q]
1290 .  ds doc-quote-right "\*[q]
1292 .  doc-enclose-string \$@
1296 .\" NS Sq user macro
1297 .\" NS   enclose string in single quotes
1298 .\" NS
1299 .\" NS modifies:
1300 .\" NS   doc-macro-name
1301 .\" NS   doc-quote-left
1302 .\" NS   doc-quote-right
1303 .\" NS
1304 .\" NS width register `Sq' set in doc-common
1306 .de Sq
1307 .  if !\n[doc-arg-limit] \
1308 .    ds doc-macro-name Sq
1310 .  ds doc-quote-left "\*[doc-left-singlequote]
1311 .  ds doc-quote-right "\*[doc-right-singlequote]
1313 .  doc-enclose-string \$@
1317 .\" NS Es user macro
1318 .\" NS   set up arguments (i.e., the left and right quotation character as
1319 .\" NS   first and second argument) for .En call
1320 .\" NS
1321 .\" NS modifies:
1322 .\" NS   doc-arg-ptr
1323 .\" NS   doc-macro-name
1324 .\" NS   doc-quote-left
1325 .\" NS   doc-quote-right
1327 .de Es
1328 .  if !\n[doc-arg-limit] \{\
1329 .    ie (\n[.$] > 2) \{\
1330 .      ds doc-macro-name Es
1331 .      doc-parse-args \$@
1332 .    \}
1333 .    el \{\
1334 .      ds doc-quote-left "\$1
1335 .      ds doc-quote-right "\$2
1336 .  \}\}
1338 .  if !\n[doc-arg-limit] \
1339 .    return
1341 .  nr doc-arg-ptr +1
1342 .  ds doc-quote-left "\*[doc-arg\n[doc-arg-ptr]]
1343 .  nr doc-arg-ptr +1
1344 .  ds doc-quote-right "\*[doc-arg\n[doc-arg-ptr]]
1345 .  nr doc-arg-ptr +1
1346 .  ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \
1347 .    doc-do-\n[doc-type\n[doc-arg-ptr]]
1348 .  el \
1349 .    doc-print-and-reset
1353 .\" NS doc-have-slot global register (bool)
1354 .\" NS   set if `doc-enclose-string' has created a slot for closing
1355 .\" NS   delimiter
1357 .nr doc-have-slot 0
1360 .\" NS doc-enclose-string macro
1361 .\" NS   enclose string with given args (e.g. [ and ])
1362 .\" NS
1363 .\" NS modifies:
1364 .\" NS   doc-arg-ptr
1365 .\" NS   doc-argXXX
1366 .\" NS   doc-have-slot
1367 .\" NS
1368 .\" NS local variables:
1369 .\" NS   doc-reg-des
1370 .\" NS   doc-reg-des1
1371 .\" NS   doc-reg-des2
1372 .\" NS
1373 .\" NS requires:
1374 .\" NS   doc-quote-left
1375 .\" NS   doc-quote-right
1377 .de doc-enclose-string
1378 .  if \n[doc-in-synopsis-section] \
1379 .    doc-set-hard-space
1381 .  if !\n[doc-arg-limit] \{\
1382 .    ie \n[.$] \
1383 .      doc-parse-args \$@
1384 .    el \{\
1385 .      nop \)\*[doc-quote-left]\*[doc-quote-right]
1386 .  \}\}
1388 .  if !\n[doc-arg-limit] \
1389 .    return
1391 .  nr doc-curr-font \n[.f]
1392 .  nr doc-curr-size \n[.ps]
1394 .  nr doc-arg-ptr +1
1395 .  doc-print-prefixes
1396 .  \" the final `\)' prevents hyphenation in case the next character is `\%'
1397 .  nop \)\*[doc-quote-left]\)\c
1398 .  ie (\n[doc-arg-limit] < \n[doc-arg-ptr]) \{\
1399 .    \" last argument
1400 .    nop \)\*[doc-quote-right]\)\c
1401 .    doc-print-and-reset
1402 .  \}
1403 .  el \{\
1404 .    \" test whether last arguments are of type closing punctuation
1405 .    \" resp. suffix
1406 .    ie (\n[doc-type\n[doc-arg-limit]] == 3) \{\
1407 .      nr doc-reg-des (\n[doc-arg-limit] - 1)
1408 .      while (\n[doc-type\n[doc-reg-des]] == 3) \
1409 .        nr doc-reg-des -1
1411 .      \" prepend closing delimiter
1412 .      nr doc-reg-des +1
1413 .      ds doc-arg\n[doc-reg-des] "\*[doc-quote-right]\)\*[doc-arg\n[doc-reg-des]]
1414 .    \}
1415 .    el \{\
1416 .      \" test whether last arguments are macros which continue the line
1417 .      \" logically
1418 .      nr doc-reg-des \n[doc-arg-limit]
1419 .      while (\n[doc-reg-des] >= \n[doc-arg-ptr]) \{\
1420 .        if !\A\a\*[doc-arg\n[doc-reg-des]]\a \
1421 .          break
1422 .        if !d doc-after-\*[doc-arg\n[doc-reg-des]] \
1423 .          break
1424 .        nr doc-reg-des -1
1425 .      \}
1427 .      \" if there are no trailing macros to be skipped, append argument
1428 .      ie (\n[doc-reg-des] == \n[doc-arg-limit]) \
1429 .        doc-append-arg "\)\*[doc-quote-right]\)" 3
1430 .      el \{\
1431 .        \" if a previous call to `doc-enclose-string' has already created
1432 .        \" a slot, prepend argument
1433 .        ie \n[doc-have-slot] \
1434 .          ds doc-arg\n[doc-reg-des] "\*[doc-quote-right]\)\*[doc-arg\n[doc-reg-des]]
1435 .        el \{\
1436 .          \" we have to shift all arguments to the right
1437 .          nr doc-reg-des +1
1438 .          nr doc-reg-des1 \n[doc-arg-limit]
1439 .          nr doc-reg-des2 (\n[doc-arg-limit] + 1)
1440 .          while (\n[doc-reg-des1] >= \n[doc-reg-des]) \{\
1441 .            rn doc-arg\n[doc-reg-des1] doc-arg\n[doc-reg-des2]
1442 .            rnn doc-type\n[doc-reg-des1] doc-type\n[doc-reg-des2]
1443 .            rn doc-space\n[doc-reg-des1] doc-space\n[doc-reg-des2]
1444 .            nr doc-reg-des1 -1
1445 .            nr doc-reg-des2 -1
1446 .          \}
1447 .          nr doc-arg-limit +1
1449 .          \" finally, insert closing delimiter into the freed slot and
1450 .          \" recompute spacing vector
1451 .          ds doc-arg\n[doc-reg-des] "\)\*[doc-quote-right]\)
1452 .          nr doc-type\n[doc-reg-des] 3
1453 .          nr doc-num-args (\n[doc-arg-limit] - \n[doc-reg-des] + 1)
1454 .          nr doc-arg-limit (\n[doc-reg-des] - 1)
1455 .          doc-parse-space-vector
1456 .          nr doc-have-slot 1
1457 .    \}\}\}
1459 .    doc-do-\n[doc-type\n[doc-arg-ptr]]
1460 .  \}
1462 .  if \n[doc-in-synopsis-section] \
1463 .    doc-set-soft-space
1467 .\" NS En user macro
1468 .\" NS   enclose arguments with quotation characters set up with `.Es'
1470 .als En doc-enclose-string
1473 .\" NS Ao user macro
1474 .\" NS   angle open
1475 .\" NS
1476 .\" NS modifies:
1477 .\" NS   doc-macro-name
1478 .\" NS   doc-quote-left
1479 .\" NS
1480 .\" NS width register `Ao' set in doc-common
1482 .de Ao
1483 .  if !\n[doc-arg-limit] \
1484 .    ds doc-macro-name Ao
1486 .  ds doc-quote-left \[la]
1488 .  doc-enclose-open \$@
1492 .\" NS Ac user macro
1493 .\" NS   angle close
1494 .\" NS
1495 .\" NS modifies:
1496 .\" NS   doc-macro-name
1497 .\" NS   doc-quote-right
1498 .\" NS
1499 .\" NS width register `Ac' set in doc-common
1501 .de Ac
1502 .  if !\n[doc-arg-limit] \
1503 .    ds doc-macro-name Ac
1505 .  ds doc-quote-right \[ra]
1507 .  doc-enclose-close \$@
1511 .\" NS Bo user macro
1512 .\" NS   bracket open
1513 .\" NS
1514 .\" NS modifies:
1515 .\" NS   doc-macro-name
1516 .\" NS   doc-quote-left
1517 .\" NS
1518 .\" NS width register `Bo' set in doc-common
1520 .de Bo
1521 .  if !\n[doc-arg-limit] \
1522 .    ds doc-macro-name Bo
1524 .  ds doc-quote-left "\*[doc-left-bracket]
1526 .  doc-enclose-open \$@
1530 .\" NS Bc user macro
1531 .\" NS   bracket close
1532 .\" NS
1533 .\" NS modifies:
1534 .\" NS   doc-macro-name
1535 .\" NS   doc-quote-right
1536 .\" NS
1537 .\" NS width register `Bc' set in doc-common
1539 .de Bc
1540 .  if !\n[doc-arg-limit] \
1541 .    ds doc-macro-name Bc
1543 .  ds doc-quote-right "\*[doc-right-bracket]
1545 .  doc-enclose-close \$@
1549 .\" NS Bro user macro
1550 .\" NS   brace open
1551 .\" NS
1552 .\" NS modifies:
1553 .\" NS   doc-macro-name
1554 .\" NS   doc-quote-left
1555 .\" NS
1556 .\" NS width register `Bro' set in doc-common
1558 .de Bro
1559 .  if !\n[doc-arg-limit] \
1560 .    ds doc-macro-name Bo
1562 .  ds doc-quote-left {
1564 .  doc-enclose-open \$@
1568 .\" NS Brc user macro
1569 .\" NS   brace close
1570 .\" NS
1571 .\" NS modifies:
1572 .\" NS   doc-macro-name
1573 .\" NS   doc-quote-right
1574 .\" NS
1575 .\" NS width register `Brc' set in doc-common
1577 .de Brc
1578 .  if !\n[doc-arg-limit] \
1579 .    ds doc-macro-name Bc
1581 .  ds doc-quote-right }
1583 .  doc-enclose-close \$@
1587 .\" NS Do user macro
1588 .\" NS   double quote open
1589 .\" NS
1590 .\" NS modifies:
1591 .\" NS   doc-macro-name
1592 .\" NS   doc-quote-left
1593 .\" NS
1594 .\" NS width register `Do' set in doc-common
1596 .de Do
1597 .  if !\n[doc-arg-limit] \
1598 .    ds doc-macro-name Do
1600 .  ds doc-quote-left "\*[Lq]
1602 .  doc-enclose-open \$@
1606 .\" NS Dc user macro
1607 .\" NS   double quote close
1608 .\" NS
1609 .\" NS modifies:
1610 .\" NS   doc-macro-name
1611 .\" NS   doc-quote-right
1612 .\" NS
1613 .\" NS width register `Dc' set in doc-common
1615 .de Dc
1616 .  if !\n[doc-arg-limit] \
1617 .    ds doc-macro-name Dc
1619 .  ds doc-quote-right "\*[Rq]
1621 .  doc-enclose-close \$@
1625 .\" NS Eo user macro
1626 .\" NS   enclose open (using first argument as beginning of enclosure)
1627 .\" NS
1628 .\" NS modifies:
1629 .\" NS   doc-macro-name
1630 .\" NS   doc-quote-left
1631 .\" NS
1632 .\" NS width register `Eo' set in doc-common
1634 .de Eo
1635 .  if !\n[doc-arg-limit] \
1636 .    ds doc-macro-name Eo
1638 .  ds doc-quote-left "\$1
1640 .  shift
1641 .  doc-enclose-open \$@
1645 .\" NS Ec user macro
1646 .\" NS   enclose close (using first argument as end of enclosure)
1647 .\" NS
1648 .\" NS modifies:
1649 .\" NS   doc-macro-name
1650 .\" NS   doc-quote-right
1651 .\" NS
1652 .\" NS width register `Ec' set in doc-common
1654 .de Ec
1655 .  if !\n[doc-arg-limit] \
1656 .    ds doc-macro-name Ec
1658 .  ds doc-quote-right "\$1
1660 .  shift
1661 .  doc-enclose-close \$@
1665 .\" NS Oo user macro
1666 .\" NS   option open
1667 .\" NS
1668 .\" NS modifies:
1669 .\" NS   doc-macro-name
1670 .\" NS   doc-quote-left
1671 .\" NS
1672 .\" NS width register `Oo' set in doc-common
1674 .de Oo
1675 .  if !\n[doc-arg-limit] \
1676 .    ds doc-macro-name Oo
1678 .  ds doc-quote-left [
1680 .  doc-enclose-open \$@
1684 .\" NS Oc user macro
1685 .\" NS   option close
1686 .\" NS
1687 .\" NS modifies:
1688 .\" NS   doc-macro-name
1689 .\" NS   doc-quote-right
1690 .\" NS
1691 .\" NS width register `Oc' set in doc-common
1693 .de Oc
1694 .  if !\n[doc-arg-limit] \
1695 .    ds doc-macro-name Oc
1697 .  ds doc-quote-right ]
1699 .  doc-enclose-close \$@
1703 .\" NS Po user macro
1704 .\" NS   parenthesis open
1705 .\" NS
1706 .\" NS modifies:
1707 .\" NS   doc-macro-name
1708 .\" NS   doc-quote-left
1709 .\" NS
1710 .\" NS width register `Po' set in doc-common
1712 .de Po
1713 .  if !\n[doc-arg-limit] \
1714 .    ds doc-macro-name Po
1716 .  ds doc-quote-left "\*[doc-left-parenthesis]
1718 .  doc-enclose-open \$@
1722 .\" NS Pc user macro
1723 .\" NS   parenthesis close
1724 .\" NS
1725 .\" NS modifies:
1726 .\" NS   doc-macro-name
1727 .\" NS   doc-quote-right
1728 .\" NS
1729 .\" NS width register `Pc' set in doc-common
1731 .de Pc
1732 .  if !\n[doc-arg-limit] \
1733 .    ds doc-macro-name Pc
1735 .  ds doc-quote-right "\*[doc-right-parenthesis]
1737 .  doc-enclose-close \$@
1741 .\" NS Qo user macro
1742 .\" NS   straight double quote open
1743 .\" NS
1744 .\" NS modifies:
1745 .\" NS   doc-macro-name
1746 .\" NS   doc-quote-left
1747 .\" NS
1748 .\" NS width register `Qo' set in doc-common
1750 .de Qo
1751 .  if !\n[doc-arg-limit] \
1752 .    ds doc-macro-name Qo
1754 .  ds doc-quote-left "\*[q]
1756 .  doc-enclose-open \$@
1760 .\" NS Qc user macro
1761 .\" NS   straight double quote close
1762 .\" NS
1763 .\" NS modifies:
1764 .\" NS   doc-macro-name
1765 .\" NS   doc-quote-right
1766 .\" NS
1767 .\" NS width register `Qc' set in doc-common
1769 .de Qc
1770 .  if !\n[doc-arg-limit] \
1771 .    ds doc-macro-name Qc
1773 .  ds doc-quote-right "\*[q]
1775 .  doc-enclose-close \$@
1779 .\" NS So user macro
1780 .\" NS   single quote open
1781 .\" NS
1782 .\" NS modifies:
1783 .\" NS   doc-macro-name
1784 .\" NS   doc-quote-left
1785 .\" NS
1786 .\" NS width register `So' set in doc-common
1788 .de So
1789 .  if !\n[doc-arg-limit] \
1790 .    ds doc-macro-name So
1792 .  ds doc-quote-left "\*[doc-left-singlequote]
1794 .  doc-enclose-open \$@
1798 .\" NS Sc user macro
1799 .\" NS   single quote close
1800 .\" NS
1801 .\" NS modifies:
1802 .\" NS   doc-macro-name
1803 .\" NS   doc-quote-right
1804 .\" NS
1805 .\" NS width register `Sc' set in doc-common
1807 .de Sc
1808 .  if !\n[doc-arg-limit] \
1809 .    ds doc-macro-name Sc
1811 .  ds doc-quote-right "\*[doc-right-singlequote]
1813 .  doc-enclose-close \$@
1817 .\" NS Xo user macro
1818 .\" NS   extend open
1819 .\" NS
1820 .\" NS modifies:
1821 .\" NS   doc-macro-name
1822 .\" NS   doc-quote-left
1823 .\" NS
1824 .\" NS width register `Xo' set in doc-common
1826 .de Xo
1827 .  if !\n[doc-arg-limit] \
1828 .    ds doc-macro-name Xo
1830 .  ds doc-quote-left
1832 .  doc-enclose-open \$@
1836 .\" NS Xc user macro
1837 .\" NS   extend close
1838 .\" NS
1839 .\" NS modifies:
1840 .\" NS   doc-macro-name
1841 .\" NS   doc-quote-right
1842 .\" NS
1843 .\" NS width register `Xc' set in doc-common
1845 .de Xc
1846 .  if !\n[doc-arg-limit] \
1847 .    ds doc-macro-name Xc
1849 .  ds doc-quote-right
1851 .  doc-enclose-close \$@
1855 .\" NS doc-nesting-level global register
1856 .\" NS   used by `doc-enclose-open' and `doc-enclose-close'
1858 .nr doc-nesting-level 0
1861 .\" NS doc-in-list global register (bool)
1862 .\" NS   whether we are in (logical) .It
1864 .nr doc-in-list 0
1867 .\" NS doc-enclose-open macro
1868 .\" NS   enclose string open
1869 .\" NS
1870 .\" NS modifies:
1871 .\" NS   doc-arg-ptr
1872 .\" NS   doc-nesting-level
1874 .de doc-enclose-open
1875 .  if !\n[doc-arg-limit] \
1876 .    doc-parse-args \$@
1878 .  nr doc-arg-ptr +1
1879 .  doc-print-prefixes
1880 .  nr doc-arg-ptr -1
1882 .  nop \)\*[doc-quote-left]\)\c
1884 .  \" start enclosure box
1885 .  box doc-enclosure-box\n[doc-nesting-level]
1886 .  ev doc-enclosure-env\n[doc-nesting-level]
1887 .  evc 0
1888 .  in 0
1889 .  nf
1890 .  \" we insert something to make .chop always work
1891 .  nop \&\c
1893 .  \" increase nesting level *after* parsing of arguments
1894 .  nr doc-nesting-level +1
1896 .  if \n[doc-arg-limit] \{\
1897 .    nr doc-arg-ptr +1
1898 .    ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \
1899 .      doc-print-recursive
1900 .    el \
1901 .      doc-reset-args
1902 .  \}
1906 .\" NS doc-enclose-close macro
1907 .\" NS   enclose string close
1908 .\" NS
1909 .\" NS modifies:
1910 .\" NS   doc-nesting-level
1912 .de doc-enclose-close
1913 .  nr doc-nesting-level -1
1915 .  \" finish enclosure box
1916 .  br
1917 .  ev
1918 .  box
1919 .  chop doc-enclosure-box\n[doc-nesting-level]
1920 .  unformat doc-enclosure-box\n[doc-nesting-level]
1922 .  nh
1923 .  nop \*[doc-enclosure-box\n[doc-nesting-level]]\c
1924 .  nop \)\*[doc-quote-right]\)\c
1926 .  if !\n[doc-arg-limit] \{\
1927 .    doc-parse-args \$@
1929 .    if !\n[.$] \
1930 .      doc-print-and-reset
1931 .  \}
1933 .  if \n[doc-arg-limit] \{\
1934 .    ie (\n[doc-arg-limit] > \n[doc-arg-ptr]) \{\
1935 .      nop \)\*[doc-space\n[doc-arg-ptr]]\c
1936 .      nr doc-arg-ptr +1
1937 .      doc-print-recursive
1938 .    \}
1939 .    el \
1940 .      doc-print-and-reset
1941 .  \}
1943 .  \" shall we finish .It macro?
1944 .  if !"\*[doc-macro-name]"It" \
1945 .    if \n[doc-in-list] \
1946 .      if !\n[doc-nesting-level] \
1947 .        doc-\*[doc-list-type-stack\n[doc-list-depth]]
1951 .\" NS Pf user macro
1952 .\" NS   prefix: `.Pf prefix arg ...'
1953 .\" NS
1954 .\" NS modifies:
1955 .\" NS   doc-arg-ptr
1956 .\" NS   doc-macro-name
1957 .\" NS   doc-quote-left
1958 .\" NS
1959 .\" NS width register `Pf' set in doc-common
1961 .de Pf
1962 .  if !\n[doc-arg-limit] \
1963 .    ds doc-macro-name Pf
1965 .  ie \n[doc-arg-limit] \{\
1966 .    ie ((\n[doc-arg-limit] - \n[doc-arg-ptr]) > 1) \{\
1967 .      nr doc-arg-ptr +1
1968 .      nop \)\*[doc-arg\n[doc-arg-ptr]]\c
1969 .    \}
1970 .    el \
1971 .      tm mdoc warning: .Pf: trailing prefix (#\n[.c])
1972 .  \}
1973 .  el \{\
1974 .    nop \)\$1\)\c
1975 .    shift
1976 .    ie \n[.$] \
1977 .      doc-parse-args \$@
1978 .    el \{\
1979 .      tm mdoc warning: .Pf: missing arguments (#\n[.c])
1980 .      nop \)
1981 .  \}\}
1983 .  if \n[doc-arg-limit] \{\
1984 .    nr doc-arg-ptr +1
1985 .    ie (\n[doc-arg-limit] < \n[doc-arg-ptr]) \
1986 .      doc-print-and-reset
1987 .    el \
1988 .      doc-do-\n[doc-type\n[doc-arg-ptr]]
1989 .  \}
1993 .\" NS Ns user macro
1994 .\" NS   remove space (space removal done by `doc-parse-args')
1995 .\" NS
1996 .\" NS modifies:
1997 .\" NS   doc-argXXX
1998 .\" NS   doc-macro-name
1999 .\" NS
2000 .\" NS width register `Ns' set in doc-common
2002 .de Ns
2003 .  if !\n[doc-arg-limit] \{\
2004 .    ie \n[.$] \{\
2005 .      ds doc-macro-name Ns
2006 .      doc-parse-args \$@
2007 .    \}
2008 .    el \
2009 .      tm Usage: .Ns must be called with arguments (#\n[.c])
2010 .  \}
2012 .  if \n[doc-arg-limit] \{\
2013 .    nr doc-arg-ptr +1
2014 .    ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \
2015 .      doc-print-recursive
2016 .    el \
2017 .      doc-reset-args
2018 .  \}
2022 .\" NS Ap user macro
2023 .\" NS   append an apostrophe
2024 .\" NS
2025 .\" NS width register `Ap' set in doc-common
2027 .de Ap
2028 .  ie !\n[doc-arg-limit] \
2029 .    tm Usage: `Ap' cannot be first macro on a line (no `.Ap') (#\n[.c])
2030 .  el \{\
2031 .    nop \)'\)\c
2032 .    nr doc-arg-ptr +1
2033 .    ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \
2034 .      doc-print-recursive
2035 .    el \
2036 .      doc-reset-args
2037 .  \}
2041 .\" NS doc-space global string
2042 .\" NS   current inter-argument space
2044 .ds doc-space "\*[doc-soft-space]
2047 .\" NS doc-soft-space constant string
2048 .\" NS   soft (stretchable) space (defined in doc-common)
2051 .\" NS doc-hard-space constant string
2052 .\" NS   hard (unpaddable) space (defined in doc-common)
2055 .\" NS doc-set-hard-space macro
2056 .\" NS   set current space string to hard (unpaddable) space.
2057 .\" NS
2058 .\" NS modifies:
2059 .\" NS   doc-saved-space
2060 .\" NS   doc-space
2062 .de doc-set-hard-space
2063 .  ie "\*[doc-space]"" \
2064 .    ds doc-saved-space "\*[doc-hard-space]
2065 .  el \
2066 .    ds doc-space "\*[doc-hard-space]
2070 .\" NS doc-set-soft-space macro
2071 .\" NS   set current space string to soft space
2072 .\" NS
2073 .\" NS modifies:
2074 .\" NS   doc-saved-space
2075 .\" NS   doc-space
2077 .de doc-set-soft-space
2078 .  ie "\*[doc-space]"" \
2079 .    ds doc-saved-space "\*[doc-soft-space]
2080 .  el \
2081 .    ds doc-space "\*[doc-soft-space]
2085 .\" NS doc-space-mode global register (bool)
2086 .\" NS   default is one (space mode on)
2088 .nr doc-space-mode 1
2091 .\" NS doc-saved-space global string
2092 .\" NS   saved value of `doc-space'
2094 .ds doc-saved-space "\*[doc-space]
2097 .\" NS doc-have-space global register (bool)
2098 .\" NS   set if last command was horizontal space
2100 .nr doc-have-space 0
2103 .\" NS Sm user macro
2104 .\" NS   space mode (`.Sm'/`.Sm on'/`.Sm off')
2105 .\" NS
2106 .\" NS   without argument, toggle space mode
2107 .\" NS
2108 .\" NS modifies:
2109 .\" NS   doc-arg-limit
2110 .\" NS   doc-arg-ptr
2111 .\" NS   doc-argXXX
2112 .\" NS   doc-macro-name
2113 .\" NS   doc-num-args
2114 .\" NS   doc-saved-space
2115 .\" NS   doc-space
2116 .\" NS   doc-space-mode
2117 .\" NS   doc-spaceXXX
2118 .\" NS
2119 .\" NS local variables:
2120 .\" NS   doc-reg-Sm
2121 .\" NS
2122 .\" NS width register `Sm' set in doc-common
2124 .de Sm
2125 .  ie \n[doc-have-space] \
2126 .    nr doc-reg-Sm 0
2127 .  el \
2128 .    nr doc-reg-Sm 1
2130 .  if !\n[doc-arg-limit] \{\
2131 .    ie \n[.$] \{\
2132 .      ds doc-macro-name Sm
2133 .      doc-parse-args \$@
2134 .    \}
2135 .    el \{\
2136 .      ie \n[doc-space-mode] \
2137 .        nr doc-space-mode 0
2138 .      el \
2139 .        nr doc-space-mode 1
2140 .  \}\}
2142 .  if !\n[doc-arg-limit] \
2143 .    return
2145 .  nr doc-arg-ptr +1
2147 .  \" avoid a warning message in case `Sm' is the last parameter
2148 .  if !d doc-arg\n[doc-arg-ptr] \
2149 .    ds doc-arg\n[doc-arg-ptr]
2151 .  ie "\*[doc-arg\n[doc-arg-ptr]]"on" \{\
2152 .    ds doc-space "\*[doc-saved-space]
2153 .    nr doc-space-mode 1
2154 .  \}
2155 .  el \{\
2156 .    ie "\*[doc-arg\n[doc-arg-ptr]]"off" \{\
2157 .      ds doc-saved-space "\*[doc-space]
2158 .      ds doc-space
2159 .      nr doc-space-mode 0
2160 .    \}
2161 .    el \{\
2162 .      \" no argument for Sm
2163 .      nr doc-arg-ptr -1
2164 .      ie \n[doc-space-mode] \
2165 .        nr doc-space-mode 0
2166 .      el \
2167 .        nr doc-space-mode 1
2168 .  \}\}
2170 .  ie \n[doc-space-mode] \{\
2171 .    \" recompute space vector for remaining arguments
2172 .    nr doc-num-args (\n[doc-arg-limit] - \n[doc-arg-ptr])
2173 .    nr doc-arg-limit \n[doc-arg-ptr]
2174 .    if \n[doc-num-args] \
2175 .      doc-parse-space-vector
2177 .    \" finish line only if it is interrupted and `doc-have-space'
2178 .    \" isn't set
2179 .    if \n[doc-reg-Sm] \
2180 .      if \n[.int] \
2181 .        nop \)
2182 .  \}
2183 .  el \{\
2184 .    \" reset remaining space vector elements
2185 .    nr doc-reg-Sm (\n[doc-arg-ptr] + 1)
2186 .    while (\n[doc-reg-Sm] <= \n[doc-arg-limit]) \{\
2187 .      ds doc-space\n[doc-reg-Sm]
2188 .      nr doc-reg-Sm +1
2189 .      \" the body of a `while' request must end with the fitting `\}'!
2190 .    \}
2191 .  \}
2193 .  \" do we have parameters to print?
2194 .  ie (\n[doc-arg-limit] <= \n[doc-arg-ptr]) \{\
2195 .    \" ignore `.Sm on' and `.Sm off' without additional parameters
2196 .    ie (\n[doc-arg-ptr] > 1) \
2197 .      doc-print-and-reset
2198 .    el \
2199 .      doc-reset-args
2200 .  \}
2201 .  el \{\
2202 .    \" skip `Sm' argument
2203 .    nr doc-arg-ptr +1
2204 .    doc-print-recursive
2205 .  \}
2209 .\" NS doc-arg-type immediate register
2210 .\" NS   argument type (macro=1, string=2, punctuation suffix=3,
2211 .\" NS   punctuation prefix=4)
2213 .nr doc-arg-type 0
2216 .\" NS doc-get-arg-type macro
2217 .\" NS   get argument type
2218 .\" NS
2219 .\" NS   this macro expects the width of the argument in `doc-width'
2220 .\" NS
2221 .\" NS modifies:
2222 .\" NS   doc-arg-type
2224 .de doc-get-arg-type
2225 .  nr doc-arg-type 2
2227 .  if ((\n[doc-width] < 4) & \A\a\$1\a) \{\
2228 .    ie (\n[doc-width] == 1) \{\
2229 .      if r doc-punct\$1 \
2230 .        nr doc-arg-type \n[doc-punct\$1]
2231 .    \}
2232 .    el \
2233 .      if r \$1 \
2234 .        if d \$1 \
2235 .          nr doc-arg-type 1
2236 .  \}
2240 .\" NS doc-get-arg-type* macro
2241 .\" NS   similar to as `doc-get-arg-type' but uses doc-argXXX strings
2242 .\" NS
2243 .\" NS   this macro sets the `doc-width' register using the `length' request
2244 .\" NS   to get the number of characters in a string literally
2245 .\" NS
2246 .\" NS modifies:
2247 .\" NS   doc-arg-type
2248 .\" NS   doc-width
2250 .de doc-get-arg-type*
2251 .  nr doc-arg-type 2
2252 .  length doc-width "\*[doc-arg\$1]
2254 .  if ((\n[doc-width] < 4) & \A\a\*[doc-arg\$1]\a) \{\
2255 .    ie (\n[doc-width] == 1) \{\
2256 .      if r doc-punct\*[doc-arg\$1] \
2257 .        nr doc-arg-type \n[doc-punct\*[doc-arg\$1]]
2258 .    \}
2259 .    el \
2260 .      if r \*[doc-arg\$1] \
2261 .        if d \*[doc-arg\$1] \
2262 .          nr doc-arg-type 1
2263 .  \}
2267 .\" NS doc-set-spacing-1 macro
2268 .\" NS   set spacing for macros
2269 .\" NS
2270 .\" NS modifies:
2271 .\" NS   doc-spaceXXX
2272 .\" NS
2273 .\" NS local variables:
2274 .\" NS   doc-reg-dssfm
2275 .\" NS   doc-reg-dssfm1
2277 .de doc-set-spacing-1
2278 .  nr doc-reg-dssfm1 \n[\*[doc-arg\n[doc-arg-limit]]]
2280 .  \" closing macros like .Ac, Bc., etc. have value 3 (remove space before
2281 .  \" argument)
2282 .  ie (\n[doc-reg-dssfm1] == 3) \{\
2283 .    if \n[doc-arg-limit] \{\
2284 .      nr doc-reg-dssfm (\n[doc-arg-limit] - 1)
2285 .      ds doc-space\n[doc-reg-dssfm]
2286 .    \}
2287 .    ds doc-space\n[doc-arg-limit] "\*[doc-space]
2288 .  \}
2289 .  el \{\
2290 .    \" macros like .Ap and .Ns have value 2 (remove space before and after
2291 .    \" argument)
2292 .    ie (\n[doc-reg-dssfm1] == 2) \{\
2293 .      if \n[doc-arg-limit] \{\
2294 .        nr doc-reg-dssfm (\n[doc-arg-limit] - 1)
2295 .        ds doc-space\n[doc-reg-dssfm]
2296 .      \}
2297 .      ds doc-space\n[doc-arg-limit]
2298 .    \}
2299 .    el \
2300 .      ds doc-space\n[doc-arg-limit]
2301 .  \}
2305 .\" NS doc-set-spacing-2 macro
2306 .\" NS   set spacing for strings
2307 .\" NS
2308 .\" NS modifies:
2309 .\" NS   doc-spaceXXX
2311 .de doc-set-spacing-2
2312 .  ds doc-space\n[doc-arg-limit] "\*[doc-space]
2316 .\" NS doc-set-spacing-3 macro
2317 .\" NS   set spacing for punctuation suffixes
2318 .\" NS
2319 .\" NS modifies:
2320 .\" NS   doc-spaceXXX
2321 .\" NS
2322 .\" NS local variables:
2323 .\" NS   doc-reg-dssfps
2325 .de doc-set-spacing-3
2326 .  if \n[doc-arg-limit] \{\
2327 .    nr doc-reg-dssfps (\n[doc-arg-limit] - 1)
2328 .    ds doc-space\n[doc-reg-dssfps]
2329 .  \}
2331 .  ds doc-space\n[doc-arg-limit] "\*[doc-space]
2335 .\" NS doc-set-spacing-4 macro
2336 .\" NS   set spacing for punctuation prefixes
2337 .\" NS
2338 .\" NS modifies:
2339 .\" NS   doc-spaceXXX
2341 .de doc-set-spacing-4
2342 .  ds doc-space\n[doc-arg-limit]
2346 .\" type switches (on current argument doc-arg-ptr)
2349 .\" NS doc-do-1 macro
2350 .\" NS   call request if macro
2352 .de doc-do-1
2353 .  \*[doc-arg\n[doc-arg-ptr]]
2357 .\" NS doc-do-2 macro
2358 .\" NS   call .doc-print-recursive if string
2360 .als doc-do-2 doc-print-recursive
2363 .\" NS doc-do-3 macro
2364 .\" NS   call .doc-print-recursive if punctuation suffix
2366 .als doc-do-3 doc-print-recursive
2369 .\" NS doc-do-4 macro
2370 .\" NS   call .doc-print-recursive if punctuation prefix
2372 .als doc-do-4 doc-print-recursive
2375 .\" NS doc-fontmode-depth global register
2376 .\" NS   font mode level
2378 .nr doc-fontmode-depth 0
2381 .\" NS doc-fontmode-font-stackXXX global register
2382 .\" NS   stack of saved current font values from `Bf' macro
2383 .\" NS
2384 .\" NS limit:
2385 .\" NS   doc-fontmode-depth
2387 .nr doc-fontmode-font-stack0 0
2390 .\" NS doc-fontmode-size-stackXXX global register
2391 .\" NS   stack of saved current size values from `Bf' macro
2392 .\" NS
2393 .\" NS limit:
2394 .\" NS   doc-fontmode-depth
2396 .nr doc-fontmode-size-stack0 0
2399 .\" NS Bf user macro
2400 .\" NS   begin font mode (will be begin-mode/end-mode in groff & TeX)
2401 .\" NS
2402 .\" NS modifies:
2403 .\" NS   doc-fontmode-depth
2404 .\" NS   doc-fontmode-font-stackXXX
2405 .\" NS   doc-fontmode-size-stackXXX
2406 .\" NS   doc-macro-name
2407 .\" NS
2408 .\" NS width register `Bf' set in doc-common
2410 .de Bf
2411 .  ds doc-macro-name Bf
2413 .  ie \n[.$] \{\
2414 .    nr doc-fontmode-depth +1
2416 .    \" save current font and size
2417 .    nr doc-fontmode-font-stack\n[doc-fontmode-depth] \n[.f]
2418 .    nr doc-fontmode-size-stack\n[doc-fontmode-depth] \n[.ps]
2420 .    ie        "\$1"Em" \
2421 .      nop \*[doc-Em-font]\c
2422 .    el \{ .ie "\$1"Li" \
2423 .      nop \*[doc-Li-font]\c
2424 .    el \{ .ie "\$1"Sy" \
2425 .      nop \*[doc-Sy-font]\c
2426 .    el \{ .ie "\$1"-emphasis" \
2427 .      nop \*[doc-Em-font]\c
2428 .    el \{ .ie "\$1"-literal" \
2429 .      nop \*[doc-Li-font]\c
2430 .    el \{ .ie "\$1"-symbolic" \
2431 .      nop \*[doc-Sy-font]\c
2432 .    el \{\
2433 .      tmc mdoc warning: Unknown keyword `\$1' in .Bf macro
2434 .      tm1 " (#\n[.c])
2435 .  \}\}\}\}\}\}\}
2436 .  el \
2437 .    tm Usage: .Bf [Em | -emphasis | Li | -literal | Sy | -symbolic] (#\n[.c])
2441 .\" NS Ef user macro
2442 .\" NS   end font mode
2443 .\" NS
2444 .\" NS modifies:
2445 .\" NS   doc-macro-name
2446 .\" NS
2447 .\" NS width register `Ef' set in doc-common
2449 .de Ef
2450 .  ds doc-macro-name Ef
2452 .  ie \n[doc-fontmode-depth] \{\
2453 .    \" restore saved font and size
2454 .    nop \)\f[\n[doc-fontmode-font-stack\n[doc-fontmode-depth]]]\c
2455 .    nop \)\s[\n[doc-fontmode-size-stack\n[doc-fontmode-depth]]u]\c
2457 .    nr doc-fontmode-font-stack\n[doc-fontmode-depth] 0
2458 .    nr doc-fontmode-size-stack\n[doc-fontmode-depth] 0
2459 .    nr doc-fontmode-depth -1
2460 .  \}
2461 .  el \
2462 .    tm mdoc warning: Extraneous .Ef (#\n[.c])
2466 .\" NS doc-keep-type global register
2467 .\" NS   current keep type; 1 is `-words', 2 is `-lines', 3 is unknown
2469 .nr doc-keep-type 0
2472 .\" NS Bk user macro
2473 .\" NS   begin keep
2474 .\" NS
2475 .\" NS modifies:
2476 .\" NS   doc-keep-type
2477 .\" NS   doc-macro-name
2478 .\" NS
2479 .\" NS width register `Bk' set in doc-common
2481 .de Bk
2482 .  ds doc-macro-name Bk
2484 .  if \n[doc-keep-type] \
2485 .    tm .Bk: nesting keeps not implemented yet. (#\n[.c])
2487 .  ie        "\$1"-lines" \{\
2488 .    nr doc-keep-type 2
2489 .    tm .Bk -lines: Not implemented yet. (#\n[.c])
2490 .  \}
2491 .  el \{ .ie "\$1"-words" \{\
2492 .    nr doc-keep-type 1
2493 .    doc-set-hard-space
2494 .  \}
2495 .  el \{ .ie "\$1"" \{\
2496 .    \" default
2497 .    nr doc-keep-type 1
2498 .    doc-set-hard-space
2499 .  \}
2500 .  el \{\
2501 .    tm mdoc warning: Unknown keyword `\$1' in .Bk macro (#\n[.c])
2502 .    nr doc-keep-type 3
2503 .  \}\}\}
2505 \#.  nr doc-nesting-level +1
2509 .\" NS Ek user macro
2510 .\" NS   end keep
2511 .\" NS
2512 .\" NS modifies:
2513 .\" NS   doc-keep-type
2514 .\" NS   doc-macro-name
2515 .\" NS
2516 .\" NS width register `Ek' set in doc-common
2518 .de Ek
2519 .  ds doc-macro-name Ek
2521 \#.  nr doc-nesting-level -1
2523 .  ie \n[.$] \
2524 .    tm Usage: .Ek (does not take arguments) (#\n[.c])
2525 .  el \{\
2526 .    if !\n[doc-keep-type] \
2527 .      tm mdoc warning: .Ek found without .Bk before (#\n[.c])
2529 .    ie        (\n[doc-keep-type] == 1) \
2530 .      doc-set-soft-space
2531 .    el \{ .if (\n[doc-keep-type] == 2) \
2532 .      tm .Bk -lines: Not implemented yet. (#\n[.c])
2533 .  \}\}
2535 .  nr doc-keep-type 0
2537 \#.  if !"\*[doc-out-string]"" \
2538 \#.    doc-print-out-string
2542 .\" NS doc-display-depth global register
2543 .\" NS   display level
2545 .nr doc-display-depth 0
2548 .\" NS doc-is-compact global register (bool)
2549 .\" NS   set if the `compact' keyword is given
2551 .nr doc-is-compact 0
2554 .\" NS doc-display-type-stackXXX global string
2555 .\" NS   the display type stack
2556 .\" NS
2557 .\" NS limit:
2558 .\" NS   doc-display-depth
2560 .ds doc-display-type-stack0
2563 .\" NS doc-display-indent-stackXXX global register
2564 .\" NS   stack of display indentation values
2565 .\" NS
2566 .\" NS limit:
2567 .\" NS   doc-display-depth
2569 .nr doc-display-indent-stack0 0
2572 .\" NS doc-display-ad-stackXXX global register
2573 .\" NS   stack of saved adjustment modes
2574 .\" NS
2575 .\" NS limit:
2576 .\" NS   doc-display-depth
2578 .nr doc-display-ad-stack0 0
2581 .\" NS doc-display-fi-stackXXX global register
2582 .\" NS   stack of saved fill modes
2583 .\" NS
2584 .\" NS limit:
2585 .\" NS   doc-display-depth
2587 .nr doc-display-fi-stack0 0
2590 .\" NS doc-display-ft-stackXXX global register
2591 .\" NS   stack of saved fonts
2592 .\" NS
2593 .\" NS limit:
2594 .\" NS   doc-display-depth
2596 .nr doc-display-ft-stack0 0
2599 .\" NS doc-display-ps-stackXXX global register
2600 .\" NS   stack of saved font sizes
2601 .\" NS
2602 .\" NS limit:
2603 .\" NS   doc-display-depth
2605 .nr doc-display-ps-stack0 0
2608 .\" NS Bd user macro
2609 .\" NS   begin display
2610 .\" NS
2611 .\" NS width register `Bd' set in doc-common
2612 .\" NS
2613 .\" NS modifies:
2614 .\" NS   doc-curr-font
2615 .\" NS   doc-curr-size
2616 .\" NS   doc-display-depth
2617 .\" NS   doc-display-ad-stackXXX
2618 .\" NS   doc-display-fi-stackXXX
2619 .\" NS   doc-display-ft-stackXXX
2620 .\" NS   doc-display-ps-stackXXX
2621 .\" NS   doc-display-file
2622 .\" NS   doc-display-indent-stackXXX
2623 .\" NS   doc-display-type-stackXXX
2624 .\" NS   doc-is-compact
2625 .\" NS   doc-macro-name
2626 .\" NS
2627 .\" NS local variables:
2628 .\" NS   doc-reg-Bd
2630 .de Bd
2631 .  ds doc-macro-name Bd
2633 .  if !\n[.$] \{\
2634 .    tm1 "Usage: .Bd {-literal | -filled | -ragged | -centered | -unfilled}
2635 .    tm1 "           [-offset [string]] [-compact] [-file name] (#\n[.c])
2636 .    return
2637 .  \}
2639 .  nr doc-is-compact 0
2640 .  ds doc-display-file
2641 .  nr doc-reg-Bd 1
2642 .  nr doc-display-depth +1
2644 .  \" save current adjustment and fill modes
2645 .  nr doc-display-ad-stack\n[doc-display-depth] \n[.j]
2646 .  nr doc-display-fi-stack\n[doc-display-depth] \n[.u]
2648 .  ie        "\$1"-literal" \{\
2649 .    ds doc-display-type-stack\n[doc-display-depth] literal
2650 .    nr doc-display-ft-stack\n[doc-display-depth] \n[.f]
2651 .    nr doc-display-ps-stack\n[doc-display-depth] \n[.ps]
2653 .    ie t \{\
2654 .      nop \*[doc-Li-font]\c
2655 .      ta T 9n
2656 .    \}
2657 .    el \
2658 .      ta T 8n
2659 .    nf
2660 .  \}
2661 .  el \{ .ie "\$1"-filled" \{\
2662 .    ds doc-display-type-stack\n[doc-display-depth] filled
2663 .    ad b
2664 .    fi
2665 .  \}
2666 .  el \{ .ie "\$1"-ragged" \{\
2667 .    ds doc-display-type-stack\n[doc-display-depth] ragged
2668 .    na
2669 .    fi
2670 .  \}
2671 .  el \{ .ie "\$1"-centered" \{\
2672 .    ds doc-display-type-stack\n[doc-display-depth] centered
2673 .    ad c
2674 .    fi
2675 .  \}
2676 .  el \{ .ie "\$1"-unfilled" \{\
2677 .    ds doc-display-type-stack\n[doc-display-depth] unfilled
2678 .    nf
2679 .  \}
2680 .  el \{\
2681 .    tm1 "mdoc warning: Unknown keyword `\$1' (or missing display type)
2682 .    tm1 "              in .Bd macro (#\n[.c])
2683 .    nr doc-reg-Bd 0
2684 .  \}\}\}\}\}
2686 .  \" have we seen an argument?
2687 .  if \n[doc-reg-Bd] \{\
2688 .    shift
2689 .    \" check other arguments
2690 .    if \n[.$] \
2691 .      doc-do-Bd-args \$@
2692 .  \}
2694 .  \" avoid warning about non-existent register
2695 .  if !r doc-display-indent-stack\n[doc-display-depth] \
2696 .    nr doc-display-indent-stack\n[doc-display-depth] 0
2698 .  if \n[doc-display-indent-stack\n[doc-display-depth]] \
2699 .    in +\n[doc-display-indent-stack\n[doc-display-depth]]u
2701 .  if !\n[doc-is-compact] \
2702 .    sp \n[doc-display-vertical]u
2704 .  if !\n[cR] \
2705 .    ne 2v
2707 .  if !"\*[doc-display-file]"" \
2708 .    so \*[doc-display-file]
2710 .  nr doc-is-compact 0
2711 .  ds doc-display-file
2715 .\" NS doc-do-Bd-args macro
2716 .\" NS   resolve remaining .Bd arguments
2717 .\" NS
2718 .\" NS modifies:
2719 .\" NS   doc-display-file
2720 .\" NS   doc-display-indent-stackXXX
2721 .\" NS   doc-is-compact
2722 .\" NS
2723 .\" NS local variables:
2724 .\" NS   doc-reg-ddBa
2725 .\" NS   doc-reg-ddBa1
2726 .\" NS   doc-reg-ddBa2
2727 .\" NS   doc-reg-ddBa3
2728 .\" NS   doc-reg-ddBa4
2729 .\" NS   doc-str-ddBa
2731 .de doc-do-Bd-args
2732 .  nr doc-reg-ddBa 1
2734 .  ie        "\$1"-offset" \{\
2735 .    nr doc-reg-ddBa 2
2737 .    ie        "\$2"left" \
2738 .      nr doc-display-indent-stack\n[doc-display-depth] 0
2739 .    el \{ .ie "\$2"right" \
2740 .      nr doc-display-indent-stack\n[doc-display-depth] (\n[.l]u / 3u)
2741 .    el \{ .ie "\$2"center" \
2742 .      nr doc-display-indent-stack\n[doc-display-depth] ((\n[.l]u - \n[.i]u) / 4u)
2743 .    el \{ .ie "\$2"indent" \
2744 .      nr doc-display-indent-stack\n[doc-display-depth] \n[doc-display-indent]u
2745 .    el \{ .ie "\$2"indent-two" \
2746 .      nr doc-display-indent-stack\n[doc-display-depth] (\n[doc-display-indent]u + \n[doc-display-indent]u)
2747 .    el \
2748 .      nr doc-reg-ddBa 1
2749 .    \}\}\}\}
2751 .    \" not a known keyword
2752 .    if (\n[doc-reg-ddBa] == 1) \{\
2753 .      nr doc-reg-ddBa 2
2755 .      nr doc-reg-ddBa1 0
2756 .      if \B\a(\$2)\a \{\
2757 .        \" disable warnings related to scaling indicators (32)
2758 .        nr doc-reg-ddBa2 \n[.warn]
2759 .        warn (\n[.warn] - (\n[.warn] / 32 % 2 * 32))
2761 .        \" values without a scaling indicator are taken as strings;
2762 .        \" we test whether the parameter string with and without the last
2763 .        \" character yields identical numerical results (ignoring the
2764 .        \" scaling indicator)
2765 .        ds doc-str-ddBa "\$2
2766 .        substring doc-str-ddBa 0 -2
2767 .        if \B\a(\*[doc-str-ddBa])\a \{\
2768 .          nr doc-reg-ddBa3 (;(\$2))
2769 .          nr doc-reg-ddBa4 (\*[doc-str-ddBa])
2770 .          if (\n[doc-reg-ddBa3] == \n[doc-reg-ddBa4]) \
2771 .            nr doc-reg-ddBa1 1
2772 .        \}
2774 .        \" enable all warnings again
2775 .        warn \n[doc-reg-ddBa2]
2776 .      \}
2778 .      ie \n[doc-reg-ddBa1] \
2779 .        nr doc-display-indent-stack\n[doc-display-depth] \$2
2780 .      el \{\
2781 .        doc-get-width "\$2"
2782 .        ie (\n[doc-width] <= 3) \{\
2783 .          \" if the offset parameter is a macro, use the macro's
2784 .          \" width as specified in doc-common
2785 .          doc-get-arg-type "\$2"
2786 .          ie (\n[doc-arg-type] == 1) \
2787 .            nr doc-display-indent-stack\n[doc-display-depth] \n[\$2]
2788 .          el \
2789 .            nr doc-display-indent-stack\n[doc-display-depth] (\n[doc-width]u * \n[doc-fixed-width]u)
2790 .        \}
2791 .        el \
2792 .          nr doc-display-indent-stack\n[doc-display-depth] (\n[doc-width]u * \n[doc-fixed-width]u)
2793 .    \}\}
2794 .  \}
2795 .  el \{ .ie "\$1"-compact" \
2796 .    nr doc-is-compact 1
2797 .  el \{ .ie "\$1"-file" \{\
2798 .    ie !"\$2"" \{\
2799 .      ds doc-display-file "\$2
2800 .      nr doc-reg-ddBa 2
2801 .    \}
2802 .    el \
2803 .      tm mdoc warning: .Bd `-file' keyword requires argument (#\n[.c])
2804 .  \}
2805 .  el \
2806 .      tm mdoc warning: Unknown keyword `\$1' in .Bd macro (#\n[.c])
2807 .  \}\}
2809 .  if (\n[doc-reg-ddBa] < \n[.$]) \{\
2810 .    shift \n[doc-reg-ddBa]
2811 .    doc-do-Bd-args \$@
2812 .  \}
2816 .\" NS Ed user macro
2817 .\" NS   end display
2818 .\" NS
2819 .\" NS modifies:
2820 .\" NS   doc-display-depth
2821 .\" NS   doc-display-indent-stackXXX
2822 .\" NS   doc-display-type-stackXXX
2823 .\" NS   doc-macro-name
2824 .\" NS
2825 .\" NS width register `Ed' set in doc-common
2827 .de Ed
2828 .  ds doc-macro-name Ed
2830 .  br
2832 .  if !\n[doc-display-depth] \{\
2833 .    tm mdoc warning: Extraneous .Ed (#\n[.c])
2834 .    nr doc-display-depth 1
2835 .  \}
2837 .  if "\*[doc-display-type-stack\n[doc-display-depth]]"literal" \{\
2838 .    ft \n[doc-display-ft-stack\n[doc-display-depth]]
2839 .    ps \n[doc-display-ps-stack\n[doc-display-depth]]u
2840 .  \}
2842 .  in -\n[doc-display-indent-stack\n[doc-display-depth]]u
2844 .  \" restore saved adjustment and fill modes
2845 .  ie \n[doc-display-fi-stack\n[doc-display-depth]] \
2846 .    fi
2847 .  el \
2848 .    nf
2849 .  ad \n[doc-display-ad-stack\n[doc-display-depth]]
2851 .  nr doc-display-indent-stack\n[doc-display-depth] 0
2852 .  ds doc-display-type-stack\n[doc-display-depth]
2853 .  nr doc-display-depth -1
2857 .\" NS doc-list-type-stackXXX global string
2858 .\" NS   stack of list types
2859 .\" NS
2860 .\" NS limit:
2861 .\" NS   doc-list-depth
2863 .ds doc-list-type-stack1
2866 .\" NS doc-list-indent-stackXXX global register
2867 .\" NS   stack of list indentation values
2868 .\" NS
2869 .\" NS limit:
2870 .\" NS   doc-list-depth
2872 .nr doc-list-indent-stack1 0
2875 .\" NS doc-list-have-indent-stackXXX global register (bool)
2876 .\" NS   an indentation value is active
2877 .\" NS
2878 .\" NS limit:
2879 .\" NS   doc-list-depth
2881 .nr doc-list-have-indent-stack1 0
2884 .\" NS Bl user macro
2885 .\" NS   begin list
2886 .\" NS
2887 .\" NS width register `Bl' set in doc-common
2888 .\" NS
2889 .\" NS modifies:
2890 .\" NS   doc-arg-ptr
2891 .\" NS   doc-argXXX
2892 .\" NS   doc-list-depth
2893 .\" NS   doc-list-have-indent-stackXXX
2894 .\" NS   doc-list-indent-stackXXX
2895 .\" NS   doc-list-type-stackXXX
2896 .\" NS   doc-macro-name
2897 .\" NS   doc-num-args
2898 .\" NS   doc-num-columns
2899 .\" NS
2900 .\" NS local variables:
2901 .\" NS   doc-reg-Bl
2903 .de Bl
2904 .  if !\n[.$] \{\
2905 .    doc-Bl-usage
2906 .    return
2907 .  \}
2909 .  ds doc-macro-name Bl
2910 .  nr doc-list-depth +1
2911 .  nr doc-arg-ptr 1
2913 .  ie        "\$1"-hang" \{\
2914 .    ds doc-list-type-stack\n[doc-list-depth] hang-list
2915 .    nr doc-list-indent-stack\n[doc-list-depth] 6n
2916 .    nr doc-list-have-indent-stack\n[doc-list-depth] 1
2917 .  \}
2918 .  el \{ .ie "\$1"-tag" \{\
2919 .    ds doc-list-type-stack\n[doc-list-depth] tag-list
2920 .    nr doc-list-have-indent-stack\n[doc-list-depth] 1
2921 .  \}
2922 .  el \{ .ie "\$1"-item" \{\
2923 .    ds doc-list-type-stack\n[doc-list-depth] item-list
2924 .    nr doc-list-have-indent-stack\n[doc-list-depth] 1
2925 .  \}
2926 .  el \{ .ie "\$1"-enum" \{\
2927 .    ds doc-list-type-stack\n[doc-list-depth] enum-list
2928 .    nr doc-list-indent-stack\n[doc-list-depth] 3n
2929 .    nr doc-list-have-indent-stack\n[doc-list-depth] 1
2930 .  \}
2931 .  el \{ .ie "\$1"-bullet" \{\
2932 .    ds doc-list-type-stack\n[doc-list-depth] bullet-list
2933 .    nr doc-list-indent-stack\n[doc-list-depth] 2n
2934 .    nr doc-list-have-indent-stack\n[doc-list-depth] 1
2935 .  \}
2936 .  el \{ .ie "\$1"-dash" \{\
2937 .    ds doc-list-type-stack\n[doc-list-depth] dash-list
2938 .    nr doc-list-indent-stack\n[doc-list-depth] 2n
2939 .    nr doc-list-have-indent-stack\n[doc-list-depth] 1
2940 .  \}
2941 .  el \{ .ie "\$1"-hyphen" \{\
2942 .    ds doc-list-type-stack\n[doc-list-depth] dash-list
2943 .    nr doc-list-indent-stack\n[doc-list-depth] 2n
2944 .    nr doc-list-have-indent-stack\n[doc-list-depth] 1
2945 .  \}
2946 .  el \{ .ie "\$1"-inset" \{\
2947 .    ds doc-list-type-stack\n[doc-list-depth] inset-list
2948 .    nr doc-list-have-indent-stack\n[doc-list-depth] 1
2949 .  \}
2950 .  el \{ .ie "\$1"-diag" \{\
2951 .    ds doc-list-type-stack\n[doc-list-depth] diag-list
2952 .  \}
2953 .  el \{ .ie "\$1"-ohang" \{\
2954 .    ds doc-list-type-stack\n[doc-list-depth] ohang-list
2955 .    nr doc-list-have-indent-stack\n[doc-list-depth] 1
2956 .  \}
2957 .  el \{ .ie "\$1"-column" \{\
2958 .    ds doc-list-type-stack\n[doc-list-depth] column-list
2959 .    linetabs 1
2960 .  \}
2961 .  el \{\
2962 .    tm1 "mdoc warning: Unknown list type `\$1' (or missing list type)
2963 .    tm1 "              in .Bl macro
2964 .    tm
2965 .    nr doc-arg-ptr 0
2966 .  \}\}\}\}\}\}\}\}\}\}\}
2968 .  \" we have seen a list type
2969 .  if !\n[doc-arg-ptr] \{\
2970 .    doc-Bl-usage
2971 .    doc-reset-args
2972 .    nr doc-list-depth -1
2973 .    return
2974 .  \}
2976 .  shift
2978 .  \" fill argument vector
2979 .  nr doc-reg-Bl 1
2980 .  while (\n[doc-reg-Bl] <= \n[.$]) \{\
2981 .    ds doc-arg\n[doc-reg-Bl] "\$[\n[doc-reg-Bl]]
2982 .    \" dummy type and space so that doc-save-global-vars() doesn't warn
2983 .    nr doc-type\n[doc-reg-Bl] 0
2984 .    ds doc-space\n[doc-reg-Bl]
2985 .    nr doc-reg-Bl +1
2986 .  \}
2988 .  doc-increment-list-stack
2990 .  if \n[.$] \{\
2991 .    nr doc-arg-limit \n[.$]
2992 .    nr doc-arg-ptr 0
2993 .    doc-do-Bl-args
2995 .    in +\n[doc-list-offset-stack\n[doc-list-depth]]u
2997 .    \" initialize column list
2998 .    if "\*[doc-list-type-stack\n[doc-list-depth]]"column-list" \{\
2999 .      doc-set-column-tab \n[doc-num-columns]
3000 '      in -\n[doc-column-indent-width]u
3001 .      if !\n[doc-compact-list-stack\n[doc-list-depth]] \
3002 .        sp \n[doc-display-vertical]u
3004 .      nf
3005 .      nr doc-num-columns 0
3006 .  \}\}
3008 .  doc-reset-args
3012 .\" NS doc-Bl-usage macro
3014 .de doc-Bl-usage
3015 .  tm1 "Usage: .Bl {-hang | -ohang | -tag | -diag | -inset}
3016 .  tm1 "             [-width <string>]
3017 .  tm1 "             [-offset <string>] [-compact]
3018 .  tm1 "       .Bl -column [-offset <string>] <string1> <string2> ...
3019 .  tm1 "       .Bl {-item | -enum [-nested] | -bullet | -hyphen | -dash}
3020 .  tm1 "             [-offset <string>] [-compact] (#\n[.c])
3024 .\" NS doc-do-Bl-args macro
3025 .\" NS   resolve remaining .Bl arguments
3026 .\" NS
3027 .\" NS modifies:
3028 .\" NS   doc-arg-ptr
3029 .\" NS   doc-argXXX
3030 .\" NS   doc-compact-list-stackXXX
3031 .\" NS   doc-list-indent-stackXXX
3032 .\" NS   doc-list-offset-stackXXX
3033 .\" NS   doc-num-columns
3034 .\" NS   doc-tag-prefix-stackXXX
3035 .\" NS   doc-tag-width-stackXXX
3036 .\" NS
3037 .\" NS local variables:
3038 .\" NS   doc-box-dBla
3039 .\" NS   doc-env-dBla
3040 .\" NS   doc-reg-dBla
3041 .\" NS   doc-reg-dBla1
3042 .\" NS   doc-reg-dBla2
3043 .\" NS   doc-reg-dBla3
3044 .\" NS   doc-reg-dBla4
3045 .\" NS   doc-str-dBla
3046 .\" NS   doc-str-dBla1
3048 .de doc-do-Bl-args
3049 .  nr doc-arg-ptr +1
3051 .  if (\n[doc-arg-limit] < \n[doc-arg-ptr]) \
3052 .    return
3054 .  \" avoid a warning message in case e.g. `-offset' has no parameter
3055 .  nr doc-reg-dBla (\n[doc-arg-ptr] + 1)
3056 .  if !d doc-arg\n[doc-reg-dBla] \
3057 .    ds doc-arg\n[doc-reg-dBla]
3059 .  nr doc-reg-dBla 1
3061 .  ie        "\*[doc-arg\n[doc-arg-ptr]]"-compact" \
3062 .    nr doc-compact-list-stack\n[doc-list-depth] 1
3064 .  el \{ .ie "\*[doc-arg\n[doc-arg-ptr]]"-nested" \{\
3065 .    ie (\n[doc-list-depth] > 1) \{\
3066 .      nr doc-reg-dBla1 (\n[doc-list-depth] - 1)
3067 .      ds doc-tag-prefix-stack\n[doc-list-depth] "\*[doc-tag-prefix-stack\n[doc-reg-dBla1]]
3068 .      as doc-tag-prefix-stack\n[doc-list-depth] \n[doc-enum-list-count-stack\n[doc-reg-dBla1]].
3069 .      length doc-reg-dBla1 "\*[doc-tag-prefix-stack\n[doc-list-depth]]
3070 .      nr doc-list-indent-stack\n[doc-list-depth] +\n[doc-reg-dBla1]n
3071 .    \}
3072 .    el \
3073 .      tm mdoc warning: `-nested' allowed with nested .Bl macros only (#\n[.c])
3074 .  \}
3076 .  el \{ .ie "\*[doc-arg\n[doc-arg-ptr]]"-width" \{\
3077 .    nr doc-arg-ptr +1
3078 .    ds doc-tag-width-stack\n[doc-list-depth] TagwidtH
3080 .    ds doc-str-dBla "\*[doc-arg\n[doc-arg-ptr]]
3081 .    substring doc-str-dBla 0 0
3082 .    ie \a.\a\*[doc-str-dBla]\a \{\
3083 .      ds doc-str-dBla "\*[doc-arg\n[doc-arg-ptr]]
3084 .      substring doc-str-dBla 1
3085 .      doc-first-parameter \*[doc-str-dBla]
3086 .      doc-get-width "\*[doc-str-dfp]
3087 .      doc-get-arg-type "\*[doc-str-dfp]
3088 .      ie (\n[doc-arg-type] == 1) \
3089 .        nr doc-reg-dBla1 1
3090 .      el \
3091 .        nr doc-reg-dBla1 0
3092 .    \}
3093 .    el \
3094 .      nr doc-reg-dBla1 0
3095 .    ds doc-str-dBla "\*[doc-arg\n[doc-arg-ptr]]
3097 .    ie \n[doc-reg-dBla1] \{\
3098 .      \" execute string in a box to get the width of the diversion
3099 .      ds doc-str-dBla \*[doc-arg\n[doc-arg-ptr]]
3100 .      doc-save-global-vars
3101 .      doc-reset-args
3102 .      box doc-box-dBla
3103 .      ev doc-env-dBla
3104 .      evc 0
3105 .      in 0
3106 .      nf
3107 .      nop \*[doc-str-dBla]
3108 .      br
3109 .      ev
3110 .      box
3111 .      doc-restore-global-vars
3112 .      doc-get-width \h'\n[dl]u'
3113 .      nr doc-list-indent-stack\n[doc-list-depth] (\n[doc-width]u * \n[doc-fixed-width]u)
3114 .    \}
3115 .    el \{\
3116 .      \" test whether argument is a valid numeric expression
3117 .      nr doc-reg-dBla1 0
3118 .      if \B\a(\*[doc-str-dBla])\a \{\
3119 .        \" disable warnings related to scaling indicators (32)
3120 .        nr doc-reg-dBla2 \n[.warn]
3121 .        warn (\n[.warn] - (\n[.warn] / 32 % 2 * 32))
3123 .        \" values without a scaling indicator are taken as strings;
3124 .        \" we test whether the parameter string with and without the last
3125 .        \" character yields identical numerical results (ignoring the
3126 .        \" scaling indicator)
3127 .        ds doc-str-dBla1 "\*[doc-str-dBla]
3128 .        substring doc-str-dBla1 0 -2
3129 .        if \B\a(\*[doc-str-dBla1])\a \{\
3130 .          nr doc-reg-dBla3 (;(\*[doc-str-dBla]))
3131 .          nr doc-reg-dBla4 (\*[doc-str-dBla1])
3132 .          if (\n[doc-reg-dBla3] == \n[doc-reg-dBla4]) \
3133 .            nr doc-reg-dBla1 1
3134 .        \}
3136 .        \" enable all warnings again
3137 .        warn \n[doc-reg-dBla2]
3138 .      \}
3140 .      ie \n[doc-reg-dBla1] \
3141 .        nr doc-list-indent-stack\n[doc-list-depth] (\*[doc-str-dBla])
3142 .      el \{\
3143 .        doc-get-arg-width \n[doc-arg-ptr]
3144 .        ie (\n[doc-width] == 2) \{\
3145 .          \" if the width parameter is a macro, use the macro's
3146 .          \" width as specified in doc-common
3147 .          doc-get-arg-type \*[doc-str-dBla]
3148 .          ie (\n[doc-arg-type] == 1) \
3149 .            nr doc-list-indent-stack\n[doc-list-depth] \n[\*[doc-str-dBla]]
3150 .          el \
3151 .            nr doc-list-indent-stack\n[doc-list-depth] (\n[doc-width]u * \n[doc-fixed-width]u)
3152 .        \}
3153 .        el \
3154 .          nr doc-list-indent-stack\n[doc-list-depth] (\n[doc-width]u * \n[doc-fixed-width]u)
3155 .  \}\}\}
3157 .  el \{ .ie "\*[doc-arg\n[doc-arg-ptr]]"-offset" \{\
3158 .    nr doc-arg-ptr +1
3160 .    ie "\*[doc-arg\n[doc-arg-ptr]]"indent" \
3161 .      nr doc-list-offset-stack\n[doc-list-depth] \n[doc-display-indent]u
3162 .    el \{\
3163 .      ds doc-str-dBla "\*[doc-arg\n[doc-arg-ptr]]
3164 .      nr doc-reg-dBla1 0
3165 .      if \B\a(\*[doc-str-dBla])\a \{\
3166 .        nr doc-reg-dBla2 \n[.warn]
3167 .        warn (\n[.warn] - (\n[.warn] / 32 % 2 * 32))
3169 .        ds doc-str-dBla1 "\*[doc-str-dBla]
3170 .        substring doc-str-dBla1 0 -2
3171 .        if \B\a(\*[doc-str-dBla1])\a \{\
3172 .          nr doc-reg-dBla3 (;(\*[doc-str-dBla]))
3173 .          nr doc-reg-dBla4 (\*[doc-str-dBla1])
3174 .          if (\n[doc-reg-dBla3] == \n[doc-reg-dBla4]) \
3175 .            nr doc-reg-dBla1 1
3176 .        \}
3178 .        warn \n[doc-reg-dBla2]
3179 .      \}
3181 .      ie \n[doc-reg-dBla1] \
3182 .        nr doc-list-offset-stack\n[doc-list-depth] \*[doc-str-dBla]
3183 .      el \{\
3184 .        doc-get-arg-width \n[doc-arg-ptr]
3185 .        ie (\n[doc-width] <= 3) \{\
3186 .          \" if the offset parameter is a macro, use the macro's
3187 .          \" width as specified in doc-common
3188 .          doc-get-arg-type \*[doc-str-dBla]
3189 .          ie (\n[doc-arg-type] == 1) \
3190 .            nr doc-list-offset-stack\n[doc-list-depth] \n[\*[doc-str-dBla]]
3191 .          el \
3192 .            nr doc-list-offset-stack\n[doc-list-depth] (\n[doc-width]u * \n[doc-fixed-width]u)
3193 .        \}
3194 .        el \
3195 .          nr doc-list-offset-stack\n[doc-list-depth] (\n[doc-width]u * \n[doc-fixed-width]u)
3196 .  \}\}\}
3197 .  el \
3198 .    nr doc-reg-dBla 0
3199 .  \}\}\}
3201 .  \" not a known keyword, so it specifies the width of the next column
3202 .  \" (if it is a column list)
3203 .  if !\n[doc-reg-dBla] \{\
3204 .    ie "\*[doc-list-type-stack\n[doc-list-depth]]"column-list" \{\
3205 .      nr doc-num-columns +1
3206 .      ds doc-str-dBla \*[doc-arg\n[doc-arg-ptr]]
3207 .      substring doc-str-dBla 0 0
3208 .      ie \a.\a\*[doc-str-dBla]\a \{\
3209 .        ds doc-str-dBla "\*[doc-arg\n[doc-arg-ptr]]
3210 .        substring doc-str-dBla 1
3211 .        doc-first-parameter \*[doc-str-dBla]
3212 .        doc-get-width "\*[doc-str-dfp]
3213 .        doc-get-arg-type "\*[doc-str-dfp]
3214 .        ie (\n[doc-arg-type] == 1) \
3215 .          nr doc-reg-dBla1 1
3216 .        el \
3217 .          nr doc-reg-dBla1 0
3218 .      \}
3219 .      el \
3220 .        nr doc-reg-dBla1 0
3221 .      ds doc-str-dBla "\*[doc-arg\n[doc-arg-ptr]]
3223 .      ie \n[doc-reg-dBla1] \{\
3224 .        \" execute string in a box to get the width of the diversion
3225 .        ds doc-str-dBla \*[doc-arg\n[doc-arg-ptr]]
3226 .        doc-save-global-vars
3227 .        doc-reset-args
3228 .        box doc-box-dBla
3229 .        ev doc-env-dBla
3230 .        evc 0
3231 .        in 0
3232 .        nf
3233 .        nop \*[doc-str-dBla]
3234 .        br
3235 .        ev
3236 .        box
3237 .        doc-restore-global-vars
3238 .        ds doc-arg\n[doc-num-columns] "\h'\n[dl]u'
3239 .      \}
3240 .      el \
3241 .        ds doc-arg\n[doc-num-columns] "\*[doc-arg\n[doc-arg-ptr]]
3242 .    \}
3243 .    el \{\
3244 .      tmc mdoc warning: Unknown keyword `\*[doc-arg\n[doc-arg-ptr]]'
3245 .      tm1 " in .Bl macro (#\n[.c])
3246 .  \}\}
3248 .  if (\n[doc-arg-limit] > \n[doc-arg-ptr]) \
3249 .    doc-do-Bl-args
3253 .\" NS doc-save-global-vars macro
3254 .\" NS   save all global variables
3255 .\" NS
3256 .\" NS local variables:
3257 .\" NS   doc-reg-dsgv
3259 .de doc-save-global-vars
3260 .  ds doc-macro-name-saved "\*[doc-macro-name]
3261 .  nr doc-arg-limit-saved \n[doc-arg-limit]
3262 .  nr doc-num-args-saved \n[doc-num-args]
3263 .  nr doc-arg-ptr-saved \n[doc-arg-ptr]
3265 .  nr doc-reg-dsgv 1
3266 .  while (\n[doc-reg-dsgv] <= \n[doc-arg-limit]) \{\
3267 .    ds doc-arg\n[doc-reg-dsgv]-saved "\*[doc-arg\n[doc-reg-dsgv]]
3268 .    nr doc-type\n[doc-reg-dsgv]-saved \n[doc-type\n[doc-reg-dsgv]]
3269 .    ds doc-space\n[doc-reg-dsgv]-saved "\*[doc-space\n[doc-reg-dsgv]]
3270 .    nr doc-reg-dsgv +1
3271 .  \}
3273 .  nr doc-curr-font-saved \n[doc-curr-font]
3274 .  nr doc-curr-size-saved \n[doc-curr-size]
3275 .  nr doc-in-synopsis-section-saved \n[doc-in-synopsis-section]
3276 .  nr doc-indent-synopsis-saved \n[doc-indent-synopsis]
3277 .  nr doc-indent-synopsis-active-saved \n[doc-indent-synopsis-active]
3278 .  nr doc-have-decl-saved \n[doc-have-decl]
3279 .  nr doc-have-var-saved \n[doc-have-var]
3280 .  ds doc-command-name-saved "\*[doc-command-name]
3281 .  ds doc-quote-left-saved "\*[doc-quote-left]
3282 .  ds doc-quote-right-saved "\*[doc-quote-right]
3283 .  nr doc-nesting-level-saved \n[doc-nesting-level]
3284 .  nr doc-in-list-saved \n[doc-in-list]
3285 .  ds doc-space-saved "\*[doc-space]
3286 .  ds doc-saved-space-saved "\*[doc-saved-space]
3287 .  nr doc-space-mode-saved \n[doc-space-mode]
3288 .  nr doc-have-space-saved \n[doc-have-space]
3289 .  nr doc-have-slot-saved \n[doc-have-slot]
3290 .  nr doc-keep-type-saved \n[doc-keep-type]
3291 .  nr doc-display-depth-saved \n[doc-display-depth]
3292 .  nr doc-is-compact-saved \n[doc-is-compact]
3294 .  nr doc-reg-dsgv 0
3295 .  while (\n[doc-reg-dsgv] <= \n[doc-display-depth]) \{\
3296 .    ds doc-display-type-stack\n[doc-reg-dsgv]-saved "\*[doc-display-type-stack\n[doc-reg-dsgv]]
3297 .    nr doc-display-indent-stack\n[doc-reg-dsgv]-saved \n[doc-display-indent-stack\n[doc-reg-dsgv]]
3298 .    nr doc-display-ad-stack\n[doc-reg-dsgv]-saved \n[doc-display-ad-stack\n[doc-reg-dsgv]]
3299 .    nr doc-display-fi-stack\n[doc-reg-dsgv]-saved \n[doc-display-fi-stack\n[doc-reg-dsgv]]
3300 .    nr doc-display-ft-stack\n[doc-reg-dsgv]-saved \n[doc-display-ft-stack\n[doc-reg-dsgv]]
3301 .    nr doc-display-ps-stack\n[doc-reg-dsgv]-saved \n[doc-display-ps-stack\n[doc-reg-dsgv]]
3302 .    nr doc-reg-dsgv +1
3303 .  \}
3305 .  nr doc-fontmode-depth-saved \n[doc-fontmode-depth]
3307 .  nr doc-reg-dsgv 1
3308 .  while (\n[doc-reg-dsgv] <= \n[doc-fontmode-depth]) \{\
3309 .    nr doc-fontmode-font-stack\n[doc-reg-dsgv]-saved \n[doc-fontmode-font-stack\n[doc-reg-dsgv]]
3310 .    nr doc-fontmode-size-stack\n[doc-reg-dsgv]-saved \n[doc-fontmode-size-stack\n[doc-reg-dsgv]]
3311 .    nr doc-reg-dsgv +1
3312 .  \}
3314 .  nr doc-list-depth-saved \n[doc-list-depth]
3316 .  nr doc-reg-dsgv 1
3317 .  while (\n[doc-reg-dsgv] <= \n[doc-list-depth]) \{\
3318 .    ds doc-list-type-stack\n[doc-reg-dsgv]-saved "\*[doc-list-type-stack\n[doc-reg-dsgv]]
3319 .    nr doc-list-have-indent-stack\n[doc-reg-dsgv]-saved \n[doc-list-have-indent-stack\n[doc-reg-dsgv]]
3320 .    nr doc-list-indent-stack\n[doc-reg-dsgv]-saved \n[doc-list-indent-stack\n[doc-reg-dsgv]]
3321 .    nr doc-compact-list-stack\n[doc-reg-dsgv]-saved \n[doc-compact-list-stack\n[doc-reg-dsgv]]
3322 .    ds doc-tag-prefix-stack\n[doc-reg-dsgv]-saved "\*[doc-tag-prefix-stack\n[doc-reg-dsgv]]
3323 .    ds doc-tag-width-stack\n[doc-reg-dsgv]-saved "\*[doc-tag-width-stack\n[doc-reg-dsgv]]
3324 .    nr doc-list-offset-stack\n[doc-reg-dsgv]-saved \n[doc-list-offset-stack\n[doc-reg-dsgv]]
3325 .    nr doc-enum-list-count-stack\n[doc-reg-dsgv]-saved \n[doc-enum-list-count-stack\n[doc-reg-dsgv]]
3326 .    nr doc-reg-dsgv +1
3327 .  \}
3329 .  ds doc-saved-Pa-font-saved "\*[doc-saved-Pa-font]
3330 .  nr doc-curr-type-saved \n[doc-curr-type]
3331 .  ds doc-curr-arg-saved "\*[doc-curr-arg]
3332 .  nr doc-diag-list-input-line-count-saved \n[doc-diag-list-input-line-count]
3333 .  nr doc-num-columns-saved \n[doc-num-columns]
3334 .  nr doc-column-indent-width-saved \n[doc-column-indent-width]
3335 .  nr doc-is-func-saved \n[doc-is-func]
3336 .  nr doc-have-old-func-saved \n[doc-have-old-func]
3337 .  nr doc-func-arg-count-saved \n[doc-func-arg-count]
3338 .  ds doc-func-arg-saved "\*[doc-func-arg]
3339 .  nr doc-num-func-args-saved \n[doc-num-func-args]
3340 .  nr doc-func-args-processed-saved \n[doc-func-args-processed]
3341 .  nr doc-have-func-saved \n[doc-have-func]
3342 .  nr doc-is-reference-saved \n[doc-is-reference]
3343 .  nr doc-reference-count-saved \n[doc-reference-count]
3344 .  nr doc-author-count-saved \n[doc-author-count]
3346 .  nr doc-reg-dsgv 0
3347 .  while (\n[doc-reg-dsgv] <= \n[doc-author-count]) \{\
3348 .    ds doc-author-name\n[doc-reg-dsgv]-saved "\*[doc-author-name\n[doc-reg-dsgv]]
3349 .    nr doc-reg-dsgv +1
3350 .  \}
3352 .  nr doc-book-count-saved \n[doc-book-count]
3353 .  ds doc-book-name-saved "\*[doc-book-name]
3354 .  nr doc-date-count-saved \n[doc-date-count]
3355 .  ds doc-date-saved "\*[doc-date]
3356 .  nr doc-publisher-count-saved \n[doc-publisher-count]
3357 .  ds doc-publisher-name-saved "\*[doc-publisher-name]
3358 .  nr doc-journal-count-saved \n[doc-journal-count]
3359 .  ds doc-journal-name-saved "\*[doc-journal-name]
3360 .  nr doc-issue-count-saved \n[doc-issue-count]
3361 .  ds doc-issue-name-saved "\*[doc-issue-name]
3362 .  nr doc-optional-count-saved \n[doc-optional-count]
3363 .  ds doc-optional-string-saved "\*[doc-optional-string]
3364 .  nr doc-page-number-count-saved \n[doc-page-number-count]
3365 .  ds doc-page-number-string-saved "\*[doc-page-number-string]
3366 .  nr doc-corporate-count-saved \n[doc-corporate-count]
3367 .  ds doc-corporate-name-saved "\*[doc-corporate-name]
3368 .  nr doc-report-count-saved \n[doc-report-count]
3369 .  ds doc-report-name-saved "\*[doc-report-name]
3370 .  nr doc-reference-title-count-saved \n[doc-reference-title-count]
3371 .  ds doc-reference-title-name-saved "\*[doc-reference-title-name]
3372 .  ds doc-reference-title-name-for-book-saved "\*[doc-reference-title-name-for-book]
3373 .  nr doc-volume-count-saved \n[doc-volume-count]
3374 .  ds doc-volume-name-saved "\*[doc-volume-name]
3375 .  nr doc-have-author-saved \n[doc-have-author]
3377 .  ds doc-document-title-saved "\*[doc-document-title]
3378 .  ds doc-volume-saved "\*[doc-volume]
3379 .  ds doc-section-saved "\*[doc-section]
3380 .  ds doc-operating-system-saved "\*[doc-operating-system]
3381 .  ds doc-date-string-saved "\*[doc-date-string]
3382 .  nr doc-header-space-saved \n[doc-header-space]
3383 .  nr doc-footer-space-saved \n[doc-footer-space]
3384 .  nr doc-display-vertical-saved \n[doc-display-vertical]
3385 .  ds doc-header-string-saved "\*[doc-header-string]
3386 .  nr doc-in-see-also-section-saved \n[doc-in-see-also-section]
3387 .  nr doc-in-files-section-saved \n[doc-in-files-section]
3388 .  nr doc-in-authors-section-saved \n[doc-in-authors-section]
3392 .\" NS doc-restore-global-vars macro
3393 .\" NS   restore all global variables
3394 .\" NS
3395 .\" NS local variables:
3396 .\" NS   doc-reg-drgv
3398 .de doc-restore-global-vars
3399 .  ds doc-macro-name "\*[doc-macro-name-saved]
3400 .  nr doc-arg-limit \n[doc-arg-limit-saved]
3401 .  nr doc-num-args \n[doc-num-args-saved]
3402 .  nr doc-arg-ptr \n[doc-arg-ptr-saved]
3404 .  nr doc-reg-drgv 1
3405 .  while (\n[doc-reg-drgv] <= \n[doc-arg-limit]) \{\
3406 .    ds doc-arg\n[doc-reg-drgv] "\*[doc-arg\n[doc-reg-drgv]-saved]
3407 .    nr doc-type\n[doc-reg-drgv] \n[doc-type\n[doc-reg-drgv]-saved]
3408 .    ds doc-space\n[doc-reg-drgv] "\*[doc-space\n[doc-reg-drgv]-saved]
3409 .    nr doc-reg-drgv +1
3410 .  \}
3412 .  nr doc-curr-font \n[doc-curr-font-saved]
3413 .  nr doc-curr-size \n[doc-curr-size-saved]
3414 .  nr doc-in-synopsis-section \n[doc-in-synopsis-section-saved]
3415 .  nr doc-indent-synopsis \n[doc-indent-synopsis-saved]
3416 .  nr doc-indent-synopsis-active \n[doc-indent-synopsis-active-saved]
3417 .  nr doc-have-decl \n[doc-have-decl-saved]
3418 .  nr doc-have-var \n[doc-have-var-saved]
3419 .  ds doc-command-name "\*[doc-command-name-saved]
3420 .  ds doc-quote-left "\*[doc-quote-left-saved]
3421 .  ds doc-quote-right "\*[doc-quote-right-saved]
3422 .  nr doc-nesting-level \n[doc-nesting-level-saved]
3423 .  nr doc-in-list \n[doc-in-list-saved]
3424 .  ds doc-space "\*[doc-space-saved]
3425 .  ds doc-saved-space "\*[doc-saved-space-saved]
3426 .  nr doc-space-mode \n[doc-space-mode-saved]
3427 .  nr doc-have-space \n[doc-have-space-saved]
3428 .  nr doc-have-slot \n[doc-have-slot-saved]
3429 .  nr doc-keep-type \n[doc-keep-type-saved]
3430 .  nr doc-display-depth \n[doc-display-depth-saved]
3431 .  nr doc-is-compact \n[doc-is-compact-saved]
3433 .  nr doc-reg-drgv 0
3434 .  while (\n[doc-reg-drgv] <= \n[doc-display-depth]) \{\
3435 .    ds doc-display-type-stack\n[doc-reg-drgv] "\*[doc-display-type-stack\n[doc-reg-drgv]-saved]
3436 .    nr doc-display-indent-stack\n[doc-reg-drgv] \n[doc-display-indent-stack\n[doc-reg-drgv]-saved]
3437 .    nr doc-display-ad-stack\n[doc-reg-drgv] \n[doc-display-ad-stack\n[doc-reg-drgv]-saved]
3438 .    nr doc-display-fi-stack\n[doc-reg-drgv] \n[doc-display-fi-stack\n[doc-reg-drgv]-saved]
3439 .    nr doc-display-ft-stack\n[doc-reg-drgv] \n[doc-display-ft-stack\n[doc-reg-drgv]-saved]
3440 .    nr doc-display-ps-stack\n[doc-reg-drgv] \n[doc-display-ps-stack\n[doc-reg-drgv]-saved]
3441 .    nr doc-reg-drgv +1
3442 .  \}
3444 .  nr doc-fontmode-depth \n[doc-fontmode-depth-saved]
3446 .  nr doc-reg-drgv 1
3447 .  while (\n[doc-reg-drgv] <= \n[doc-fontmode-depth]) \{\
3448 .    nr doc-fontmode-font-stack\n[doc-reg-drgv] \n[doc-fontmode-font-stack\n[doc-reg-drgv]]-saved
3449 .    nr doc-fontmode-size-stack\n[doc-reg-drgv] \n[doc-fontmode-size-stack\n[doc-reg-drgv]]-saved
3450 .    nr doc-reg-drgv +1
3451 .  \}
3453 .  nr doc-list-depth \n[doc-list-depth-saved]
3455 .  nr doc-reg-drgv 1
3456 .  while (\n[doc-reg-drgv] <= \n[doc-list-depth]) \{\
3457 .    ds doc-list-type-stack\n[doc-reg-drgv] "\*[doc-list-type-stack\n[doc-reg-drgv]-saved]
3458 .    nr doc-list-have-indent-stack\n[doc-reg-drgv] \n[doc-list-have-indent-stack\n[doc-reg-drgv]-saved]
3459 .    nr doc-list-indent-stack\n[doc-reg-drgv] \n[doc-list-indent-stack\n[doc-reg-drgv]-saved]
3460 .    nr doc-compact-list-stack\n[doc-reg-drgv] \n[doc-compact-list-stack\n[doc-reg-drgv]-saved]
3461 .    ds doc-tag-prefix-stack\n[doc-reg-drgv] "\*[doc-tag-prefix-stack\n[doc-reg-drgv]-saved]
3462 .    ds doc-tag-width-stack\n[doc-reg-drgv] "\*[doc-tag-width-stack\n[doc-reg-drgv]-saved]
3463 .    nr doc-list-offset-stack\n[doc-reg-drgv] \n[doc-list-offset-stack\n[doc-reg-drgv]-saved]
3464 .    nr doc-enum-list-count-stack\n[doc-reg-drgv] \n[doc-enum-list-count-stack\n[doc-reg-drgv]-saved]
3465 .    nr doc-reg-drgv +1
3466 .  \}
3468 .  ds doc-saved-Pa-font "\*[doc-saved-Pa-font-saved]
3469 .  nr doc-curr-type \n[doc-curr-type-saved]
3470 .  ds doc-curr-arg "\*[doc-curr-arg-saved]
3471 .  nr doc-diag-list-input-line-count \n[doc-diag-list-input-line-count-saved]
3472 .  nr doc-num-columns \n[doc-num-columns-saved]
3473 .  nr doc-column-indent-width \n[doc-column-indent-width-saved]
3474 .  nr doc-is-func \n[doc-is-func-saved]
3475 .  nr doc-have-old-func \n[doc-have-old-func-saved]
3476 .  nr doc-func-arg-count \n[doc-func-arg-count-saved]
3477 .  ds doc-func-arg "\*[doc-func-arg-saved]
3478 .  nr doc-num-func-args \n[doc-num-func-args-saved]
3479 .  nr doc-func-args-processed \n[doc-func-args-processed-saved]
3480 .  nr doc-have-func \n[doc-have-func-saved]
3481 .  nr doc-is-reference \n[doc-is-reference-saved]
3482 .  nr doc-reference-count \n[doc-reference-count-saved]
3483 .  nr doc-author-count \n[doc-author-count-saved]
3485 .  nr doc-reg-drgv 0
3486 .  while (\n[doc-reg-drgv] <= \n[doc-author-count]) \{\
3487 .    ds doc-author-name\n[doc-reg-drgv] "\*[doc-author-name\n[doc-reg-drgv]-saved]
3488 .    nr doc-reg-drgv +1
3489 .  \}
3491 .  nr doc-book-count \n[doc-book-count-saved]
3492 .  ds doc-book-name "\*[doc-book-name-saved]
3493 .  nr doc-date-count \n[doc-date-count-saved]
3494 .  ds doc-date "\*[doc-date-saved]
3495 .  nr doc-publisher-count \n[doc-publisher-count-saved]
3496 .  ds doc-publisher-name "\*[doc-publisher-name-saved]
3497 .  nr doc-journal-count \n[doc-journal-count-saved]
3498 .  ds doc-journal-name "\*[doc-journal-name-saved]
3499 .  nr doc-issue-count \n[doc-issue-count-saved]
3500 .  ds doc-issue-name "\*[doc-issue-name-saved]
3501 .  nr doc-optional-count \n[doc-optional-count-saved]
3502 .  ds doc-optional-string "\*[doc-optional-string-saved]
3503 .  nr doc-page-number-count \n[doc-page-number-count-saved]
3504 .  ds doc-page-number-string "\*[doc-page-number-string-saved]
3505 .  nr doc-corporate-count \n[doc-corporate-count-saved]
3506 .  ds doc-corporate-name "\*[doc-corporate-name-saved]
3507 .  nr doc-report-count \n[doc-report-count-saved]
3508 .  ds doc-report-name "\*[doc-report-name-saved]
3509 .  nr doc-reference-title-count \n[doc-reference-title-count-saved]
3510 .  ds doc-reference-title-name "\*[doc-reference-title-name-saved]
3511 .  ds doc-reference-title-name-for-book "\*[doc-reference-title-name-for-book-saved]
3512 .  nr doc-volume-count \n[doc-volume-count-saved]
3513 .  ds doc-volume-name "\*[doc-volume-name-saved]
3514 .  nr doc-have-author \n[doc-have-author-saved]
3516 .  ds doc-document-title "\*[doc-document-title-saved]
3517 .  ds doc-volume "\*[doc-volume-saved]
3518 .  ds doc-section "\*[doc-section-saved]
3519 .  ds doc-operating-system "\*[doc-operating-system-saved]
3520 .  ds doc-date-string "\*[doc-date-string-saved]
3521 .  nr doc-header-space \n[doc-header-space-saved]
3522 .  nr doc-footer-space \n[doc-footer-space-saved]
3523 .  nr doc-display-vertical \n[doc-display-vertical-saved]
3524 .  ds doc-header-string "\*[doc-header-string-saved]
3525 .  nr doc-in-see-also-section \n[doc-in-see-also-section-saved]
3526 .  nr doc-in-files-section \n[doc-in-files-section-saved]
3527 .  nr doc-in-authors-section \n[doc-in-authors-section-saved]
3531 .\" NS El user macro
3532 .\" NS   end list
3533 .\" NS
3534 .\" NS modifies:
3535 .\" NS   doc-list-depth
3536 .\" NS   doc-macro-name
3537 .\" NS
3538 .\" NS local variables:
3539 .\" NS   doc-str-El
3540 .\" NS
3541 .\" NS width register `El' set in doc-common
3543 .de El
3544 .  if \n[.$] \{\
3545 .    tm Usage: .El (does not take arguments) (#\n[.c])
3546 .    return
3547 .  \}
3549 .  ds doc-macro-name El
3550 .  ds doc-str-El \*[doc-list-type-stack\n[doc-list-depth]]
3552 .  ie        "\*[doc-str-El]"diag-list" \
3553 .    doc-end-list 0
3554 .  el \{ .ie "\*[doc-str-El]"column-list" \
3555 .    doc-end-column-list
3556 .  el \{ .ie "\*[doc-str-El]"item-list" \
3557 .    doc-end-list 0
3558 .  el \{ .ie "\*[doc-str-El]"ohang-list" \
3559 .    doc-end-list 0
3560 .  el \{ .ie "\*[doc-str-El]"inset-list" \
3561 .    doc-end-list 0
3562 .  el \
3563 .    doc-end-list 1
3564 .  \}\}\}\}
3566 .  br
3570 .\" NS doc-saved-Pa-font global string
3571 .\" NS   saved doc-Pa-font string for section FILES (no underline if
3572 .\" NS   nroff)
3574 .ds doc-saved-Pa-font
3577 .\" NS doc-curr-type global register
3578 .\" NS   current argument type
3580 .nr doc-curr-type 0
3583 .\" NS doc-curr-arg global string
3584 .\" NS   current argument
3586 .ds doc-curr-arg
3589 .\" NS doc-item-boxXXX global box
3590 .\" NS   item boxes associated list depth
3591 .\" NS
3592 .\" NS limit:
3593 .\" NS   doc-list-depth
3596 .\" NS It user macro
3597 .\" NS   list item
3598 .\" NS
3599 .\" NS modifies:
3600 .\" NS   doc-arg-ptr
3601 .\" NS   doc-argXXX
3602 .\" NS   doc-curr-arg
3603 .\" NS   doc-curr-type
3604 .\" NS   doc-in-list
3605 .\" NS   doc-macro-name
3606 .\" NS   doc-num-args
3607 .\" NS   doc-saved-Pa-font
3608 .\" NS
3609 .\" NS local variables:
3610 .\" NS   doc-reg-It
3611 .\" NS   doc-str-It
3612 .\" NS   doc-XXX-list-type
3613 .\" NS
3614 .\" NS width register `It' set in doc-common
3616 .nr doc-bullet-list-type 1
3617 .nr doc-column-list-type 0
3618 .nr doc-dash-list-type 1
3619 .nr doc-diag-list-type 0
3620 .nr doc-enum-list-type 1
3621 .nr doc-hang-list-type 2
3622 .nr doc-inset-list-type 2
3623 .nr doc-item-list-type 1
3624 .nr doc-ohang-list-type 2
3625 .nr doc-tag-list-type 2
3627 .de It
3628 .  ds doc-str-It \*[doc-list-type-stack\n[doc-list-depth]]
3630 .  if "\*[doc-str-It]"" \
3631 .    tm mdoc error: .It without preceding .Bl (#\n[.c])
3633 .  if \n[doc-nesting-level] \{\
3634 .    tmc "mdoc error: .It found in enclosing (e.g. .Ac ... .It ... .Ao)
3635 .    tm1 " (#\n[.c])
3636 .  \}
3638 .  br
3639 .  if !\n[cR] \
3640 .    ne 3v
3642 .  if \n[.$] \{\
3643 .    ds doc-macro-name It
3645 .    \" fill argument vector
3646 .    nr doc-reg-It 1
3647 .    while (\n[doc-reg-It] <= \n[.$]) \{\
3648 .      ds doc-arg\n[doc-reg-It] "\$[\n[doc-reg-It]]
3649 .      nr doc-reg-It +1
3650 .    \}
3652 .    nr doc-num-args \n[.$]
3653 .    nr doc-arg-ptr 0
3654 .  \}
3656 .  nr doc-reg-It \n[doc-\*[doc-str-It]-type]
3658 .  if \n[doc-reg-It] \{\
3659 .    \" start item box
3660 .    box doc-item-box\n[doc-list-depth]
3661 .    ev doc-item-env\n[doc-list-depth]
3662 .    evc 0
3663 .    in 0
3664 .    nf
3665 .  \}
3667 .  ie (\n[doc-reg-It] == 1) \{\
3668 .    if \n[.$] \{\
3669 .      tm1 "mdoc warning: .It macros in lists of type `\*[doc-str-It]'
3670 .      tm1 "              don't take arguments (#\n[.c])
3671 .  \}\}
3672 .  el \{\
3673 .    ie \n[.$] \{\
3674 .      if (\n[doc-reg-It] == 2) \{\
3675 .        \" handle list types with arguments
3676 .        doc-parse-arg-vector
3678 .        nr doc-in-list 1
3679 .        nr doc-arg-ptr 1
3680 .        nr doc-curr-type \n[doc-type1]
3681 .        ds doc-curr-arg "\*[doc-arg1]
3683 .        if \n[doc-in-files-section] \{\
3684 .          ds doc-saved-Pa-font "\*[doc-Pa-font]
3685 .          if n \
3686 .            ds doc-Pa-font "\*[doc-No-font]
3687 .        \}
3689 .        ie (\n[doc-type1] == 1) \
3690 .          \*[doc-arg1]
3691 .        el \{\
3692 .          nr doc-arg-ptr 1
3693 .          doc-print-recursive
3694 .    \}\}\}
3695 .    el \{\
3696 .      tm1 "mdoc warning: .It macros in lists of type `\*[doc-str-It]'
3697 .      tm1 "              require arguments (#\n[.c])
3698 .    \}
3699 .  \}
3701 .  \" the previous call of `.doc-print-recursive' can contain calls to
3702 .  \" opening macros like `.Ao'; we then defer the call of `doc-xxx-list'
3703 .  if !\n[doc-nesting-level] \
3704 .    doc-\*[doc-str-It]
3708 .\" NS doc-inset-list macro
3709 .\" NS   .It item of list-type inset
3710 .\" NS
3711 .\" NS modifies:
3712 .\" NS   doc-in-list
3714 .de doc-inset-list
3715 .  \" finish item box
3716 .  br
3717 .  ev
3718 .  box
3719 .  unformat doc-item-box\n[doc-list-depth]
3721 .  doc-set-vertical-and-indent 0
3722 .  br
3724 .  nh
3725 .  doc-item-box\n[doc-list-depth]
3727 .  if \n[doc-in-files-section] \
3728 .    if n \
3729 .      ds doc-Pa-font "\*[doc-saved-Pa-font]
3731 .  nr doc-in-list 0
3732 .  doc-reset-args
3736 .\" NS doc-hang-list macro
3737 .\" NS   .It item of list-type hanging tag (as opposed to tagged)
3738 .\" NS
3739 .\" NS modifies:
3740 .\" NS   doc-have-space
3741 .\" NS   doc-in-list
3742 .\" NS
3743 .\" NS local variables:
3744 .\" NS   doc-reg-dhl
3745 .\" NS   doc-reg-dhl1
3747 .de doc-hang-list
3748 .  \" finish item box
3749 .  br
3750 .  ev
3751 .  box
3752 .  unformat doc-item-box\n[doc-list-depth]
3754 .  doc-set-vertical-and-indent 1
3755 .  nr doc-reg-dhl (\n[doc-list-indent-stack\n[doc-list-depth]]u + \n[doc-digit-width]u)
3756 .  ti -\n[doc-reg-dhl]u
3758 .  nh
3759 .  ie (\n[dl]u > \n[doc-list-indent-stack\n[doc-list-depth]]u) \
3760 .    doc-item-box\n[doc-list-depth]
3761 .  el \{\
3762 .    chop doc-item-box\n[doc-list-depth]
3763 .    nr doc-reg-dhl1 \n[.k]u
3764 .    nop \*[doc-item-box\n[doc-list-depth]]\c
3765 .    nop \h'|(\n[doc-reg-dhl1]u - \n[.k]u + \n[doc-reg-dhl]u)'\c
3766 .    nr doc-have-space 1
3767 .  \}
3769 .  if \n[doc-in-files-section] \
3770 .    if n \
3771 .      ds doc-Pa-font "\*[doc-saved-Pa-font]
3773 .  nr doc-in-list 0
3774 .  doc-reset-args
3778 .\" NS doc-ohang-list macro
3779 .\" NS   .It item of list-type overhanging tag
3780 .\" NS
3781 .\" NS modifies:
3782 .\" NS   doc-in-list
3784 .de doc-ohang-list
3785 .  \" finish item box
3786 .  br
3787 .  ev
3788 .  box
3789 .  unformat doc-item-box\n[doc-list-depth]
3791 .  doc-set-vertical-and-indent 0
3792 .  nh
3793 .  doc-item-box\n[doc-list-depth]
3794 .  br
3796 .  if \n[doc-in-files-section] \
3797 .    if n \
3798 .      ds doc-Pa-font "\*[doc-saved-Pa-font]
3800 .  nr doc-in-list 0
3801 .  doc-reset-args
3805 .\" NS doc-item-list macro
3806 .\" NS   .It item of list-type [empty tag]
3808 .de doc-item-list
3809 .  \" finish (dummy) item box
3810 .  br
3811 .  ev
3812 .  box
3814 .  doc-set-vertical-and-indent 0
3815 .  br
3817 .  doc-reset-args
3821 .\" NS doc-enum-list-count-stackXXX global register
3822 .\" NS   stack of current enum count values
3823 .\" NS
3824 .\" NS limit:
3825 .\" NS   doc-list-depth
3827 .nr doc-enum-list-count-stack1 0
3830 .\" NS doc-enum-list macro
3831 .\" NS   enumerated list
3832 .\" NS
3833 .\" NS modifies:
3834 .\" NS   doc-enum-list-count-stackXXX
3835 .\" NS   doc-in-list
3837 .de doc-enum-list
3838 .  nr doc-in-list 1
3839 .  nr doc-enum-list-count-stack\n[doc-list-depth] +1
3840 \# XXX
3841 \#.ll \n[doc-list-indent-stack\n[doc-list-depth]]u
3842 \#.rj
3843 .  nop \*[doc-tag-prefix-stack\n[doc-list-depth]]\c
3844 .  nop \n[doc-enum-list-count-stack\n[doc-list-depth]].\&
3845 .  doc-do-list
3849 .\" NS doc-bullet-list macro
3850 .\" NS   bullet paragraph list
3851 .\" NS
3852 .\" NS modifies:
3853 .\" NS   doc-in-list
3855 .de doc-bullet-list
3856 .  nr doc-in-list 1
3857 .  nop \)\*[doc-Sy-font]\[bu]\f[]
3858 .  doc-do-list
3862 .\" NS doc-dash-list macro
3863 .\" NS   hyphen paragraph list (sub bullet list)
3864 .\" NS
3865 .\" NS modifies:
3866 .\" NS   doc-in-list
3868 .de doc-dash-list
3869 .  nr doc-in-list 1
3870 .  nop \)\*[doc-Sy-font]\-\f[]
3871 .  doc-do-list
3875 .\" NS doc-do-list macro
3876 .\" NS   .It item of list-type enum/bullet/hyphen
3878 .als doc-do-list doc-hang-list
3881 .\" NS doc-diag-list-input-line-count global register
3882 .\" NS   saved line number to be checked in next diag-list item
3884 .nr doc-diag-list-input-line-count 0
3887 .\" NS doc-diag-list macro
3888 .\" NS   .It item of list-type diagnostic-message
3889 .\" NS
3890 .\" NS modifies:
3891 .\" NS   doc-curr-font
3892 .\" NS   doc-curr-size
3893 .\" NS   doc-diag-list-input-line-count
3895 .de doc-diag-list
3896 .  nr doc-curr-font \n[.f]
3897 .  nr doc-curr-size \n[.ps]
3899 .  ie ((\n[.c] - \n[doc-diag-list-input-line-count]) > 1) \{\
3900 .    ie !\n[doc-compact-list-stack\n[doc-list-depth]] \
3901 .      doc-paragraph
3902 .    el \
3903 .      br
3904 .  \}
3905 .  el \
3906 .    br
3907 .  nr doc-diag-list-input-line-count \n[.c]
3909 .  nh
3910 .  nop \*[doc-Sy-font]\c
3911 .  if \n[doc-num-args] \
3912 .    doc-remaining-args
3913 .  nop \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]\*[doc-hard-space]\c
3915 .  doc-print-and-reset
3919 .\" NS doc-tag-list macro
3920 .\" NS   .It item of list-type `tag'
3921 .\" NS
3922 .\" NS modifies:
3923 .\" NS   doc-have-space
3924 .\" NS   doc-in-list
3925 .\" NS
3926 .\" NS local variables:
3927 .\" NS   doc-box-dtl
3928 .\" NS   doc-reg-dtl
3929 .\" NS   doc-reg-dtl1
3931 .de doc-tag-list
3932 .  \" finish item box
3933 .  br
3934 .  ev
3935 .  box
3936 .  unformat doc-item-box\n[doc-list-depth]
3938 .  \" we use a box without `.nf' to compute the tag width (via `dl' register)
3939 .  box doc-box-dtl
3940 .  ev doc-env-dtl
3941 .  evc 0
3942 .  fi
3943 .  ad 0
3944 .  in 0
3945 .  doc-item-box\n[doc-list-depth]
3946 .  br
3947 .  ev
3948 .  box
3950 .  if !"TagwidtH"\*[doc-tag-width-stack\n[doc-list-depth]]" \{\
3951 .    if !\n[doc-list-have-indent-stack\n[doc-list-depth]] \{\
3952 .      in -(\n[doc-list-indent-stack\n[doc-list-depth]]u + \n[doc-digit-width]u)
3953 .      nr doc-list-have-indent-stack\n[doc-list-depth] 1
3954 .    \}
3955 .    doc-get-tag-width
3956 .  \}
3957 .  doc-set-vertical-and-indent 1
3958 .  nr doc-reg-dtl (\n[doc-list-indent-stack\n[doc-list-depth]]u + \n[doc-digit-width]u)
3959 .  ti -\n[doc-reg-dtl]u
3961 .  nh
3962 .  doc-item-box\n[doc-list-depth]
3963 .  ie (\n[dl]u > \n[doc-list-indent-stack\n[doc-list-depth]]u) \
3964 .    br
3965 .  el \{\
3966 .    \" format the tag separately to prevent stretching of spaces
3967 .    vpt 0
3968 .    br
3969 .    sp -1
3970 .    vpt 1
3971 .    nop \&\c
3972 .    nr doc-have-space 1
3973 .  \}
3975 .  if \n[doc-in-files-section] \
3976 .    if n \
3977 .      ds doc-Pa-font "\*[doc-saved-Pa-font]
3979 .  nr doc-in-list 0
3980 .  doc-reset-args
3984 .\" NS doc-get-tag-width macro
3985 .\" NS   resolve unknown tag width (`tag' list-type only)
3986 .\" NS
3987 .\" NS modifies:
3988 .\" NS   doc-list-indent-stackXXX
3989 .\" NS   doc-tag-width-stackXXX
3990 .\" NS
3991 .\" NS requires:
3992 .\" NS   doc-curr-arg
3993 .\" NS   doc-curr-type
3995 .de doc-get-tag-width
3996 .  ie (\n[doc-curr-type] == 1) \{\
3997 .    ds doc-tag-width-stack\n[doc-list-depth] \*[doc-curr-arg]
3998 .    nr doc-list-indent-stack\n[doc-list-depth] \n[\*[doc-curr-arg]]
3999 .  \}
4000 .  el \{\
4001 .    ds doc-tag-width-stack\n[doc-list-depth] No
4002 .    nr doc-list-indent-stack\n[doc-list-depth] \n[No]
4003 .  \}
4007 .\" NS doc-set-vertical-and-indent macro
4008 .\" NS   set up vertical spacing (if not compact) and indentation (with
4009 .\" NS   offset if argument is non-zero)
4010 .\" NS
4011 .\" NS modifies:
4012 .\" NS   doc-list-have-indent-stackXXX
4014 .de doc-set-vertical-and-indent
4015 .  if !\n[doc-compact-list-stack\n[doc-list-depth]] \
4016 .    sp \n[doc-display-vertical]u
4018 .  if \n[doc-list-have-indent-stack\n[doc-list-depth]] \{\
4019 .    nr doc-list-have-indent-stack\n[doc-list-depth] 0
4020 .    if \$1 \
4021 .      in +(\n[doc-list-indent-stack\n[doc-list-depth]]u + \n[doc-digit-width]u)
4022 .  \}
4024 .  if !\n[cR] \
4025 .    ne 2v
4029 .\" NS doc-list-depth global register
4030 .\" NS   list type stack counter
4032 .nr doc-list-depth 0
4035 .\" NS doc-num-columns global register
4036 .\" NS   number of columns
4038 .nr doc-num-columns 0
4041 .\" NS doc-compact-list-stackXXX global register (bool)
4042 .\" NS   stack of flags to indicate whether a particular list is compact
4043 .\" NS
4044 .\" NS limit:
4045 .\" NS   doc-list-depth
4047 .nr doc-compact-list-stack1 0
4050 .\" NS doc-tag-prefix-stackXXX global string
4051 .\" NS   stack of tag prefixes (currently used for -nested -enum lists)
4052 .\" NS
4053 .\" NS limit:
4054 .\" NS   doc-list-depth
4056 .ds doc-tag-prefix-stack1
4059 .\" NS doc-tag-width-stackXXX global string
4060 .\" NS   stack of strings indicating how to set up current element of
4061 .\" NS   doc-list-indent-stackXXX -- if set to TagwidtH, user has set it
4062 .\" NS   directly; if it is a macro name, use the macro's width value;
4063 .\" NS   otherwise, `doc-get-tag-width' uses width value of `No'.
4064 .\" NS
4065 .\" NS limit:
4066 .\" NS   doc-list-depth
4068 .ds doc-tag-width-stack0
4069 .ds doc-tag-width-stack1
4072 .\" NS doc-list-offset-stackXXX global register
4073 .\" NS   stack of list offsets
4074 .\" NS
4075 .\" NS limit:
4076 .\" NS   doc-list-depth
4078 .nr doc-list-offset-stack1 0
4081 .\" NS doc-end-list macro
4082 .\" NS   list end function; resets indentation (and offset if argument is
4083 .\" NS   non-zero)
4084 .\" NS
4085 .\" NS modifies:
4086 .\" NS   doc-list-depth
4087 .\" NS   doc-list-offset-stackXXX
4089 .de doc-end-list
4090 .  if \$1 \
4091 '    in -(\n[doc-list-indent-stack\n[doc-list-depth]]u + \n[doc-digit-width]u)
4093 '  in -\n[doc-list-offset-stack\n[doc-list-depth]]u
4095 .  if (\n[doc-list-depth] <= 0) \
4096 .    tm mdoc warning: extraneous .El call (#\n[.c])
4098 .  doc-decrement-list-stack
4099 .  nr doc-list-depth -1
4103 .\" NS doc-increment-list-stack macro
4104 .\" NS   set up next block for list
4105 .\" NS
4106 .\" NS modifies:
4107 .\" NS   doc-compact-list-stackXXX
4108 .\" NS   doc-list-have-indent-stackXXX
4109 .\" NS   doc-list-indent-stackXXX
4110 .\" NS   doc-list-offset-stackXXX
4111 .\" NS   doc-list-type-stackXXX
4112 .\" NS   doc-tag-prefix-stackXXX
4113 .\" NS   doc-tag-width-stackXXX
4114 .\" NS   doc-enum-list-count-stackXXX
4115 .\" NS
4116 .\" NS local variables:
4117 .\" NS   doc-reg-dils
4119 .de doc-increment-list-stack
4120 .  nr doc-reg-dils (\n[doc-list-depth] + 1)
4121 .  nr doc-list-have-indent-stack\n[doc-reg-dils] 0
4122 .  nr doc-list-indent-stack\n[doc-reg-dils] 0
4123 .  nr doc-list-offset-stack\n[doc-reg-dils] 0
4124 .  ds doc-tag-prefix-stack\n[doc-reg-dils]
4125 .  ds doc-tag-width-stack\n[doc-reg-dils] \*[doc-tag-width-stack\n[doc-list-depth]]
4126 .  ds doc-list-type-stack\n[doc-reg-dils]
4127 .  nr doc-compact-list-stack\n[doc-reg-dils] 0
4128 .  nr doc-enum-list-count-stack\n[doc-reg-dils] 0
4132 .\" NS doc-decrement-list-stack macro
4133 .\" NS   decrement stack
4134 .\" NS
4135 .\" NS modifies:
4136 .\" NS   doc-compact-list-stackXXX
4137 .\" NS   doc-list-have-indent-stackXXX
4138 .\" NS   doc-list-indent-stackXXX
4139 .\" NS   doc-list-offset-stackXXX
4140 .\" NS   doc-list-type-stackXXX
4141 .\" NS   doc-tag-prefix-stackXXX
4142 .\" NS   doc-tag-width-stackXXX
4143 .\" NS   doc-enum-list-count-stackXXX
4145 .de doc-decrement-list-stack
4146 .  ds doc-list-type-stack\n[doc-list-depth]
4147 .  nr doc-list-have-indent-stack\n[doc-list-depth] 0
4148 .  nr doc-list-indent-stack\n[doc-list-depth] 0
4149 .  nr doc-list-offset-stack\n[doc-list-depth] 0
4150 .  ds doc-tag-prefix-stack\n[doc-list-depth]
4151 .  ds doc-tag-width-stack\n[doc-list-depth]
4152 .  nr doc-compact-list-stack\n[doc-list-depth] 0
4153 .  nr doc-enum-list-count-stack\n[doc-list-depth] 0
4157 .\" NS Xr user macro
4158 .\" NS   cross reference (for man pages only)
4159 .\" NS
4160 .\" NS modifies:
4161 .\" NS   doc-arg-ptr
4162 .\" NS   doc-macro-name
4163 .\" NS
4164 .\" NS local variables:
4165 .\" NS   doc-reg-Xr
4166 .\" NS
4167 .\" NS width register `Xr' set in doc-common
4169 .de Xr
4170 .  if !\n[doc-arg-limit] \{\
4171 .    ie \n[.$] \{\
4172 .      ds doc-macro-name Xr
4173 .      doc-parse-args \$@
4174 .    \}
4175 .    el \
4176 .      doc-Xr-usage
4177 .  \}
4179 .  if !\n[doc-arg-limit] \
4180 .    return
4182 .  nr doc-arg-ptr +1
4183 .  doc-print-prefixes
4184 .  ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
4185 .    \" first argument must be a string
4186 .    ie (\n[doc-type\n[doc-arg-ptr]] == 2) \{\
4187 .      nr doc-curr-font \n[.f]
4188 .      nr doc-curr-size \n[.ps]
4189 .      ds doc-arg\n[doc-arg-ptr] \*[doc-Xr-font]\*[doc-arg\n[doc-arg-ptr]]\f[]\s[0]
4191 .      if (\n[doc-arg-limit] > \n[doc-arg-ptr]) \{\
4192 .        nr doc-reg-Xr (\n[doc-arg-ptr] + 1)
4193 .        \" modify second argument if it is a string and
4194 .        \" remove space inbetween
4195 .        if (\n[doc-type\n[doc-reg-Xr]] == 2) \{\
4196 .          ds doc-arg\n[doc-reg-Xr] \*[lp]\*[doc-arg\n[doc-reg-Xr]]\*[rp]
4197 .          ds doc-space\n[doc-arg-ptr]
4198 .        \}
4199 .      \}
4200 .      doc-print-recursive
4201 .    \}
4202 .    el \
4203 .      doc-Xr-usage
4204 .  \}
4205 .  el \
4206 .    doc-Xr-usage
4210 .\" NS doc-Xr-usage macro
4212 .de doc-Xr-usage
4213 .  tm Usage: .Xr manpage_name [section#] ... (#\n[.c])
4214 .  doc-reset-args
4218 .\" NS Sx user macro
4219 .\" NS   cross section reference
4220 .\" NS
4221 .\" NS width register `Sx' set in doc-common
4223 .als Sx doc-generic-macro
4224 .ds doc-Sx-usage section_header
4227 .\" NS doc-end-column-list macro
4228 .\" NS   column-list end-list
4229 .\" NS
4230 .\" NS modifies:
4231 .\" NS   doc-list-depth
4233 .de doc-end-column-list
4234 .  linetabs 0
4235 '  in -(\n[doc-list-offset-stack\n[doc-list-depth]]u + \n[doc-list-indent-stack\n[doc-list-depth]]u)
4236 .  ta T .5i
4237 .  fi
4238 .  doc-decrement-list-stack
4239 .  nr doc-list-depth -1
4243 .\" NS doc-column-indent-width global register
4244 .\" NS   holds the indent width for a column list
4246 .nr doc-column-indent-width 0
4249 .\" NS doc-set-column-tab macro
4250 .\" NS   establish tabs for list-type column: `.doc-set-column-tab num_cols'
4251 .\" NS
4252 .\" NS modifies:
4253 .\" NS   doc-column-indent-width
4254 .\" NS
4255 .\" NS local variables:
4256 .\" NS   doc-reg-dsct
4257 .\" NS   doc-str-dsct
4258 .\" NS   doc-str-dsct1
4260 .de doc-set-column-tab
4261 .  ds doc-str-dsct
4262 .  nr doc-reg-dsct 1
4263 .  nr doc-column-indent-width 0
4265 .  ie (\$1 < 5) \
4266 .    ds doc-str-dsct1 "    \"
4267 .  el \{\
4268 .    ie (\$1 == 5) \
4269 .      ds doc-str-dsct1 "   \"
4270 .    el \{\
4271 .      \" XXX: this is packed abnormally close -- intercolumn width
4272 .      \"      should be configurable
4273 .      ds doc-str-dsct1 " \"
4274 .  \}\}
4276 .  while (\n[doc-reg-dsct] <= \$1) \{\
4277 .    as doc-str-dsct " +\w\a\*[doc-arg\n[doc-reg-dsct]]\*[doc-str-dsct1]\au
4278 .    nr doc-column-indent-width +\w\a\*[doc-arg\n[doc-reg-dsct]]\*[doc-str-dsct1]\au
4279 .    nr doc-reg-dsct +1
4280 .  \}
4282 .  ta \*[doc-str-dsct]
4283 '  in +\n[doc-column-indent-width]u
4287 .\" NS doc-column-list macro
4288 .\" NS   column items
4289 .\" NS
4290 .\" NS modifies:
4291 .\" NS   doc-arg-ptr
4292 .\" NS   doc-list-indent-stackXXX
4293 .\" NS   doc-spaceXXX
4294 .\" NS
4295 .\" NS local variables:
4296 .\" NS   doc-reg-dcl
4298 .de doc-column-list
4299 .  if \n[doc-num-args] \
4300 .    doc-parse-arg-vector
4301 .  nr doc-arg-ptr +1
4303 .  if (\n[doc-arg-limit] < \n[doc-arg-ptr]) \{\
4304 .    tm Usage: .It column_string [Ta [column_string ...] ] (#\n[.c])
4305 .    return
4306 .  \}
4308 .  if "\*[doc-arg\n[doc-arg-ptr]]"Ta" \{\
4309 .    nr doc-reg-dcl (\n[doc-arg-ptr] - 1)
4310 .    ds doc-space\n[doc-reg-dcl]
4311 .  \}
4313 .  if !\n[doc-list-indent-stack\n[doc-list-depth]] \
4314 .    nr doc-list-indent-stack\n[doc-list-depth] \n[doc-column-indent-width]u
4315 .  if !\n[.u] \{\
4316 .    fi
4317 .    in +\n[doc-column-indent-width]u
4318 .  \}
4319 .  ti -\n[doc-column-indent-width]u
4321 .  doc-do-\n[doc-type\n[doc-arg-ptr]]
4325 .\" NS Ta user macro
4326 .\" NS   append tab (\t)
4327 .\" NS
4328 .\" NS modifies:
4329 .\" NS   doc-arg-ptr
4330 .\" NS
4331 .\" NS width register `Ta' set in doc-common
4333 .de Ta
4334 .  ie \n[doc-arg-limit] \{\
4335 .    nr doc-arg-ptr +1
4336 .    nop \*[doc-tab]\c
4337 .    ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \
4338 .      doc-do-\n[doc-type\n[doc-arg-ptr]]
4339 .    el \
4340 .      doc-reset-args
4341 .  \}
4342 .  el \{\
4343 .    tm1 "Usage: Ta must follow column entry: e.g.
4344 .    tm1 "         .It column_string [Ta [column_string ...]] (#\n[.c])
4345 .  \}
4349 .\" NS Dl user macro
4350 .\" NS   display (one line) literal
4351 .\" NS
4352 .\" NS   this function uses the `Li' font
4353 .\" NS
4354 .\" NS modifies:
4355 .\" NS   doc-arg-ptr
4356 .\" NS   doc-curr-font
4357 .\" NS   doc-curr-size
4358 .\" NS   doc-macro-name
4359 .\" NS
4360 .\" NS width register `Dl' set in doc-common
4362 .de Dl
4363 .  ta T .5i
4364 .  in +\n[doc-display-indent]u
4366 .  ie \n[doc-arg-limit] \{\
4367 .    tm Usage: .Dl not callable by other macros (#\n[.c])
4368 .    doc-reset-args
4369 .  \}
4370 .  el \{\
4371 .    ie \n[.$] \{\
4372 .      ds doc-macro-name Dl
4373 .      doc-parse-args \$@
4374 .      nr doc-arg-ptr 1
4375 .      nr doc-curr-font \n[.f]
4376 .      nr doc-curr-size \n[.ps]
4377 .      nop \*[doc-Li-font]\c
4378 .      doc-print-recursive
4379 .    \}
4380 .    el \
4381 .      tm Usage: .Dl argument ... (#\n[.c])
4382 .  \}
4384 .  in -\n[doc-display-indent]u
4388 .\" NS D1 user macro
4389 .\" NS   display (one line)
4390 .\" NS
4391 .\" NS modifies:
4392 .\" NS   doc-arg-ptr
4393 .\" NS   doc-macro-name
4394 .\" NS
4395 .\" NS width register `D1' set in doc-common
4397 .de D1
4398 .  ta T .5i
4399 .  in +\n[doc-display-indent]u
4401 .  ie \n[doc-arg-limit] \{\
4402 .    tm Usage: .D1 not callable by other macros (#\n[.c])
4403 .    doc-reset-args
4404 .  \}
4405 .  el \{\
4406 .    ie \n[.$] \{\
4407 .      ds doc-macro-name D1
4408 .      doc-parse-args \$@
4409 .      nr doc-arg-ptr 1
4410 .      doc-print-recursive
4411 .    \}
4412 .    el \
4413 .      tm Usage: .D1 argument ... (#\n[.c])
4414 .  \}
4416 .  in -\n[doc-display-indent]u
4420 .\" NS Vt user macro
4421 .\" NS   variable type (for forcing old style variable declarations);
4422 .\" NS   this is not done in the same manner as .Ot for fortrash --
4423 .\" NS   clean up later
4424 .\" NS
4425 .\" NS modifies:
4426 .\" NS   doc-curr-font
4427 .\" NS   doc-curr-size
4428 .\" NS   doc-have-decl
4429 .\" NS   doc-have-var
4430 .\" NS   doc-macro-name
4431 .\" NS
4432 .\" NS width register `Vt' set in doc-common
4434 .de Vt
4435 .  if !\n[doc-arg-limit] \{\
4436 .    ie \n[.$] \{\
4437 .      ds doc-macro-name Vt
4438 .      doc-parse-args \$@
4439 .    \}
4440 .    el \
4441 .      tm Usage: .Vt variable_type ... (#\n[.c])
4442 .  \}
4444 .  if !\n[doc-arg-limit] \
4445 .    return
4447 .  nr doc-arg-ptr +1
4448 .  if (\n[doc-arg-limit] < \n[doc-arg-ptr]) \{\
4449 .    tm Usage: .Vt variable_type ... (#\n[.c])
4450 .    doc-reset-args
4451 .    return
4452 .  \}
4454 .  if \n[doc-in-synopsis-section] \{\
4455 .    \" if a function declaration was the last thing given,
4456 .    \" want vertical space
4457 .    if \n[doc-have-decl] \{\
4458 .      doc-paragraph
4459 .      nr doc-have-decl 0
4460 .    \}
4462 .    \" if a subroutine was the last thing given, want vertical space
4463 .    if \n[doc-have-func] \{\
4464 .      ie \n[doc-have-var] \
4465 .        br
4466 .      el \
4467 .        doc-paragraph
4468 .    \}
4470 .    nr doc-have-var 1
4471 .  \}
4473 .  nr doc-curr-font \n[.f]
4474 .  nr doc-curr-size \n[.ps]
4475 .  nop \*[doc-Ft-font]\c
4476 .  doc-print-recursive
4478 .  if \n[doc-in-synopsis-section] \{\
4479 .    ie \n[doc-have-old-func] \
4480 .      nop \*[doc-soft-space]\c
4481 .    el \
4482 .      br
4483 .  \}
4487 .\" NS doc-is-func global register (bool)
4488 .\" NS   set if subroutine (in synopsis only) (fortran only)
4490 .nr doc-is-func 0
4493 .\" NS Ft user macro
4494 .\" NS   function type
4495 .\" NS
4496 .\" NS modifies:
4497 .\" NS   doc-curr-font
4498 .\" NS   doc-curr-size
4499 .\" NS   doc-have-decl
4500 .\" NS   doc-have-var
4501 .\" NS   doc-is-func
4502 .\" NS   doc-macro-name
4503 .\" NS
4504 .\" NS width register `Ft' set in doc-common
4506 .de Ft
4507 .  if !\n[doc-arg-limit] \{\
4508 .    ie \n[.$] \{\
4509 .      ds doc-macro-name Ft
4510 .      doc-parse-args \$@
4511 .    \}
4512 .    el \
4513 .      tm Usage: .Ft function_type ... (#\n[.c])
4514 .  \}
4516 .  if !\n[doc-arg-limit] \
4517 .    return
4519 .  nr doc-arg-ptr +1
4520 .  if (\n[doc-arg-limit] < \n[doc-arg-ptr]) \{\
4521 .    tm Usage: .Ft function_type ... (#\n[.c])
4522 .    doc-reset-args
4523 .    return
4524 .  \}
4526 .  if \n[doc-in-synopsis-section] \{\
4527 .    if (\n[doc-have-func] : \n[doc-have-decl]) \{\
4528 .      doc-paragraph
4529 .      nr doc-have-decl 0
4530 .      nr doc-have-var 0
4531 .    \}
4533 .    if \n[doc-have-var] \{\
4534 .      doc-paragraph
4535 .      nr doc-have-var 0
4536 .    \}
4538 .    nr doc-is-func 1
4539 .  \}
4541 .  nr doc-curr-font \n[.f]
4542 .  nr doc-curr-size \n[.ps]
4543 .  nop \*[doc-Ft-font]\c
4544 .  doc-print-recursive
4548 .\" NS doc-have-old-func global register (bool)
4549 .\" NS   set if `Ot' has been called
4551 .nr doc-have-old-func 0
4554 .\" NS Ot user macro
4555 .\" NS   old function type (fortran -- no newline)
4556 .\" NS
4557 .\" NS modifies:
4558 .\" NS   doc-have-decl
4559 .\" NS   doc-have-old-func
4560 .\" NS   doc-have-var
4561 .\" NS   doc-is-func
4562 .\" NS
4563 .\" NS width register `Ot' set in doc-common
4565 .de Ot
4566 .  nr doc-have-old-func 1
4568 .  if \n[doc-in-synopsis-section] \{\
4569 .    if (\n[doc-have-func] : \n[doc-have-decl]) \{\
4570 .      doc-paragraph
4571 .      nr doc-have-decl 0
4572 .      nr doc-have-var 0
4573 .    \}
4575 .    if \n[doc-have-var] \{\
4576 .      doc-paragraph
4577 .      nr doc-have-var 0
4578 .    \}
4580 .    nr doc-is-func 1
4581 .  \}
4583 .  if \n[.$] \
4584 .    nop \*[doc-Ft-font]\$*\c
4585 .  nop \ \f[]\c
4589 .\" NS Fa user macro
4590 .\" NS   function arguments
4591 .\" NS
4592 .\" NS modifies:
4593 .\" NS   doc-arg-ptr
4594 .\" NS   doc-curr-font
4595 .\" NS   doc-curr-size
4596 .\" NS   doc-macro-name
4597 .\" NS
4598 .\" NS width register `Fa' set in doc-common
4600 .de Fa
4601 .  if !\n[doc-arg-limit] \{\
4602 .    ie \n[.$] \{\
4603 .      ds doc-macro-name Fa
4604 .      doc-parse-args \$@
4605 .    \}
4606 .    el \
4607 .      tm Usage: .Fa function_arguments ... (#\n[.c])
4608 .  \}
4610 .  ie \n[doc-func-arg-count] \
4611 .    doc-do-func
4612 .  el \{\
4613 .    nr doc-arg-ptr +1
4614 .    if (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
4615 .      nr doc-curr-font \n[.f]
4616 .      nr doc-curr-size \n[.ps]
4617 .      nop \*[doc-Fa-font]\c
4618 .      doc-print-recursive
4620 .      if \n[doc-in-synopsis-section] \
4621 .        if \n[doc-have-func] \
4622 .          br
4623 .  \}\}
4627 .\" NS doc-func-arg-count global register
4628 .\" NS   how many function arguments have been processed so far
4630 .nr doc-func-arg-count 0
4633 .\" NS doc-func-arg global string
4634 .\" NS   work buffer for function name strings
4636 .ds doc-func-arg
4639 .\" NS doc-num-func-args global register
4640 .\" NS   number of function arguments
4642 .nr doc-num-func-args 0
4645 .\" NS doc-func-args-processed global register
4646 .\" NS   function arguments processed so far
4648 .nr doc-func-args-processed 0
4651 .\" NS doc-do-func macro
4652 .\" NS   internal .Fa for .Fc
4653 .\" NS
4654 .\" NS modifies:
4655 .\" NS   doc-arg-ptr
4656 .\" NS   doc-argXXX
4657 .\" NS   doc-func-arg
4658 .\" NS   doc-func-arg-count
4659 .\" NS   doc-func-args-processed
4660 .\" NS   doc-num-func-args
4662 .de doc-do-func
4663 .  if (\n[doc-arg-limit] <= \n[doc-arg-ptr]) \{\
4664 .    doc-reset-args
4665 .    return
4666 .  \}
4668 .  nr doc-arg-ptr +1
4670 .  ds doc-func-arg
4671 .  nr doc-num-func-args 0
4672 .  nr doc-func-args-processed 0
4674 .  doc-build-func-string \*[doc-arg\n[doc-arg-ptr]]
4675 .  if (\n[doc-num-func-args] > 1) \
4676 .    ds doc-arg\n[doc-arg-ptr] "\*[doc-func-arg]
4678 .  if (\n[doc-func-arg-count] > 1) \{\
4679 .    nop \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]\|,\)\c
4680 .    nop \)\*[doc-space\n[doc-arg-ptr]]\*[doc-Fa-font]\c
4681 .    nop \)\*[doc-arg\n[doc-arg-ptr]]\f[]\s[0]\c
4682 .  \}
4684 .  if (\n[doc-func-arg-count] == 1) \{\
4685 .    nop \|\*[doc-Fa-font]\*[doc-arg\n[doc-arg-ptr]]\c
4686 .    nop \f[]\s[0]\c
4687 .  \}
4688 .  nr doc-func-arg-count +1
4689 .  doc-do-func
4693 .\" NS doc-have-func global register (bool)
4694 .\" NS   whether we have more than one function in synopsis
4696 .nr doc-have-func 0
4699 .\" NS Fn user macro
4700 .\" NS   functions
4701 .\" NS
4702 .\" NS modifies:
4703 .\" NS   doc-arg-ptr
4704 .\" NS   doc-curr-font
4705 .\" NS   doc-curr-size
4706 .\" NS   doc-have-decl
4707 .\" NS   doc-have-func
4708 .\" NS   doc-have-var
4709 .\" NS   doc-indent-synopsis
4710 .\" NS   doc-is-func
4711 .\" NS   doc-macro-name
4712 .\" NS
4713 .\" NS width register `Fn' set in doc-common
4715 .de Fn
4716 .  if !\n[doc-arg-limit] \{\
4717 .    ie \n[.$] \{\
4718 .      ds doc-macro-name Fn
4719 .      doc-parse-args \$@
4720 .    \}
4721 .    el \
4722 .      tm Usage: .Fn function_name [function_arg] ... (#\n[.c])
4723 .  \}
4725 .  if !\n[doc-arg-limit] \
4726 .    return
4728 .  if \n[doc-in-synopsis-section] \{\
4729 .    \" if there is/has been more than one subroutine declaration
4730 .    ie \n[doc-is-func] \{\
4731 .      br
4732 .      nr doc-have-var 0
4733 .      nr doc-have-decl 0
4734 .      nr doc-is-func 0
4735 .    \}
4736 .    el \{\
4737 .      if \n[doc-have-func] \{\
4738 .        doc-paragraph
4739 .        nr doc-have-var 0
4740 .        nr doc-have-decl 0
4741 .    \}\}
4743 .    if \n[doc-have-decl] \{\
4744 .      doc-paragraph
4745 .      nr doc-have-var 0
4746 .    \}
4748 .    if \n[doc-have-var] \{\
4749 .      doc-paragraph
4750 .      nr doc-have-decl 0
4751 .    \}
4753 .    nr doc-have-func 1
4754 .    nr doc-is-func 0
4756 .    br
4757 .    if !\n[doc-indent-synopsis] \
4758 .      nr doc-indent-synopsis (8u * \n[doc-fixed-width]u)
4759 .    if !\n[doc-indent-synopsis-active] \
4760 .      in +\n[doc-indent-synopsis]u
4761 .    ti -\n[doc-indent-synopsis]u
4762 .  \}
4764 .  nr doc-arg-ptr +1
4765 .  doc-print-prefixes
4766 .  if (\n[doc-arg-limit] < \n[doc-arg-ptr]) \{\
4767 .    tm Usage: .Fn function_name [function_arg] ... (#\n[.c])
4768 .    doc-reset-args
4769 .    return
4770 .  \}
4772 .  nr doc-curr-font \n[.f]
4773 .  nr doc-curr-size \n[.ps]
4774 .  nop \*[doc-Fn-font]\*[doc-arg\n[doc-arg-ptr]]\c
4775 .  nop \f[]\s[0]\*[lp]\)\c
4777 .  nr doc-arg-ptr +1
4778 .  if (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
4779 .    if (\n[doc-type\n[doc-arg-ptr]] == 2) \{\
4780 .      nop \*[doc-Fa-font]\c
4781 .      doc-do-func-args
4782 .      nop \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]\c
4783 .  \}\}
4785 .  nop \)\*[rp]\)\c
4786 .  if \n[doc-in-synopsis-section] \
4787 .    nop \);\)\c
4789 .  ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
4790 .    \" output the space (if needed)
4791 .    nr doc-arg-ptr -1
4792 .    nop \)\*[doc-space\n[doc-arg-ptr]]\c
4793 .    nr doc-arg-ptr +1
4795 .    doc-print-recursive
4796 .  \}
4797 .  el \
4798 .    doc-print-and-reset
4800 .  if \n[doc-in-synopsis-section] \
4801 .    if !\n[doc-indent-synopsis-active] \
4802 .      in -\n[doc-indent-synopsis]u
4806 .\" NS doc-do-func-args macro
4807 .\" NS   handle function arguments
4808 .\" NS
4809 .\" NS modifies:
4810 .\" NS   doc-arg-ptr
4811 .\" NS   doc-argXXX
4812 .\" NS   doc-func-arg
4813 .\" NS   doc-func-args-processed
4814 .\" NS   doc-num-func-args
4815 .\" NS
4816 .\" NS local variables:
4817 .\" NS   doc-reg-ddfa
4819 .de doc-do-func-args
4820 .  if \n[doc-in-synopsis-section] \{\
4821 .    ds doc-func-arg
4822 .    nr doc-num-func-args 0
4823 .    nr doc-func-args-processed 0
4825 .    doc-build-func-string \*[doc-arg\n[doc-arg-ptr]]
4826 .    if (\n[doc-num-func-args] > 1) \
4827 .      ds doc-arg\n[doc-arg-ptr] "\*[doc-func-arg]
4828 .  \}
4830 .  nop \)\*[doc-arg\n[doc-arg-ptr]]\c
4831 .  nr doc-arg-ptr +1
4833 .  if (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
4834 .    if (\n[doc-type\n[doc-arg-ptr]] == 2) \{\
4835 .      nr doc-reg-ddfa (\n[doc-arg-ptr] - 1)
4836 .      nop \|\f[\n[doc-curr-font]]\s[\n[doc-curr-size]u],\)\c
4837 .      nop \)\*[doc-space\n[doc-reg-ddfa]]\f[]\s[0]\|\c
4838 .      doc-do-func-args
4839 .  \}\}
4843 .\" NS doc-saved-nesting-level global register
4845 .nr doc-saved-nesting-level 0
4848 .\" NS doc-in-func-enclosure global register (bool)
4850 .nr doc-in-func-enclosure 0
4853 .\" NS Fo user macro
4854 .\" NS   function open
4855 .\" NS
4856 .\" NS modifies:
4857 .\" NS   doc-arg-ptr
4858 .\" NS   doc-curr-font
4859 .\" NS   doc-curr-size
4860 .\" NS   doc-func-arg-count
4861 .\" NS   doc-have-decl
4862 .\" NS   doc-have-func
4863 .\" NS   doc-have-var
4864 .\" NS   doc-in-func-enclosure
4865 .\" NS   doc-indent-synopsis
4866 .\" NS   doc-is-func
4867 .\" NS   doc-macro-name
4868 .\" NS   doc-saved-nesting-level
4869 .\" NS
4870 .\" NS width register `Fo' set in doc-common
4872 .de Fo
4873 .  if (\n[doc-in-func-enclosure]) \{\
4874 .    tm mdoc error: .Fo/.Fc can't be nested (#\n[.c])
4875 .    return
4876 .  \}
4878 .  nr doc-saved-nesting-level \n[doc-nesting-level]
4879 .  nr doc-in-func-enclosure 1
4881 .  if !\n[doc-arg-limit] \{\
4882 .    ie \n[.$] \{\
4883 .      ds doc-macro-name Fo
4884 .      doc-parse-args \$@
4885 .    \}
4886 .    el \
4887 .      tm Usage: .Fo function_name (#\n[.c])
4888 .  \}
4890 .  if \n[doc-in-synopsis-section] \{\
4891 .    \" if there is/has been more than one subroutine declaration
4892 .    ie \n[doc-is-func] \{\
4893 .      br
4894 .      nr doc-have-var 0
4895 .      nr doc-have-decl 0
4896 .      nr doc-is-func 0
4897 .    \}
4898 .    el \{\
4899 .      if \n[doc-have-func] \{\
4900 .        doc-paragraph
4901 .        nr doc-have-var 0
4902 .        nr doc-have-decl 0
4903 .    \}\}
4905 .    if \n[doc-have-decl] \{\
4906 .      doc-paragraph
4907 .      nr doc-have-var 0
4908 .    \}
4910 .    if \n[doc-have-var] \{\
4911 .      doc-paragraph
4912 .      nr doc-have-decl 0
4913 .    \}
4915 .    nr doc-have-func 1
4916 .    nr doc-is-func 0
4918 .    br
4919 .    if !\n[doc-indent-synopsis] \
4920 .      nr doc-indent-synopsis (8u * \n[doc-fixed-width]u)
4921 .  \}
4923 .  \" start function box
4924 .  box doc-func-box
4925 .  ev doc-func-env
4926 .  evc 0
4927 .  in 0
4928 .  nf
4930 .  nr doc-arg-ptr +1
4931 .  doc-print-prefixes
4932 .  if (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
4933 .    nr doc-func-arg-count 1
4934 .    nr doc-curr-font \n[.f]
4935 .    nr doc-curr-size \n[.ps]
4937 .    nop \*[doc-Fn-font]\*[doc-arg\n[doc-arg-ptr]]\c
4938 .    nop \f[]\s[0]\*[lp]\)\c
4939 .    doc-reset-args
4940 .  \}
4944 .\" NS Fc user macro
4945 .\" NS   function close
4946 .\" NS
4947 .\" NS modifies:
4948 .\" NS   doc-arg-ptr
4949 .\" NS   doc-func-arg-count
4950 .\" NS   doc-in-func-enclosure
4951 .\" NS   doc-saved-nesting-level
4952 .\" NS   doc-macro-name
4953 .\" NS
4954 .\" NS width register `Fc' set in doc-common
4956 .de Fc
4957 .  if !\n[doc-in-func-enclosure] \{\
4958 .    tm mdoc warning: Extraneous .Fc (#\n[.c])
4959 .    return
4960 .  \}
4962 .  if \n[.$] \{\
4963 .    ds doc-macro-name Fc
4964 .    \" the first (dummy) argument is used to get the correct spacing
4965 .    doc-parse-args \) \$@
4966 .  \}
4968 .  if !(\n[doc-saved-nesting-level] == \n[doc-nesting-level]) \
4969 .    tm mdoc warning: Unbalanced enclosure commands within .Fo/.Fc
4971 .  nr doc-func-arg-count 0
4972 .  nr doc-in-func-enclosure 0
4974 .  ie \n[doc-in-synopsis-section] \
4975 .    nop \|\*[rp];\)
4976 .  el \
4977 .    nop \|\*[rp]\)
4979 .  \" finish function box
4980 .  br
4981 .  ev
4982 .  box
4983 .  chop doc-func-box
4984 .  unformat doc-func-box
4986 .  if \n[doc-in-synopsis-section] \{\
4987 .    if !\n[doc-indent-synopsis-active] \
4988 .      in +\n[doc-indent-synopsis]u
4989 .    ti -\n[doc-indent-synopsis]u
4990 .  \}
4992 .  nh
4993 .  nop \*[doc-func-box]\c
4995 .  nr doc-arg-ptr +1
4996 .  ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
4997 .    nr doc-curr-font \n[.f]
4998 .    nr doc-curr-size \n[.ps]
4999 .    doc-print-recursive
5000 .  \}
5001 .  el \
5002 .    doc-print-and-reset
5004 .  if \n[doc-in-synopsis-section] \
5005 .    if !\n[doc-indent-synopsis-active] \
5006 .      in -\n[doc-indent-synopsis]u
5010 .\" NS doc-build-func-string macro
5011 .\" NS   collect function arguments and set hard spaces inbetween
5012 .\" NS
5013 .\" NS modifies:
5014 .\" NS   doc-func-arg
5015 .\" NS   doc-func-args-processed
5016 .\" NS   doc-num-func-args
5018 .de doc-build-func-string
5019 .  if !\n[doc-num-func-args] \{\
5020 .    nr doc-num-func-args \n[.$]
5021 .    nr doc-func-args-processed 0
5022 .    ds doc-func-arg
5023 .  \}
5025 .  nr doc-func-args-processed +1
5026 .  as doc-func-arg "\$1
5028 .  if (\n[doc-func-args-processed] < \n[doc-num-func-args]) \{\
5029 .    as doc-func-arg "\*[doc-hard-space]
5031 .    shift
5032 .    doc-build-func-string \$@
5033 .  \}
5037 .\" Very crude references: Stash all reference info into boxes, print out
5038 .\" reference on .Re macro and clean up.  Ordering very limited, no fancy
5039 .\" citations, but can do articles, journals, and books -- need to add
5040 .\" several missing options (like city etc).  Should be able to grab a refer
5041 .\" entry, massage it a wee bit (prefix a `.' to the %[A-Z]) and not worry
5042 .\" (ha!).
5045 .\" NS doc-is-reference global register (bool)
5046 .\" NS   set if in reference
5048 .nr doc-is-reference 0
5051 .\" NS doc-reference-count global register
5052 .\" NS   reference element counter
5054 .nr doc-reference-count 0
5057 .\" NS Rs user macro
5058 .\" NS   reference start
5059 .\" NS
5060 .\" NS modifies:
5061 .\" NS   doc-is-reference
5062 .\" NS   doc-reference-count
5063 .\" NS
5064 .\" NS width register `Rs' set in doc-common
5066 .de Rs
5067 .  ie \n[.$] \
5068 .    tm Usage: .Rs (does not take arguments) (#\n[.c])
5069 .  el \{\
5070 .    nr doc-is-reference 1
5071 .    doc-reset-reference
5072 .    if \n[doc-in-see-also-section] \
5073 .      doc-paragraph
5074 .    nr doc-reference-count 0
5075 .  \}
5079 .\" NS Re user macro
5080 .\" NS   reference end
5081 .\" NS
5082 .\" NS modifies:
5083 .\" NS   doc-is-reference
5084 .\" NS
5085 .\" NS width register `Re' set in doc-common
5087 .de Re
5088 .  ie \n[.$] \
5089 .    tm Usage: .Re (does not take arguments) (#\n[.c])
5090 .  el \{\
5091 .    doc-print-reference
5092 .    doc-reset-reference
5093 .    nr doc-is-reference 0
5094 .  \}
5098 .\" NS doc-reset-reference macro
5099 .\" NS   reference cleanup
5100 .\" NS
5101 .\" NS modifies:
5102 .\" NS   doc-author-count
5103 .\" NS   doc-author-nameXXX
5104 .\" NS   doc-book-count
5105 .\" NS   doc-book-name
5106 .\" NS   doc-corporate-count
5107 .\" NS   doc-corporate-name
5108 .\" NS   doc-date
5109 .\" NS   doc-date-count
5110 .\" NS   doc-issue-count
5111 .\" NS   doc-issue-name
5112 .\" NS   doc-journal-count
5113 .\" NS   doc-journam-name
5114 .\" NS   doc-optional-count
5115 .\" NS   doc-optional-string
5116 .\" NS   doc-page-number-count
5117 .\" NS   doc-page-number-string
5118 .\" NS   doc-reference-title-count
5119 .\" NS   doc-reference-title-name
5120 .\" NS   doc-reference-title-name-for-book
5121 .\" NS   doc-report-count
5122 .\" NS   doc-report-name
5123 .\" NS   doc-volume-count
5124 .\" NS   doc-volume-name
5126 .de doc-reset-reference
5127 .  while (\n[doc-author-count]) \{\
5128 .    ds doc-author-name\n[doc-author-count]
5129 .    nr doc-author-count -1
5130 .  \}
5131 .  nr doc-journal-count 0
5132 .  nr doc-issue-count 0
5133 .  nr doc-optional-count 0
5134 .  nr doc-corporate-count 0
5135 .  nr doc-report-count 0
5136 .  nr doc-reference-title-count 0
5137 .  nr doc-volume-count 0
5138 .  nr doc-date-count 0
5139 .  nr doc-page-number-count 0
5140 .  nr doc-book-count 0
5142 .  ds doc-journal-name
5143 .  ds doc-issue-name
5144 .  ds doc-optional-string
5145 .  ds doc-corporate-name
5146 .  ds doc-report-name
5147 .  ds doc-reference-title-name
5148 .  ds doc-reference-title-name-for-book
5149 .  ds doc-volume-name
5150 .  ds doc-date
5151 .  ds doc-page-number-string
5152 .  ds doc-book-name
5156 .\" NS doc-finish-reference macro
5157 .\" NS   auxiliary macro for doc-print-reference
5158 .\" NS
5159 .\" NS modifies:
5160 .\" NS   doc-reference-count
5162 .de doc-finish-reference
5163 .  nr doc-reference-count -1
5164 .  ie \n[doc-reference-count] \
5165 .    nop \),
5166 .  el \
5167 .    nop \).
5171 .\" NS doc-print-reference macro
5172 .\" NS   reference print
5173 .\" NS
5174 .\" NS modifies:
5175 .\" NS   doc-reference-count
5177 .de doc-print-reference
5179 .  nh
5181 .  if \n[doc-author-count] \{\
5182 .    doc-print-reference-authors
5183 .    nr doc-reference-count -\n[doc-author-count]
5184 .  \}
5186 .  if \n[doc-reference-title-count] \{\
5187 .    unformat doc-reference-title-name
5188 .    chop doc-reference-title-name
5189 .    unformat doc-reference-title-name-for-book
5190 .    chop doc-reference-title-name-for-book
5191 .    ie ((\n[doc-journal-count] == 1) : (\n[doc-book-count] == 1)) \{\
5192 .      nop \)\*[q]\)\*[doc-reference-title-name-for-book]\)\*[q]\c
5193 .      doc-finish-reference
5194 .    \}
5195 .    el \{\
5196 .      nop \*[doc-reference-title-name]\c
5197 .      doc-finish-reference
5198 .  \}\}
5200 .  if \n[doc-book-count] \{\
5201 .    unformat doc-book-name
5202 .    chop doc-book-name
5203 .    nop \*[doc-book-name]\c
5204 .    doc-finish-reference
5205 .  \}
5207 .  if \n[doc-publisher-count] \{\
5208 .    unformat doc-publisher-name
5209 .    chop doc-publisher-name
5210 .    nop \*[doc-publisher-name]\c
5211 .    doc-finish-reference
5212 .  \}
5214 .  if \n[doc-journal-count] \{\
5215 .    unformat doc-journal-name
5216 .    chop doc-journal-name
5217 .    nop \*[doc-journal-name]\c
5218 .    doc-finish-reference
5219 .  \}
5221 .  if \n[doc-report-count] \{\
5222 .    unformat doc-report-name
5223 .    chop doc-report-name
5224 .    nop \*[doc-report-name]\c
5225 .    doc-finish-reference
5226 .  \}
5228 .  if \n[doc-issue-count] \{\
5229 .    unformat doc-issue-name
5230 .    chop doc-issue-name
5231 .    nop \*[doc-issue-name]\c
5232 .    doc-finish-reference
5233 .  \}
5235 .  if \n[doc-volume-count] \{\
5236 .    unformat doc-volume-name
5237 .    chop doc-volume-name
5238 .    nop \*[doc-volume-name]\c
5239 .    doc-finish-reference
5240 .  \}
5242 .  if \n[doc-page-number-count] \{\
5243 .    unformat doc-page-number-string
5244 .    chop doc-page-number-string
5245 .    nop \*[doc-page-number-string]\c
5246 .    doc-finish-reference
5247 .  \}
5249 .  if \n[doc-corporate-count] \{\
5250 .    unformat doc-corporate-name
5251 .    chop doc-corporate-name
5252 .    nop \*[doc-corporate-name]\c
5253 .    doc-finish-reference
5254 .  \}
5256 .  if \n[doc-date-count] \{\
5257 .    unformat doc-date
5258 .    chop doc-date
5259 .    nop \*[doc-date]\c
5260 .    doc-finish-reference
5261 .  \}
5263 .  if \n[doc-optional-count] \{\
5264 .    unformat doc-optional-string
5265 .    chop doc-optional-string
5266 .    nop \*[doc-optional-string]\c
5267 .    doc-finish-reference
5268 .  \}
5270 .  if \n[doc-reference-count] \
5271 .    tm mdoc warning: unresolved reference problem
5273 .  hy \n[doc-hyphen-flags]
5277 .\" NS doc-print-reference-authors macro
5278 .\" NS   print out reference authors
5279 .\" NS
5280 .\" NS local variables:
5281 .\" NS   doc-reg-dpra
5282 .\" NS   doc-str-dpra
5284 .ds doc-str-dpra "and
5286 .de doc-print-reference-authors
5287 .  nr doc-reg-dpra 1
5289 .  while (\n[doc-reg-dpra] < \n[doc-author-count]) \{\
5290 .    unformat doc-author-name\n[doc-reg-dpra]
5291 .    chop doc-author-name\n[doc-reg-dpra]
5292 .    ie (\n[doc-author-count] > 2) \
5293 .      nop \)\*[doc-author-name\n[doc-reg-dpra]],
5294 .    el \
5295 .      nop \)\*[doc-author-name\n[doc-reg-dpra]]
5296 .    nr doc-reg-dpra +1
5297 .  \}
5299 .  unformat doc-author-name\n[doc-reg-dpra]
5300 .  chop doc-author-name\n[doc-reg-dpra]
5301 .  if (\n[doc-author-count] > 1) \
5302 .    nop \)\*[doc-str-dpra]
5303 .  nop \)\*[doc-author-name\n[doc-reg-dpra]],
5307 .\" NS doc-author-count global register
5308 .\" NS   counter of author references
5310 .nr doc-author-count 0
5313 .\" NS doc-author-nameXXX global box
5314 .\" NS   array of author names
5315 .\" NS
5316 .\" NS limit:
5317 .\" NS   doc-author-count
5319 .ds doc-author-name0
5322 .\" NS %A user macro
5323 .\" NS   reference author(s)
5324 .\" NS
5325 .\" NS modifies:
5326 .\" NS   doc-arg-ptr
5327 .\" NS   doc-author-count
5328 .\" NS   doc-curr-font
5329 .\" NS   doc-curr-size
5330 .\" NS   doc-macro-name
5331 .\" NS   doc-reference-count
5332 .\" NS
5333 .\" NS local variables:
5334 .\" NS   doc-env-%A
5335 .\" NS
5336 .\" NS width register `%A' set in doc-common
5338 .de %A
5339 .  if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
5340 .    tm Usage: .%A author_name ... (#\n[.c])
5341 .    return
5342 .  \}
5344 .  nr doc-author-count +1
5345 .  nr doc-reference-count +1
5347 .  ds doc-macro-name %A
5348 .  doc-parse-args \$@
5350 .  nr doc-arg-ptr +1
5351 .  nr doc-curr-font \n[.f]
5352 .  nr doc-curr-size \n[.ps]
5354 .  \" save to reference box
5355 .  box doc-author-name\n[doc-author-count]
5356 .  ev doc-env-%A
5357 .  evc 0
5358 .  in 0
5359 .  nf
5360 .  doc-do-references
5364 .\" NS doc-book-count global register
5365 .\" NS   counter of book references
5367 .nr doc-book-count 0
5370 .\" NS doc-book-name global box
5371 .\" NS   string of collected book references
5373 .ds doc-book-name
5376 .\" NS %B user macro
5377 .\" NS   [reference] book name
5378 .\" NS
5379 .\" NS modifies:
5380 .\" NS   doc-arg-ptr
5381 .\" NS   doc-book-count
5382 .\" NS   doc-curr-font
5383 .\" NS   doc-curr-size
5384 .\" NS   doc-macro-name
5385 .\" NS   doc-reference-count
5386 .\" NS
5387 .\" NS local variables:
5388 .\" NS   doc-env-%B
5389 .\" NS
5390 .\" NS width register `%B' set in doc-common
5392 .de %B
5393 .  if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
5394 .    tm Usage: .%B book_name ... (#\n[.c])
5395 .    return
5396 .  \}
5398 .  if \n[doc-is-reference] \{\
5399 .    nr doc-book-count +1
5400 .    nr doc-reference-count +1
5401 .  \}
5403 .  ds doc-macro-name %B
5404 .  doc-parse-args \$@
5406 .  nr doc-arg-ptr +1
5407 .  nr doc-curr-font \n[.f]
5408 .  nr doc-curr-size \n[.ps]
5410 .  ie \n[doc-is-reference] \{\
5411 .    \" append to reference box
5412 .    boxa doc-book-name
5413 .    ev doc-env-%B
5414 .    evc 0
5415 .    in 0
5416 .    nf
5417 .    nop \*[doc-Em-font]\c
5418 .    doc-do-references
5419 .  \}
5420 .  el \{\
5421 .    nop \*[doc-Em-font]\c
5422 .    doc-print-recursive
5423 .  \}
5427 .\" NS doc-date-count global register
5428 .\" NS   counter of date references
5430 .nr doc-date-count 0
5433 .\" NS doc-date global box
5434 .\" NS   string of collected date references
5436 .ds doc-date
5439 .\" NS %D user macro
5440 .\" NS   [reference] date
5441 .\" NS
5442 .\" NS modifies:
5443 .\" NS   doc-arg-ptr
5444 .\" NS   doc-curr-font
5445 .\" NS   doc-curr-size
5446 .\" NS   doc-date-count
5447 .\" NS   doc-macro-name
5448 .\" NS   doc-reference-count
5449 .\" NS
5450 .\" NS local variables:
5451 .\" NS   doc-env-%D
5452 .\" NS
5453 .\" NS width register `%D' set in doc-common
5455 .de %D
5456 .  if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
5457 .    tm Usage: .%D date ... (#\n[.c])
5458 .    return
5459 .  \}
5461 .  nr doc-date-count +1
5462 .  nr doc-reference-count +1
5464 .  ds doc-macro-name %D
5465 .  doc-parse-args \$@
5467 .  nr doc-arg-ptr +1
5468 .  nr doc-curr-font \n[.f]
5469 .  nr doc-curr-size \n[.ps]
5471 .  \" append to reference box
5472 .  boxa doc-date
5473 .  ev doc-env-%D
5474 .  evc 0
5475 .  in 0
5476 .  nf
5477 .  doc-do-references
5481 .\" NS doc-publisher-count global register
5482 .\" NS   counter of publisher references
5484 .nr doc-publisher-count 0
5487 .\" NS doc-publisher-name global box
5488 .\" NS   string of collected publisher references
5490 .ds doc-publisher-name
5493 .\" NS %I user macro
5494 .\" NS   [reference] issuer/publisher name
5495 .\" NS
5496 .\" NS modifies:
5497 .\" NS   doc-arg-ptr
5498 .\" NS   doc-curr-font
5499 .\" NS   doc-curr-size
5500 .\" NS   doc-macro-name
5501 .\" NS   doc-publisher-count
5502 .\" NS   doc-reference-count
5503 .\" NS
5504 .\" NS local variables:
5505 .\" NS   doc-env-%I
5506 .\" NS
5507 .\" NS width register `%I' set in doc-common
5509 .de %I
5510 .  if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
5511 .    tm Usage: .%I issuer/publisher_name ... (#\n[.c])
5512 .    return
5513 .  \}
5515 .  nr doc-publisher-count +1
5516 .  nr doc-reference-count +1
5518 .  ds doc-macro-name %I
5519 .  doc-parse-args \$@
5521 .  nr doc-arg-ptr +1
5522 .  nr doc-curr-font \n[.f]
5523 .  nr doc-curr-size \n[.ps]
5525 .  \" append to reference box
5526 .  boxa doc-publisher-name
5527 .  ev doc-env-%I
5528 .  evc 0
5529 .  in 0
5530 .  nf
5531 .  nop \*[doc-Em-font]\c
5532 .  doc-do-references
5536 .\" NS doc-journal-count global register
5537 .\" NS   counter of journal references
5539 .nr doc-journal-count 0
5542 .\" NS doc-journal-name global box
5543 .\" NS   string of collected journal references
5545 .ds doc-journal-name
5548 .\" NS %J user macro
5549 .\" NS   [reference] Journal Name
5550 .\" NS
5551 .\" NS modifies:
5552 .\" NS   doc-arg-ptr
5553 .\" NS   doc-curr-font
5554 .\" NS   doc-curr-size
5555 .\" NS   doc-journal-count
5556 .\" NS   doc-macro-name
5557 .\" NS   doc-reference-count
5558 .\" NS
5559 .\" NS local variables:
5560 .\" NS   doc-env-%J
5561 .\" NS
5562 .\" NS width register `%J' set in doc-common
5564 .de %J
5565 .  if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
5566 .    tm Usage: .%J journal_name ... (#\n[.c])
5567 .    return
5568 .  \}
5570 .  nr doc-journal-count +1
5571 .  nr doc-reference-count +1
5573 .  ds doc-macro-name %J
5574 .  doc-parse-args \$@
5576 .  nr doc-arg-ptr +1
5577 .  nr doc-curr-font \n[.f]
5578 .  nr doc-curr-size \n[.ps]
5580 .  \" append to reference box
5581 .  boxa doc-journal-name
5582 .  ev doc-env-%J
5583 .  evc 0
5584 .  in 0
5585 .  nf
5586 .  nop \*[doc-Em-font]\c
5587 .  doc-do-references
5591 .\" NS doc-issue-count global register
5592 .\" NS   counter of issue number references
5594 .nr doc-issue-count 0
5597 .\" NS doc-issue-name global box
5598 .\" NS   string of collected issue number references
5600 .ds doc-issue-name
5603 .\" NS %N user macro
5604 .\" NS   [reference] issue number
5605 .\" NS
5606 .\" NS modifies:
5607 .\" NS   doc-arg-ptr
5608 .\" NS   doc-curr-font
5609 .\" NS   doc-curr-size
5610 .\" NS   doc-issue-count
5611 .\" NS   doc-macro-name
5612 .\" NS   doc-reference-count
5613 .\" NS
5614 .\" NS local variables:
5615 .\" NS   doc-env-%N
5616 .\" NS
5617 .\" NS width register `%N' set in doc-common
5619 .de %N
5620 .  if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
5621 .    tm Usage: .%N issue_number ... (#\n[.c])
5622 .    return
5623 .  \}
5625 .  nr doc-issue-count +1
5626 .  nr doc-reference-count +1
5628 .  ds doc-macro-name %N
5629 .  doc-parse-args \$@
5631 .  nr doc-arg-ptr +1
5632 .  nr doc-curr-font \n[.f]
5633 .  nr doc-curr-size \n[.ps]
5635 .  \" append to reference box
5636 .  boxa doc-issue-name
5637 .  ev doc-env-%N
5638 .  evc 0
5639 .  in 0
5640 .  nf
5641 .  doc-do-references
5645 .\" NS doc-optional-count global register
5646 .\" NS   counter of optional information references
5648 .nr doc-optional-count 0
5651 .\" NS doc-optional-string global box
5652 .\" NS   string of collected optional information references
5654 .ds doc-optional-string
5657 .\" NS %O user macro
5658 .\" NS   [reference] optional information
5659 .\" NS
5660 .\" NS modifies:
5661 .\" NS   doc-arg-ptr
5662 .\" NS   doc-curr-font
5663 .\" NS   doc-curr-size
5664 .\" NS   doc-macro-name
5665 .\" NS   doc-optional-count
5666 .\" NS   doc-reference-count
5667 .\" NS
5668 .\" NS local variables:
5669 .\" NS   doc-env-%O
5670 .\" NS
5671 .\" NS width register `%O' set in doc-common
5673 .de %O
5674 .  if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
5675 .    tm Usage: .%O optional_information ... (#\n[.c])
5676 .    return
5677 .  \}
5679 .  nr doc-optional-count +1
5680 .  nr doc-reference-count +1
5682 .  ds doc-macro-name %O
5683 .  doc-parse-args \$@
5685 .  nr doc-arg-ptr +1
5686 .  nr doc-curr-font \n[.f]
5687 .  nr doc-curr-size \n[.ps]
5689 .  \" append to reference box
5690 .  boxa doc-optional-string
5691 .  ev doc-env-%O
5692 .  evc 0
5693 .  in 0
5694 .  nf
5695 .  doc-do-references
5699 .\" NS doc-page-number-count global register
5700 .\" NS   counter of page number references
5702 .nr doc-page-number-count 0
5705 .\" NS doc-page-number-string global box
5706 .\" NS   string of collected page number references
5708 .ds doc-page-number-string
5711 .\" NS %P user macro
5712 .\" NS   [reference] page numbers
5713 .\" NS
5714 .\" NS modifies:
5715 .\" NS   doc-arg-ptr
5716 .\" NS   doc-curr-font
5717 .\" NS   doc-curr-size
5718 .\" NS   doc-macro-name
5719 .\" NS   doc-page-number-count
5720 .\" NS   doc-reference-count
5721 .\" NS
5722 .\" NS local variables:
5723 .\" NS   doc-env-%P
5724 .\" NS
5725 .\" NS width register `%P' set in doc-common
5727 .de %P
5728 .  if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
5729 .    tm Usage: .%P page_number ... (#\n[.c])
5730 .    return
5731 .  \}
5733 .  nr doc-page-number-count +1
5734 .  nr doc-reference-count +1
5736 .  ds doc-macro-name %P
5737 .  doc-parse-args \$@
5739 .  nr doc-arg-ptr +1
5740 .  nr doc-curr-font \n[.f]
5741 .  nr doc-curr-size \n[.ps]
5743 .  \" append to reference box
5744 .  boxa doc-page-number-string
5745 .  ev doc-env-%P
5746 .  evc 0
5747 .  in 0
5748 .  nf
5749 .  doc-do-references
5753 .\" NS doc-corporate-count global register
5754 .\" NS   counter of corporate references
5756 .nr doc-corporate-count 0
5759 .\" NS doc-corporate-name global box
5760 .\" NS   string of collected corporate references
5762 .ds doc-corporate-name
5765 .\" NS %Q user macro
5766 .\" NS   corporate or foreign author
5767 .\" NS
5768 .\" NS modifies:
5769 .\" NS   doc-arg-ptr
5770 .\" NS   doc-corporate-count
5771 .\" NS   doc-curr-font
5772 .\" NS   doc-curr-size
5773 .\" NS   doc-macro-name
5774 .\" NS   doc-reference-count
5775 .\" NS
5776 .\" NS local variables:
5777 .\" NS   doc-env-%Q
5778 .\" NS
5779 .\" NS width register `%Q' set in doc-common
5781 .de %Q
5782 .  if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
5783 .    tm Usage: .%Q corporate_or_foreign_author ... (#\n[.c])
5784 .    return
5785 .  \}
5787 .  nr doc-corporate-count +1
5788 .  nr doc-reference-count +1
5790 .  ds doc-macro-name %Q
5791 .  doc-parse-args \$@
5793 .  nr doc-arg-ptr +1
5794 .  nr doc-curr-font \n[.f]
5795 .  nr doc-curr-size \n[.ps]
5797 .  \" append to reference box
5798 .  boxa doc-corporate-name
5799 .  ev doc-env-%Q
5800 .  evc 0
5801 .  in 0
5802 .  nf
5803 .  doc-do-references
5807 .\" NS doc-report-count global register
5808 .\" NS   counter of report references
5810 .nr doc-report-count 0
5813 .\" NS doc-report-name global box
5814 .\" NS   string of collected report references
5816 .ds doc-report-name
5819 .\" NS %R user macro
5820 .\" NS   [reference] report name
5821 .\" NS
5822 .\" NS modifies:
5823 .\" NS   doc-arg-ptr
5824 .\" NS   doc-curr-font
5825 .\" NS   doc-curr-size
5826 .\" NS   doc-macro-name
5827 .\" NS   doc-reference-count
5828 .\" NS   doc-report-count
5829 .\" NS
5830 .\" NS local variables:
5831 .\" NS   doc-env-%R
5832 .\" NS
5833 .\" NS width register `%R' set in doc-common
5835 .de %R
5836 .  if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
5837 .    tm Usage: .%R reference_report ... (#\n[.c])
5838 .    return
5839 .  \}
5841 .  nr doc-report-count +1
5842 .  nr doc-reference-count +1
5844 .  ds doc-macro-name %R
5845 .  doc-parse-args \$@
5847 .  nr doc-arg-ptr +1
5848 .  nr doc-curr-font \n[.f]
5849 .  nr doc-curr-size \n[.ps]
5851 .  \" append to reference box
5852 .  boxa doc-report-name
5853 .  ev doc-env-%R
5854 .  evc 0
5855 .  in 0
5856 .  nf
5857 .  doc-do-references
5861 .\" NS doc-reference-title-count global register
5862 .\" NS   counter of reference title references
5864 .nr doc-reference-title-count 0
5867 .\" NS doc-reference-title-name global box
5868 .\" NS   string of collected reference title references
5870 .ds doc-reference-title-name
5873 .\" NS doc-reference-title-name-for-book global box
5874 .\" NS   string of collected reference title references
5875 .\" NS   (saved with another font; this is a shortcoming of groff)
5877 .ds doc-reference-title-name-for-book
5880 .\" NS %T user macro
5881 .\" NS   reference title
5882 .\" NS
5883 .\" NS modifies:
5884 .\" NS   doc-arg-ptr
5885 .\" NS   doc-curr-font
5886 .\" NS   doc-curr-size
5887 .\" NS   doc-macro-name
5888 .\" NS   doc-reference-title-count
5889 .\" NS   doc-report-count
5890 .\" NS
5891 .\" NS local variables:
5892 .\" NS   doc-env-%T
5893 .\" NS
5894 .\" NS width register `%T' set in doc-common
5896 .de %T
5897 .  if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
5898 .    tm Usage: .%T reference_title ... (#\n[.c])
5899 .    return
5900 .  \}
5902 .  if \n[doc-is-reference] \{\
5903 .    nr doc-reference-title-count +1
5904 .    nr doc-reference-count +1
5905 .  \}
5907 .  ds doc-macro-name %T
5908 .  doc-parse-args \$@
5910 .  nr doc-arg-ptr +1
5911 .  nr doc-curr-font \n[.f]
5912 .  nr doc-curr-size \n[.ps]
5913 .  ie \n[doc-is-reference] \{\
5914 .    \" append to reference box
5915 .    boxa doc-reference-title-name-for-book
5916 .    ev doc-env-%T
5917 .    evc 0
5918 .    in 0
5919 .    nf
5920 .    nop \*[doc-No-font]\c
5921 .    doc-do-references
5923 .    \" do it a second time with another font
5924 .    ds doc-macro-name %T
5925 .    doc-parse-args \$@
5927 .    nr doc-arg-ptr +1
5928 .    nr doc-curr-font \n[.f]
5929 .    nr doc-curr-size \n[.ps]
5930 .    boxa doc-reference-title-name
5931 .    ev doc-env-%T
5932 .    evc 0
5933 .    in 0
5934 .    nf
5935 .    nop \*[doc-Em-font]\c
5936 .    doc-do-references
5937 .  \}
5938 .  el \{\
5939 .    nop \*[doc-Em-font]\c
5940 .    doc-print-recursive
5941 .  \}
5945 .\" NS doc-volume-count global register
5946 .\" NS   counter of reference title references
5948 .nr doc-volume-count 0
5951 .\" NS doc-volume-name global box
5952 .\" NS   string of collected volume references
5954 .ds doc-volume-name
5957 .\" NS %V user macro
5958 .\" NS   reference volume
5959 .\" NS
5960 .\" NS modifies:
5961 .\" NS   doc-arg-ptr
5962 .\" NS   doc-curr-font
5963 .\" NS   doc-curr-size
5964 .\" NS   doc-macro-name
5965 .\" NS   doc-reference-title-count
5966 .\" NS   doc-volume-count
5967 .\" NS
5968 .\" NS local variables:
5969 .\" NS   doc-env-%V
5970 .\" NS
5971 .\" NS width register `%V' set in doc-common
5973 .de %V
5974 .  if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\
5975 .    tm Usage: .%V volume ... (#\n[.c])
5976 .    return
5977 .  \}
5979 .  nr doc-volume-count +1
5980 .  nr doc-reference-count +1
5982 .  ds doc-macro-name %V
5983 .  doc-parse-args \$@
5985 .  nr doc-arg-ptr +1
5986 .  nr doc-curr-font \n[.f]
5987 .  nr doc-curr-size \n[.ps]
5989 .  \" append to reference box
5990 .  boxa doc-volume-name
5991 .  ev doc-env-%V
5992 .  evc 0
5993 .  in 0
5994 .  nf
5995 .  doc-do-references
5999 .\" NS doc-do-references macro
6000 .\" NS   reference recursion routine
6001 .\" NS
6002 .\" NS modifies:
6003 .\" NS   doc-arg-ptr
6004 .\" NS
6005 .\" NS local variables:
6006 .\" NS   doc-reg-ddr
6007 .\" NS   doc-reg-ddr1
6009 .de doc-do-references
6010 .  if !\n[doc-is-reference] \
6011 .    tm mdoc error: .\*[doc-macro-name] found outside of .Rs ... .Re (#\n[.c])
6013 .  nr doc-reg-ddr1 \n[doc-type\n[doc-arg-ptr]]
6015 .  ie (\n[doc-reg-ddr1] == 1) \{\
6016 .    \" .nop \f[\n[doc-curr-font]]\s[\n[doc-curr-size]u]\c
6017 .    doc-append-arg \c 3
6018 .    \*[doc-arg\n[doc-arg-ptr]]
6019 .  \}
6020 .  el \{\
6021 .    nop \)\*[doc-arg\n[doc-arg-ptr]]\c
6023 .    ie (\n[doc-arg-limit] == \n[doc-arg-ptr]) \{\
6024 .      \" finish reference box
6025 .      br
6026 .      ev
6027 .      boxa
6029 .      doc-reset-args
6030 .    \}
6031 .    el \{\
6032 .      nr doc-reg-ddr \n[doc-arg-ptr]
6033 .      nr doc-arg-ptr +1
6034 .      nop \)\*[doc-space\n[doc-reg-ddr]]\c
6035 .      doc-do-references
6036 .  \}\}
6040 .\" NS Hf user macro
6041 .\" NS   source include header files.
6042 .\" NS
6043 .\" NS modifies:
6044 .\" NS   doc-curr-font
6045 .\" NS   doc-curr-size
6046 .\" NS
6047 .\" NS width register `Hf' set in doc-common
6049 .de Hf
6050 .  ie ((\n[.$] == 1) & (\n[doc-arg-limit] == 0)) \{\
6051 .    doc-paragraph
6052 .    nop File:
6053 .    Pa \$1
6055 .    Bd -literal
6056 .    so \$1
6057 .    Ed
6059 .    doc-paragraph
6060 .  \}
6061 .  el \
6062 .    Usage: .Hf file (#\n[.c])
6066 .\" NS doc-have-author global register (bool)
6067 .\" NS   set in `An'
6069 .nr doc-have-author 0
6072 .\" NS An user macro
6073 .\" NS   author name
6074 .\" NS
6075 .\" NS modifies:
6076 .\" NS   doc-arg-ptr
6077 .\" NS   doc-curr-font
6078 .\" NS   doc-curr-size
6079 .\" NS   doc-have-author
6080 .\" NS   doc-macro-name
6081 .\" NS
6082 .\" NS width register `An' set in doc-common
6084 .de An
6085 .  if !\n[doc-arg-limit] \{\
6086 .    ie \n[.$] \{\
6087 .      ie        "\$1"-nosplit" \
6088 .        nr doc-in-authors-section 0
6089 .      el \{ .ie "\$1"-split" \
6090 .        nr doc-in-authors-section 1
6091 .      el \{\
6092 .        ds doc-macro-name An
6093 .        doc-parse-args \$@
6094 .    \}\}\}
6095 .    el \{\
6096 .      tm1 "Usage: .An {-nosplit | -split}
6097 .      tm1         .An author_name ... (#\n[.c])
6098 .  \}\}
6100 .  if \n[doc-in-authors-section] \{\
6101 .    ie \n[doc-have-author] \
6102 .      br
6103 .    el \
6104 .      nr doc-have-author 1
6105 .  \}
6107 .  if \n[doc-arg-limit] \{\
6108 .    nr doc-arg-ptr +1
6109 .    ie (\n[doc-arg-limit] >= \n[doc-arg-ptr]) \{\
6110 .      nr doc-curr-font \n[.f]
6111 .      nr doc-curr-size \n[.ps]
6112 .      doc-print-recursive
6113 .    \}
6114 .    el \{\
6115 .      tm Usage: .An author_name ... (#\n[.c])
6116 .      doc-reset-args
6117 .  \}\}
6121 .\" NS Rv user macro
6122 .\" NS   return values
6123 .\" NS
6124 .\" NS width register `Rv' set in doc-common
6125 .\" NS
6126 .\" NS local variables:
6127 .\" NS   doc-str-Rv-std-prefix
6128 .\" NS   doc-str-Rv-std-suffix
6129 .\" NS   doc-str-Rv-stds-prefix
6130 .\" NS   doc-str-Rv-stds-and
6131 .\" NS   doc-str-Rv-stds-suffix
6132 .\" NS   doc-str-Rv-std0
6134 .ds doc-str-Rv-std-prefix "The
6135 .ds doc-str-Rv-std-suffix "function returns the value\~0 if successful;
6136 .as doc-str-Rv-std-suffix " otherwise the value\~-1 is returned and
6137 .as doc-str-Rv-std-suffix " the global variable \*[doc-Va-font]errno\f[]
6138 .as doc-str-Rv-std-suffix " is set to indicate the error.
6140 .ds doc-str-Rv-stds-prefix "The
6141 .ds doc-str-Rv-stds-and    "and
6142 .ds doc-str-Rv-stds-suffix "functions return the value\~0 if successful;
6143 .as doc-str-Rv-stds-suffix " otherwise the value\~-1 is returned and
6144 .as doc-str-Rv-stds-suffix " the global variable \*[doc-Va-font]errno\f[]
6145 .as doc-str-Rv-stds-suffix " is set to indicate the error.
6147 .ds doc-str-Rv-std0 "Upon successful completion, the value\~0 is returned;
6148 .as doc-str-Rv-std0 " otherwise the value\~-1 is returned and
6149 .as doc-str-Rv-std0 " the global variable \*[doc-Va-font]errno\f[]
6150 .as doc-str-Rv-std0 " is set to indicate the error.
6152 .de Rv
6154 .\" XXX: what does this function without `-std'?
6156 .  if \n[doc-arg-limit] \{\
6157 .    tm Usage: .Rv not callable by other macros (#\n[.c])
6158 .    doc-reset-args
6159 .    return
6160 .  \}
6162 .  if !\n[.$] \{\
6163 .    tm Usage: .Rv [-std] [<function> ...] (#\n[.c])
6164 .    return
6165 .  \}
6167 .  if "\$1"-std" \{\
6168 .    nr doc-reg-Rv \*[doc-section]
6169 .    if ((\n[doc-reg-Rv] < 2) : (\n[doc-reg-Rv] > 3)) \
6170 .      tm Usage: .Rv -std in sections 2 and 3 only (#\n[.c])
6171 .    br
6172 .    shift
6173 .    ie (\n[.$] > 1) \{\
6174 .      nop \)\*[doc-str-Rv-stds-prefix]
6175 .      nr doc-reg-Rv 1
6176 .      while (\n[doc-reg-Rv] < \n[.$]) \{\
6177 .        ie (\n[.$] > 2) \
6178 .          Fn \$\n[doc-reg-Rv] ,
6179 .        el \
6180 .          Fn \$\n[doc-reg-Rv]
6181 .        nr doc-reg-Rv +1
6182 .      \}
6183 .      nop \)\*[doc-str-Rv-stds-and]
6184 .      Fn \$\n[.$]
6185 .      nop \)\*[doc-str-Rv-stds-suffix]
6186 .    \}
6187 .    el \{ .ie (\n[.$] == 1) \{\
6188 .      nop \)\*[doc-str-Rv-std-prefix]
6189 .      Fn \$1
6190 .      nop \)\*[doc-str-Rv-std-suffix]
6191 .    \}
6192 .    el \{\
6193 .      nop \)\*[doc-str-Rv-std0]
6194 .  \}\}\}
6198 .\" NS Ex user macro
6199 .\" NS   exit status
6200 .\" NS
6201 .\" NS width register `Ex' set in doc-common
6202 .\" NS
6203 .\" NS local variables:
6204 .\" NS   doc-str-Ex-std-prefix
6205 .\" NS   doc-str-Ex-std-suffix
6207 .ds doc-str-Ex-std-prefix "The
6208 .ds doc-str-Ex-std-suffix "utility exits\~0 on success,
6209 .as doc-str-Ex-std-suffix " and\~>0 if an error occurs.
6211 .ds doc-str-Ex-stds-prefix "The
6212 .als doc-str-Ex-stds-and doc-str-Rv-stds-and
6213 .ds doc-str-Ex-stds-suffix "utilities exit\~0 on success,
6214 .as doc-str-Ex-stds-suffix " and\~>0 if an error occurs.
6216 .de Ex
6218 .\" XXX: what does this function without `-std'?
6220 .  if \n[doc-arg-limit] \{\
6221 .    tm Usage: .Ex not callable by other macros (#\n[.c])
6222 .    doc-reset-args
6223 .    return
6224 .  \}
6226 .  if !\n[.$] \{\
6227 .    tm Usage: .Ex [-std] [<utility> ...] (#\n[.c])
6228 .    return
6229 .  \}
6231 .  if "\$1"-std" \{\
6232 .    nr doc-reg-Ex \*[doc-section]
6233 .    if !((\n[doc-reg-Ex] == 1) : (\n[doc-reg-Ex] == 6) : (\n[doc-reg-Ex] == 8)) \
6234 .      tm Usage: .Ex -std in sections 1, 6 and 8 only (#\n[.c])
6235 .    br
6236 .    shift
6237 .    ie (\n[.$] > 1) \{\
6238 .      nop \)\*[doc-str-Ex-stds-prefix]
6239 .      nr doc-reg-Ex 1
6240 .      while (\n[doc-reg-Ex] < \n[.$]) \{\
6241 .        ie (\n[.$] > 2) \
6242 .          Nm \$\n[doc-reg-Ex] ,
6243 .        el \
6244 .          Nm \$\n[doc-reg-Ex]
6245 .        nr doc-reg-Ex +1
6246 .      \}
6247 .      nop \)\*[doc-str-Ex-stds-and]
6248 .      Nm \$\n[.$]
6249 .      nop \)\*[doc-str-Ex-stds-suffix]
6250 .    \}
6251 .    el \{\
6252 .      nop \)\*[doc-str-Ex-std-prefix]
6253 .      Nm \$1
6254 .      nop \)\*[doc-str-Ex-std-suffix]
6255 .  \}\}
6259 .\" NS Mt user macro
6260 .\" NS   mailto (for conversion to HTML)
6262 .de Mt
6263 .  \" XXX: error handling missing
6264 .  Pa \$@
6268 .\" NS Lk user macro
6269 .\" NS   link (for conversion to HTML)
6270 .\" NS
6271 .\" NS local variables:
6272 .\" NS   doc-reg-Lk
6273 .\" NS   doc-str-Lk
6275 .de Lk
6276 .  ds doc-str-Lk Sy \$@
6278 .  ie (\n[.$] > 1) \{\
6279 .    doc-get-arg-type \$2
6280 .    ie (\n[doc-arg-type] < 3) \{\
6281 .      Em \)\$2:
6282 .      ds doc-str-Lk Sy "\$1"
6283 .      doc-get-width "\$1"
6284 .      shift 2
6285 .      if \n[.$] \
6286 .        as doc-str-Lk " \$@
6287 .    \}
6288 .    el \
6289 .      doc-get-width "\$1"
6290 .  \}
6291 .  el \
6292 .    doc-get-width "\$1"
6294 .  ie n \
6295 .    nr doc-reg-Lk 26
6296 .  el \
6297 .    nr doc-reg-Lk 38
6298 .  ie (\n[doc-width] >= \n[doc-reg-Lk]) \
6299 .    D1 \*[doc-str-Lk]
6300 .  el \
6301 .    \*[doc-str-Lk]
6305 .\" NS doc-defunct-macro macro
6306 .\" NS   this is the skeleton for defunct macros
6307 .\" NS
6309 .de doc-defunct-macro
6310 .  tmc mdoc error: .\$0 defunct
6311 .  if d doc-\$0-usage \
6312 .    tmc , \*[doc-\$0-usage]
6313 .  tm1 " (#\n[.c])
6317 .\" obsolete macros
6319 .als Db doc-defunct-macro
6321 .als Ds doc-defunct-macro
6323 .als Or doc-defunct-macro
6324 .ds doc-Or-usage use `|'
6326 .als Sf doc-defunct-macro
6327 .ds doc-Sf-usage use .Pf or .Ns
6330 .rn em e@
6332 .de em
6333 .  tm1 "mdoc error: end-macro (.em) respecification is not allowed. (#\n[.c])
6334 .  tm1 "            Should this have been `.Em ...'?
6335 .  ab
6339 .\" NS doc-empty-line macro
6340 .\" NS   emit warning and print empty line
6342 .de doc-empty-line
6343 .  if !\n[doc-display-depth] \
6344 .    tm mdoc warning: Empty input line #\n[.c]
6345 .  sp
6348 .blm doc-empty-line
6354 .\" load local modifications
6355 .mso mdoc.local
6357 .\" EOF