John Spencer wrote: > Hello Michael, Felix, > > On 09/19/2013 01:00 PM, Michael Kerrisk (man-pages) wrote: > >> i've run a test script[0] using my own manpage viewer[1] > >> and attached the results. it seems that ~10% of the manpages use some > >> special groff features. i'd rather see these removed/replaced with something > >> nroff-compatible. > > > > I just want to check where you're coming from John. You're working on > > musl, right? Does musl not use the work from the man-pages project? I > > ask, because some of the pieces that your script doesn't like are also > > used in the man-pages project. See below. > > musl itself does not use the man-pages project currently, as the > majority of manpages are very glibc specific. so the posix manpages > project is _imo_ currently a much better documentation for the > interfaces provided by musl. On the other hand the section 2 man pages from linux-manpages documenting Linux specific behavior of system calls might be useful, no? > i can't remember the exact outcome of the previous discussion on the > musl mailing list, ("Linux manpages (was Re: [musl] Request for > volunteers)"), but afaik it is unlikely that the man-pages project will > be updated as discussed in that thread before musl 1.0 is out. > > however, my interest in having the POSIX manpages use portable nroff > syntax comes from my endeavor to build a non-bloated musl-based linux > system, which will, at least in the basic configuration, feature the > below nroff-only manpage viewer, since groff is incredibly bloated (over > 4 MB of compressed source code! - in comparison my man.c compiles to a > 60 KB statically linked binary) and written in C++ so it's definitely > contrary to my goals. (not to talk about that some of the groff features > like the tbl preprocessor are just horribly misguided and completely > unidiomatic, introducing a completely new language namespace) > > as such i'd love to see the POSIX manpages project actually deliver > portable manpages, instead of assuming that the full-blown GNU userspace > stack is available. Could you give a definition of this portable nroff syntax? > > > >> [0] https://github.com/rofl0r/hardcore-utils/blob/master/tests/mantest.sh > >> [1] https://github.com/rofl0r/hardcore-utils/blob/master/man.c > > > > Looking at your log: > > > >> === status report === > >> total manpages : 1143 > >> buggy manpages : 137 > >> total failures : 406 > >> unique failures : 12 > >> > >> bug list: > >> 122 **** Unknown formatter command: .ne > > > > Not sure about this one. From groff(7): > > > > .ne Need a one-line vertical space. > > .ne N Need N vertical space (default scaling indicator v). > > > > I'm not sure about the circumstances where these are being applied. Felix? > > > >> 106 **** Unknown formatter command: .TS > >> 106 **** Unknown formatter command: .TE > > > > These two are heavily used for tables in the man-pages project itself. > > What's the problem/alternative? > > the problem is A) that it requires groff's tbl preprocessor, which in > turn requires the full groff install, and B) that the tag cannot simply > be ignored becaused the content embedded into those tags follows a > completely random new syntax - example: > http://www.podgrid.org/linux-bible/linux-bible-page607.html > > the alternative is to apply the tbl preprocessor before shipping the > manpages and instead include the preprocessed output (cleaned up from > groffisms as well) I'm not sure if your man can handle the output of tbl. Attached is the output when run against one of the tables in pax. It looks rather hopeless. Also the fictional script cleaning up the GNU tbl output is likely going to be dependent on a specific tbl version. For eqn it seems much more likely to me that one can produce output which makes your man implementation happy. The equations are already hacked to make them better suitable for nroff. > as for the other groff specific formatter commands, i am refering to > Felix' response: all of them can either be left away or in case of tbl > and eqn the preprocessed source used instead. .ce remained open. Is there an alternative or could you just implement that? Felix
.if !\n(.g .ab GNU tbl requires GNU troff. .if !dTS .ds TS .if !dTE .ds TE .lf 1 pax.1p .ce 1 \fBTable: Octet-Oriented cpio Archive Entry\fP .TS .nr 3c \n(.C .cp 0 .nr 3lps \n[.s] .de 3init .ft \n[.f] .ps \n[.s] .vs \n[.v]u .in \n[.i]u .ll \n[.l]u .ls \n[.L] .ad \n[.j] .ie \n[.u] .fi .el .nf .ce \n[.ce] .. .nr 3ind \n[.i] .nr 3fnt \n[.f] .nr 3sz \n[.s] .nr 3fll \n[.u] .nr T. 0 .nr 3crow 0-1 .nr 3passed 0-1 .nr 3sflag 0 .ds 3trans .ds 3quote .nr 3brule 1 .nr 3supbot 0 .eo .de 3rmk .mk \$1 .if !'\n(.z'' \!.3rmk "\$1" .. .de 3rvpt .vpt \$1 .if !'\n(.z'' \!.3rvpt "\$1" .. .de 3keep .if '\n[.z]'' \{.ds 3quote \\ .ds 3trans \! .di 3section .nr 3sflag 1 .in 0 .\} .. .de 3release .if \n[3sflag] \{.di .in \n[3ind]u .nr 3dn \n[dn] .ds 3quote .ds 3trans .nr 3sflag 0 .if \n[.t]<=\n[dn] \{.nr T. 1 .T# .nr 3supbot 1 .sp \n[.t]u .nr 3supbot 0 .mk #T .\} .if \n[.t]<=\n[3dn] .tm warning: page \n%: table text block will not fit on one page .nf .ls 1 .3section .ls .rm 3section .\} .. .nr 3tflag 0 .de 3tkeep .if '\n[.z]'' \{.di 3table .nr 3tflag 1 .\} .. .de 3trelease .if \n[3tflag] \{.br .di .nr 3dn \n[dn] .ne \n[dn]u+\n[.V]u .ie \n[.t]<=\n[3dn] .tm error: page \n%: table will not fit on one page; use .TS H/.TH with a supporting macro package .el \{.in 0 .ls 1 .nf .3table .\} .rm 3table .\} .. .ec .ce 0 .nf .nr 3sep 1n .nr 3w0 \n(.H .nr 3aw0 0 .nr 3lnw0 0 .nr 3rnw0 0 .nr 3w1 \n(.H .nr 3aw1 0 .nr 3lnw1 0 .nr 3rnw1 0 .nr 3w2 \n(.H .nr 3aw2 0 .nr 3lnw2 0 .nr 3rnw2 0 .lf 7 pax.1p .nr 3w0 \n[3w0]>?\w\[tbl]\f[B]Header Field Name\f[\n[3fnt]]\[tbl] .lf 7 .nr 3w1 \n[3w1]>?\w\[tbl]\f[B]Length (in Octets)\f[\n[3fnt]]\[tbl] .lf 7 .nr 3w2 \n[3w2]>?\w\[tbl]\f[B]Interpreted as\f[\n[3fnt]]\[tbl] .lf 9 .nr 3w0 \n[3w0]>?\w\[tbl]\f[I]c_magic\f[\n[3fnt]]\[tbl] .lf 9 .nr 3tbw1,1 0\w\[tbl]6\[tbl] .nr 3lnw1 \n[3lnw1]>?\n[3tbw1,1] .lf 9 .nr 3w2 \n[3w2]>?\w\[tbl]Octal number\[tbl] .lf 10 .nr 3w0 \n[3w0]>?\w\[tbl]\f[I]c_dev\f[\n[3fnt]]\[tbl] .lf 10 .nr 3tbw2,1 0\w\[tbl]6\[tbl] .nr 3lnw1 \n[3lnw1]>?\n[3tbw2,1] .lf 10 .nr 3w2 \n[3w2]>?\w\[tbl]Octal number\[tbl] .lf 11 .nr 3w0 \n[3w0]>?\w\[tbl]\f[I]c_ino\f[\n[3fnt]]\[tbl] .lf 11 .nr 3tbw3,1 0\w\[tbl]6\[tbl] .nr 3lnw1 \n[3lnw1]>?\n[3tbw3,1] .lf 11 .nr 3w2 \n[3w2]>?\w\[tbl]Octal number\[tbl] .lf 12 .nr 3w0 \n[3w0]>?\w\[tbl]\f[I]c_mode\f[\n[3fnt]]\[tbl] .lf 12 .nr 3tbw4,1 0\w\[tbl]6\[tbl] .nr 3lnw1 \n[3lnw1]>?\n[3tbw4,1] .lf 12 .nr 3w2 \n[3w2]>?\w\[tbl]Octal number\[tbl] .lf 13 .nr 3w0 \n[3w0]>?\w\[tbl]\f[I]c_uid\f[\n[3fnt]]\[tbl] .lf 13 .nr 3tbw5,1 0\w\[tbl]6\[tbl] .nr 3lnw1 \n[3lnw1]>?\n[3tbw5,1] .lf 13 .nr 3w2 \n[3w2]>?\w\[tbl]Octal number\[tbl] .lf 14 .nr 3w0 \n[3w0]>?\w\[tbl]\f[I]c_gid\f[\n[3fnt]]\[tbl] .lf 14 .nr 3tbw6,1 0\w\[tbl]6\[tbl] .nr 3lnw1 \n[3lnw1]>?\n[3tbw6,1] .lf 14 .nr 3w2 \n[3w2]>?\w\[tbl]Octal number\[tbl] .lf 15 .nr 3w0 \n[3w0]>?\w\[tbl]\f[I]c_nlink\f[\n[3fnt]]\[tbl] .lf 15 .nr 3tbw7,1 0\w\[tbl]6\[tbl] .nr 3lnw1 \n[3lnw1]>?\n[3tbw7,1] .lf 15 .nr 3w2 \n[3w2]>?\w\[tbl]Octal number\[tbl] .lf 16 .nr 3w0 \n[3w0]>?\w\[tbl]\f[I]c_rdev\f[\n[3fnt]]\[tbl] .lf 16 .nr 3tbw8,1 0\w\[tbl]6\[tbl] .nr 3lnw1 \n[3lnw1]>?\n[3tbw8,1] .lf 16 .nr 3w2 \n[3w2]>?\w\[tbl]Octal number\[tbl] .lf 17 .nr 3w0 \n[3w0]>?\w\[tbl]\f[I]c_mtime\f[\n[3fnt]]\[tbl] .lf 17 .nr 3tbw9,1 0\w\[tbl]11\[tbl] .nr 3lnw1 \n[3lnw1]>?\n[3tbw9,1] .lf 17 .nr 3w2 \n[3w2]>?\w\[tbl]Octal number\[tbl] .lf 18 .nr 3w0 \n[3w0]>?\w\[tbl]\f[I]c_namesize\f[\n[3fnt]]\[tbl] .lf 18 .nr 3tbw10,1 0\w\[tbl]6\[tbl] .nr 3lnw1 \n[3lnw1]>?\n[3tbw10,1] .lf 18 .nr 3w2 \n[3w2]>?\w\[tbl]Octal number\[tbl] .lf 19 .nr 3w0 \n[3w0]>?\w\[tbl]\f[I]c_filesize\f[\n[3fnt]]\[tbl] .lf 19 .nr 3tbw11,1 0\w\[tbl]11\[tbl] .nr 3lnw1 \n[3lnw1]>?\n[3tbw11,1] .lf 19 .nr 3w2 \n[3w2]>?\w\[tbl]Octal number\[tbl] .lf 24 .nr 3w0 \n[3w0]>?\w\[tbl]\f[B]Filename Field Name\f[\n[3fnt]]\[tbl] .lf 24 .nr 3w1 \n[3w1]>?\w\[tbl]\f[B]Length\f[\n[3fnt]]\[tbl] .lf 24 .nr 3w2 \n[3w2]>?\w\[tbl]\f[B]Interpreted as\f[\n[3fnt]]\[tbl] .lf 26 .nr 3w0 \n[3w0]>?\w\[tbl]\f[I]c_name\f[\n[3fnt]]\[tbl] .lf 26 .nr 3w1 \n[3w1]>?\w\[tbl]\f[I]c_namesize\f[\n[3fnt]]\[tbl] .lf 26 .nr 3w2 \n[3w2]>?\w\[tbl]Pathname string\[tbl] .lf 31 .nr 3w0 \n[3w0]>?\w\[tbl]\f[B]File Data Field Name\f[\n[3fnt]]\[tbl] .lf 31 .nr 3w1 \n[3w1]>?\w\[tbl]\f[B]Length\f[\n[3fnt]]\[tbl] .lf 31 .nr 3w2 \n[3w2]>?\w\[tbl]\f[B]Interpreted as\f[\n[3fnt]]\[tbl] .lf 33 .nr 3w0 \n[3w0]>?\w\[tbl]\f[I]c_filedata\f[\n[3fnt]]\[tbl] .lf 33 .nr 3w1 \n[3w1]>?\w\[tbl]\f[I]c_filesize\f[\n[3fnt]]\[tbl] .lf 33 .nr 3w2 \n[3w2]>?\w\[tbl]Data\[tbl] .nr 3w0 \n[3w0]>?(\n[3lnw0]+\n[3rnw0]) .if \n[3aw0] .nr 3w0 \n[3w0]>?(\n[3aw0]+2n) .nr 3w1 \n[3w1]>?(\n[3lnw1]+\n[3rnw1]) .if \n[3aw1] .nr 3w1 \n[3w1]>?(\n[3aw1]+2n) .nr 3w2 \n[3w2]>?(\n[3lnw2]+\n[3rnw2]) .if \n[3aw2] .nr 3w2 \n[3w2]>?(\n[3aw2]+2n) .nr 3expand \n[.l]-\n[.i]-\n[3w0]-\n[3w1]-\n[3w2]-8n .if \n[3expand]<0 \{.lf 7 .tm1 "warning: file `\n[.F]', around line \n[.c]: .tm1 " table wider than line width .nr 3expand 0 .\} .nr 3cd0 0 .nr 3cl0 1*\n[3sep] .nr 3ce0 \n[3cl0]+\n[3w0] .nr 3cl1 \n[3ce0]+(3*\n[3sep]) .nr 3cd1 \n[3ce0]+\n[3cl1]/2 .nr 3ce1 \n[3cl1]+\n[3w1] .nr 3cl2 \n[3ce1]+(3*\n[3sep]) .nr 3cd2 \n[3ce1]+\n[3cl2]/2 .nr 3ce2 \n[3cl2]+\n[3w2] .nr 3cd3 \n[3ce2]+(1*\n[3sep]) .nr TW \n[3cd3] .in +(u;\n[.l]-\n[.i]-\n[TW]/2>?-\n[.i]) .nr 3ind \n[.i] .eo .de T# .if !\n[3supbot] \{.3rvpt 0 .mk 3vert .if \n[T.]&\n[3brule] \{.vs 2p>?\n[.V]u .ls 1 \v'.25m'\s[\n[3lps]]\h'|\n[3cd0]u'\D'l |\n[3cd3]u 0'\s0 .ls .vs .\} .ls 1 .if \n[3crow]>=14&(\n[3crow]<14) \{.if 14<=\n[3passed] .nr 3rt14 \n[#T] .sp -1 \v'.25m'\h'\n[3cd2]u'\s[\n[3lps]]\D'l 0 |\n[3rt14]u-1v'\s0 .\} .if \n[3crow]>=14&(\n[3crow]<14) \{.if 14<=\n[3passed] .nr 3rt14 \n[#T] .sp -1 \v'.25m'\h'\n[3cd1]u'\s[\n[3lps]]\D'l 0 |\n[3rt14]u-1v'\s0 .\} .if \n[3crow]>=0&(\n[3crow]<12) \{.if 0<=\n[3passed] .nr 3rt0 \n[#T] .sp -1 \v'.25m'\h'\n[3cd2]u'\s[\n[3lps]]\D'l 0 |\n[3rt0]u-1v'\s0 .\} .if \n[3crow]>=0&(\n[3crow]<12) \{.if 0<=\n[3passed] .nr 3rt0 \n[#T] .sp -1 \v'.25m'\h'\n[3cd1]u'\s[\n[3lps]]\D'l 0 |\n[3rt0]u-1v'\s0 .\} .if \n[3crow]>=0 \{.if 0<=\n[3passed] .nr 3rt0 \n[#T] .sp -1 \v'.25m'\h'\n[3cd3]u'\s[\n[3lps]]\D'l 0 |\n[3rt0]u-1v'\s0 .\} .if \n[3crow]>=0 \{.if 0<=\n[3passed] .nr 3rt0 \n[#T] .sp -1 \v'.25m'\h'\n[3cd0]u'\s[\n[3lps]]\D'l 0 |\n[3rt0]u-1v'\s0 .\} .ls .nr 3passed \n[3crow] .sp |\n[3vert]u .3rvpt 1 .\} .. .ec .fc .3tkeep .vs 2p>?\n[.V]u .ls 1 \v'.25m'\s[\n[3lps]]\h'|\n[3cd0]u'\D'l |\n[3cd3]u 0'\s0 .ls .vs .3keep .3rmk 3rt0 \*[3trans].nr 3crow 0 .3keep .mk 3rs0 .mk 3bot .3rvpt 0 .ta \n[3ce0]u \n[3ce1]u \n[3ce2]u .lf 7 \&\h'|\n[3cl0]u'\f[B]Header Field Name\f[\n[3fnt]]\h'|\n[3cl1]u'\f[B]Length (in Octets)\f[\n[3fnt]]\h'|\n[3cl2]u'\f[B]Interpreted as\f[\n[3fnt]] .nr 3bot \n[3bot]>?\n[.d] .sp |\n[3rs0]u .3rvpt 1 .sp |\n[3bot]u \*[3trans].nr 3brule 1 .vs 2p>?\n[.V]u .ls 1 \v'.25m'\s[\n[3lps]]\h'|\n[3cd0]u'\D'l |\n[3cd3]u 0'\s0 .ls .vs \*[3trans].nr 3brule 0 .3release .3keep .3rmk 3rt1 \*[3trans].nr 3crow 1 .3keep .mk 3rs1 .mk 3bot .3rvpt 0 .ta \n[3ce0]u \n[3ce2]u .lf 9 \&\h'|\n[3cl0]u'\f[I]c_magic\f[\n[3fnt]]\h'|(\n[3w1]u-\n[3lnw1]u-\n[3rnw1]u/2u+\n[3lnw1]u+\n[3cl1]u-\n[3tbw1,1]u)'6\h'|\n[3cl2]u'Octal number .nr 3bot \n[3bot]>?\n[.d] .sp |\n[3rs1]u .3rvpt 1 .sp |\n[3bot]u \*[3trans].nr 3brule 1 .3release .3keep .3rmk 3rt2 \*[3trans].nr 3crow 2 .3keep .mk 3rs2 .mk 3bot .3rvpt 0 .ta \n[3ce0]u \n[3ce2]u .lf 10 \&\h'|\n[3cl0]u'\f[I]c_dev\f[\n[3fnt]]\h'|(\n[3w1]u-\n[3lnw1]u-\n[3rnw1]u/2u+\n[3lnw1]u+\n[3cl1]u-\n[3tbw2,1]u)'6\h'|\n[3cl2]u'Octal number .nr 3bot \n[3bot]>?\n[.d] .sp |\n[3rs2]u .3rvpt 1 .sp |\n[3bot]u \*[3trans].nr 3brule 1 .3release .3keep .3rmk 3rt3 \*[3trans].nr 3crow 3 .3keep .mk 3rs3 .mk 3bot .3rvpt 0 .ta \n[3ce0]u \n[3ce2]u .lf 11 \&\h'|\n[3cl0]u'\f[I]c_ino\f[\n[3fnt]]\h'|(\n[3w1]u-\n[3lnw1]u-\n[3rnw1]u/2u+\n[3lnw1]u+\n[3cl1]u-\n[3tbw3,1]u)'6\h'|\n[3cl2]u'Octal number .nr 3bot \n[3bot]>?\n[.d] .sp |\n[3rs3]u .3rvpt 1 .sp |\n[3bot]u \*[3trans].nr 3brule 1 .3release .3keep .3rmk 3rt4 \*[3trans].nr 3crow 4 .3keep .mk 3rs4 .mk 3bot .3rvpt 0 .ta \n[3ce0]u \n[3ce2]u .lf 12 \&\h'|\n[3cl0]u'\f[I]c_mode\f[\n[3fnt]]\h'|(\n[3w1]u-\n[3lnw1]u-\n[3rnw1]u/2u+\n[3lnw1]u+\n[3cl1]u-\n[3tbw4,1]u)'6\h'|\n[3cl2]u'Octal number .nr 3bot \n[3bot]>?\n[.d] .sp |\n[3rs4]u .3rvpt 1 .sp |\n[3bot]u \*[3trans].nr 3brule 1 .3release .3keep .3rmk 3rt5 \*[3trans].nr 3crow 5 .3keep .mk 3rs5 .mk 3bot .3rvpt 0 .ta \n[3ce0]u \n[3ce2]u .lf 13 \&\h'|\n[3cl0]u'\f[I]c_uid\f[\n[3fnt]]\h'|(\n[3w1]u-\n[3lnw1]u-\n[3rnw1]u/2u+\n[3lnw1]u+\n[3cl1]u-\n[3tbw5,1]u)'6\h'|\n[3cl2]u'Octal number .nr 3bot \n[3bot]>?\n[.d] .sp |\n[3rs5]u .3rvpt 1 .sp |\n[3bot]u \*[3trans].nr 3brule 1 .3release .3keep .3rmk 3rt6 \*[3trans].nr 3crow 6 .3keep .mk 3rs6 .mk 3bot .3rvpt 0 .ta \n[3ce0]u \n[3ce2]u .lf 14 \&\h'|\n[3cl0]u'\f[I]c_gid\f[\n[3fnt]]\h'|(\n[3w1]u-\n[3lnw1]u-\n[3rnw1]u/2u+\n[3lnw1]u+\n[3cl1]u-\n[3tbw6,1]u)'6\h'|\n[3cl2]u'Octal number .nr 3bot \n[3bot]>?\n[.d] .sp |\n[3rs6]u .3rvpt 1 .sp |\n[3bot]u \*[3trans].nr 3brule 1 .3release .3keep .3rmk 3rt7 \*[3trans].nr 3crow 7 .3keep .mk 3rs7 .mk 3bot .3rvpt 0 .ta \n[3ce0]u \n[3ce2]u .lf 15 \&\h'|\n[3cl0]u'\f[I]c_nlink\f[\n[3fnt]]\h'|(\n[3w1]u-\n[3lnw1]u-\n[3rnw1]u/2u+\n[3lnw1]u+\n[3cl1]u-\n[3tbw7,1]u)'6\h'|\n[3cl2]u'Octal number .nr 3bot \n[3bot]>?\n[.d] .sp |\n[3rs7]u .3rvpt 1 .sp |\n[3bot]u \*[3trans].nr 3brule 1 .3release .3keep .3rmk 3rt8 \*[3trans].nr 3crow 8 .3keep .mk 3rs8 .mk 3bot .3rvpt 0 .ta \n[3ce0]u \n[3ce2]u .lf 16 \&\h'|\n[3cl0]u'\f[I]c_rdev\f[\n[3fnt]]\h'|(\n[3w1]u-\n[3lnw1]u-\n[3rnw1]u/2u+\n[3lnw1]u+\n[3cl1]u-\n[3tbw8,1]u)'6\h'|\n[3cl2]u'Octal number .nr 3bot \n[3bot]>?\n[.d] .sp |\n[3rs8]u .3rvpt 1 .sp |\n[3bot]u \*[3trans].nr 3brule 1 .3release .3keep .3rmk 3rt9 \*[3trans].nr 3crow 9 .3keep .mk 3rs9 .mk 3bot .3rvpt 0 .ta \n[3ce0]u \n[3ce2]u .lf 17 \&\h'|\n[3cl0]u'\f[I]c_mtime\f[\n[3fnt]]\h'|(\n[3w1]u-\n[3lnw1]u-\n[3rnw1]u/2u+\n[3lnw1]u+\n[3cl1]u-\n[3tbw9,1]u)'11\h'|\n[3cl2]u'Octal number .nr 3bot \n[3bot]>?\n[.d] .sp |\n[3rs9]u .3rvpt 1 .sp |\n[3bot]u \*[3trans].nr 3brule 1 .3release .3keep .3rmk 3rt10 \*[3trans].nr 3crow 10 .3keep .mk 3rs10 .mk 3bot .3rvpt 0 .ta \n[3ce0]u \n[3ce2]u .lf 18 \&\h'|\n[3cl0]u'\f[I]c_namesize\f[\n[3fnt]]\h'|(\n[3w1]u-\n[3lnw1]u-\n[3rnw1]u/2u+\n[3lnw1]u+\n[3cl1]u-\n[3tbw10,1]u)'6\h'|\n[3cl2]u'Octal number .nr 3bot \n[3bot]>?\n[.d] .sp |\n[3rs10]u .3rvpt 1 .sp |\n[3bot]u \*[3trans].nr 3brule 1 .3release .3keep .3rmk 3rt11 \*[3trans].nr 3crow 11 .3keep .mk 3rs11 .mk 3bot .3rvpt 0 .ta \n[3ce0]u \n[3ce2]u .lf 19 \&\h'|\n[3cl0]u'\f[I]c_filesize\f[\n[3fnt]]\h'|(\n[3w1]u-\n[3lnw1]u-\n[3rnw1]u/2u+\n[3lnw1]u+\n[3cl1]u-\n[3tbw11,1]u)'11\h'|\n[3cl2]u'Octal number .nr 3bot \n[3bot]>?\n[.d] .sp |\n[3rs11]u .3rvpt 1 .sp |\n[3bot]u \*[3trans].nr 3brule 1 .vs 2p>?\n[.V]u .ls 1 \v'.25m'\s[\n[3lps]]\h'|\n[3cd0]u'\D'l |\n[3cd3]u 0'\s0 .ls .vs \*[3trans].nr 3brule 0 .3release .3keep .3rmk 3rt12 .cp \n(3c .lf 21 .T& .cp 0 \*[3trans].nr 3crow 12 .3keep .mk 3rs12 .mk 3bot .3rvpt 0 .ta \n[3ce0]u \n[3ce1]u \n[3ce2]u .lf 24 pax.1p \&\h'|\n[3cl0]u'\f[B]Filename Field Name\f[\n[3fnt]]\h'|\n[3cl1]u'\f[B]Length\f[\n[3fnt]]\h'|\n[3cl2]u'\f[B]Interpreted as\f[\n[3fnt]] .nr 3bot \n[3bot]>?\n[.d] .sp |\n[3rs12]u .3rvpt 1 .sp |\n[3bot]u \*[3trans].nr 3brule 1 .vs 2p>?\n[.V]u .ls 1 \v'.25m'\s[\n[3lps]]\h'|\n[3cd0]u'\D'l |\n[3cd3]u 0'\s0 .ls .vs \*[3trans].nr 3brule 0 .3rvpt 0 \*[3trans].if 0<=\*[3quote]\n[3passed] .nr 3rt0 \*[3quote]\n[#T] \*[3trans].sp -1 \*[3trans]\v'.25m'\h'\n[3cd2]u'\s[\n[3lps]]\D'l 0 |\*[3quote]\n[3rt0]u-1v'\s0 \*[3trans].if 0<=\*[3quote]\n[3passed] .nr 3rt0 \*[3quote]\n[#T] \*[3trans].sp -1 \*[3trans]\v'.25m'\h'\n[3cd1]u'\s[\n[3lps]]\D'l 0 |\*[3quote]\n[3rt0]u-1v'\s0 .3rvpt 1 .3release .3keep .3rmk 3rt13 \*[3trans].nr 3crow 13 .3keep .mk 3rs13 .mk 3bot .3rvpt 0 .ta \n[3ce0]u \n[3ce1]u \n[3ce2]u .lf 26 \&\h'|\n[3cl0]u'\f[I]c_name\f[\n[3fnt]]\h'|\n[3cl1]u'\f[I]c_namesize\f[\n[3fnt]]\h'|\n[3cl2]u'Pathname string .nr 3bot \n[3bot]>?\n[.d] .sp |\n[3rs13]u .3rvpt 1 .sp |\n[3bot]u \*[3trans].nr 3brule 1 .vs 2p>?\n[.V]u .ls 1 \v'.25m'\s[\n[3lps]]\h'|\n[3cd0]u'\D'l |\n[3cd3]u 0'\s0 .ls .vs \*[3trans].nr 3brule 0 .3release .3keep .3rmk 3rt14 .cp \n(3c .lf 28 .T& .cp 0 \*[3trans].nr 3crow 14 .3keep .mk 3rs14 .mk 3bot .3rvpt 0 .ta \n[3ce0]u \n[3ce1]u \n[3ce2]u .lf 31 pax.1p \&\h'|\n[3cl0]u'\f[B]File Data Field Name\f[\n[3fnt]]\h'|\n[3cl1]u'\f[B]Length\f[\n[3fnt]]\h'|\n[3cl2]u'\f[B]Interpreted as\f[\n[3fnt]] .nr 3bot \n[3bot]>?\n[.d] .sp |\n[3rs14]u .3rvpt 1 .sp |\n[3bot]u \*[3trans].nr 3brule 1 .vs 2p>?\n[.V]u .ls 1 \v'.25m'\s[\n[3lps]]\h'|\n[3cd0]u'\D'l |\n[3cd3]u 0'\s0 .ls .vs \*[3trans].nr 3brule 0 .3rvpt 0 \*[3trans].if 14<=\*[3quote]\n[3passed] .nr 3rt14 \*[3quote]\n[#T] \*[3trans].sp -1 \*[3trans]\v'.25m'\h'\n[3cd2]u'\s[\n[3lps]]\D'l 0 |\*[3quote]\n[3rt14]u-1v'\s0 \*[3trans].if 14<=\*[3quote]\n[3passed] .nr 3rt14 \*[3quote]\n[#T] \*[3trans].sp -1 \*[3trans]\v'.25m'\h'\n[3cd1]u'\s[\n[3lps]]\D'l 0 |\*[3quote]\n[3rt14]u-1v'\s0 .3rvpt 1 .3release .3keep .3rmk 3rt15 \*[3trans].nr 3crow 15 .3keep .mk 3rs15 .mk 3bot .3rvpt 0 .ta \n[3ce0]u \n[3ce1]u \n[3ce2]u .lf 33 \&\h'|\n[3cl0]u'\f[I]c_filedata\f[\n[3fnt]]\h'|\n[3cl1]u'\f[I]c_filesize\f[\n[3fnt]]\h'|\n[3cl2]u'Data .nr 3bot \n[3bot]>?\n[.d] .sp |\n[3rs15]u .3rvpt 1 .sp |\n[3bot]u \*[3trans].nr 3brule 1 .3release .mk 3rt16 .nr 3brule 1 .nr T. 1 .T# .3trelease .3init .fc .cp \n(3c .lf 34 .TE