MANIFEST:

- Initial checkin. Explains what the various file here are.
TO.DO:
	- moved to 'devel' subdirectory
archives:
	- Initial checkin.  Shows breakdown of distribution disks.
headers:
	- made some updates.  This is probably really out of date.
new.syscalls:
	- deleted.  This information is now in the kernel reference manual,
	  so avoid duplication.
status.bin:
	- updated entries for ed, asml, assemble, cmpl, col, calendar.
status.lib:
	- updated entries for routines vsyslogmt, syslogmt, vis, and unvis.
	- updated entries for files syslog.c and vis.c
status.usrman:
	- Initial checkin.  This lists the status of the files in the
	  src/gno/usr.man directory hierarchy.
update.usrman:
	- Initial checkin.  A script to help keep status.usrman current.
This commit is contained in:
gdr-ftp 1999-01-09 21:28:35 +00:00
parent 63c3c2629c
commit d964ac088f
9 changed files with 328 additions and 193 deletions

21
NOTES/MANIFEST Normal file
View File

@ -0,0 +1,21 @@
INSTALL Explains how to install the binary distribution. (Obsolete.)
MANIFEST This file.
README.beta Out of date notes. (Obsolete.)
README.src Out of date notes. (Obsolete.)
archives Shows the breakdown of how the GNO binary distribution
is currently shipped.
devel Directory containing notes intended for developers working
on the base distribution.
deviations Lists the ways in which GNO is known to deviate from
the POSIX specification and/or the BSD implementations
on which components of GNO are based.
headers These are some notes on how headers have changed from
v2.0.4 to v2.0.6
notes.960227 Notes to Derek. Should be moved/updated. (Obsolete.)
status.bin This lists the status of the various programs in the base
distribution.
status.lib This lists the status of the routines in the libraries of
the base distribution.
status.usrman This lists the status of the files in the src/gno/usr.man
directory hierarchy.
update.usrman This is a script to help keep status.usrman current.

View File

@ -1,159 +0,0 @@
*******
* soon
*
* $Id: TO.DO,v 1.8 1998/10/31 19:14:49 gdr-ftp Exp $
*
*******
When building the binary release, include all the system stuff like
GNOSnooper, et al.
We need a namespace(5) manual page. Here is a "bugs" entry for it:
Apropos of building a bootable system, I've also encountered another
bug. One cannot use a "partition" defined in /etc/namespace as the
home directory for any user. For example, one cannot use "/root" as
root's home directory unless it is a real volume. The symptoms of
this are:
1. You will get a error about "Device not found"
2. The user's gshrc file will not have been sourced.
Make the source *.shk archive on trenco use proper file types.
The header files <curses.h>, <sys/termios.h>, and <sys/ioctl.compat.h>
have conflicting definitions for FLUSHO.
newuser, newuserv:
- update to use /home vice /user or maybe a conf file
- check out behavior of 'adduser', see if there's anything
missing
vfscanf.c:
After a reasonable time, disable the assert calls.
Finish index in kernel reference manual.
in stack(3) man page, the user shouldn't have to allow for extra
bytes for _assertStack(3). Determine what is necessary. If the
number of bytes left is less than this value, then print out
an abbreviated error message rather than calling errx.
Add implementations for Tilghman:
strftime(3)
Create a src/gno/build.tools/mklink script for duplicating binary
files at user install time. Current packages that need this:
compress/zcat
sum/cksum
As a group:
Update utmp.5, libutil (logout, logwtmp), last(1), login(1), who(1),
w(1), init(8), _PATH_UTMP (<utmp.h> and FAQ), rwho(1), users(1)
Add to relevent util man pages:
.SH ATTRIBUTIONS
This command was ported from FreeBSD source code
for distribution with GNO/ME 2.0.6.
stdio:
- add %b modifier to fprintf implementation (ORCA/C compatibility)
stdlib/cvt.c:
- handle modes 0 and 1 correctly.
Use result of _setModeEmulation(3) in appropriate calls. These include
chmod -
fchmod -
creat - done
open - done
stat - unnecessary
fstat - unnecessary
lstat - unnecessary
check up on the type of nlink_t, used in stat(2)
Write a test that handles:
- negative process numbers
- process numbers exceeding INT_MAX and UINT_MAX
the easiest way to do this is to repeatedly exec a program that prints
it's process number. Keep doing so until either the number wraps or
the machine crashes.
libc/sys/exec.c:
buildCmd should single-quote strings containing whitespace.
If the string already has single quotes, then backspace them.
buildPath should only return files of type S16, EXEC, or EXE.
buildPath should use the mapPath facility.
These functions should operate closer to GS/OS when possible.
Also need to reduce stack requirements.
For the exec* functions, there should be a test for whether
or not the file is of type SRC and auxtype EXEC. If that
is the case, and if the first two characters of the file
are '#!', then the shell should be exec'd instead. (currently,
shell scripts cannot be exec'd)
NEED TO WRITE OR DUPLICATE MAN PAGES FOR
----------------------------------------
login libc(3)
login_tty
regexp libc(3)
termcap libc(3)
queue 3
tty 4
grp 5
passwd 5
termcap 5
ms 7
man 7
cron 8
runover 8 (obsolete?) No, needed for single user mode.
dialup 8
*******
* defer
*******
investigate using dynamic libraries (RTLs)
libc/sys/syscall.c:
for unlink, if file is open, then register a call to unlink
(non-recursive) the file via atexit(3)
[not practical?]
libc/gen/environ.c:
Review routines. Force them to use GSString routines, reduce
stack usage (depend on dynamic allocation for parm blocks).
libc/gen/err.c:
Use syslogd if not on a tty.
libc/gen/tty.c:
review these routines
do intro man pages:
1 done
2 review DEFINITIONS section
3 done
4 done
5 done
6 done
7 done
8 done
Add locale implementation to libc.
various man pages:
add note under COMPATIBILITY as to whether the routines
are thread-safe. If they write any globals or static
variables, they are not.
Verify that the setdebug(2) macros in gno/gno.h are correct.
Add implementations for execle; the final
envp can't appear in the prototype, but it can be found since it is
the last argument after the first NULL pointer.

24
NOTES/archives Normal file
View File

@ -0,0 +1,24 @@
$Id: archives,v 1.1 1999/01/09 21:28:35 gdr-ftp Exp $
A GNO "release" is shipped (so to speak) as a set of NuFX (*.shk) archives.
This is the breakdown of each NuFX archive:
gnoboot.shk /gno.boot (entire volume)
gno.01.shk /kern
/initrc
/lib
gno.02.shk /bin (utils a-f)
gno.03.shk /bin (utils g-m)
gno.04.shk /bin (utils n-s)
gno.05.shk /bin (utils t-z)
gno.06.shk /usr/bin (utils a-f)
gno.07.shk /usr/bin (utils g-m)
gno.08.shk /usr/bin (utils n-s)
gno.09.shk /usr/bin (utils t-z)
gno.10.shk /usr/include
gno.11.shk /usr/man/man1
gno.12.shk /usr/man/man2
gno.13.shk /usr/man/man3
gno.14.shk /usr/man/man[45678]
gno.15.shk /usr (remaining files)
gno.16.shk / (remaining files)

View File

@ -1,9 +1,10 @@
$Id: headers,v 1.1 1997/02/28 05:42:26 gdr Exp $ $Id: headers,v 1.2 1999/01/09 21:28:35 gdr-ftp Exp $
A hash prefix indicates that it has passed the compile test. An "[Orca]" A hash prefix indicates that it has passed the compile test. An "[Orca]"
indicates that the file is modified from an Orca/C header rather than indicates that the file is modified from an Orca/C header rather than
from either BSD or custom sources. from either BSD or custom sources.
This file is probably out of date; feel free to submit corrections.
# curses.h changed hash type from u_int to u_long # curses.h changed hash type from u_int to u_long
# db.h various macros have changed. # db.h various macros have changed.
@ -17,7 +18,7 @@ from either BSD or custom sources.
# glob.h # glob.h
# gno/conf.h # gno/conf.h
# gno/gno.h # gno/gno.h
gno/kerntool.h INCOMPLETE CHANGES -- OBSOLETE? gno/kerntool.h INCOMPLETE CHANGES
# gno/kvm.h # gno/kvm.h
# gno/proc.h # gno/proc.h
# gno/sim.h # gno/sim.h
@ -44,7 +45,7 @@ from either BSD or custom sources.
# sgtty.h # sgtty.h
# signal.h # signal.h
# stddef.h # stddef.h
# stdio.h [Orca] *** critical that __ORCAC_VERSION is correct # stdio.h *** upgraded to BSD 4.4 (incompatible downward)
# stdlib.h # stdlib.h
# string.h * check need for "const" in non-BSD, non-ORCA routines # string.h * check need for "const" in non-BSD, non-ORCA routines
# sys/cdefs.h # sys/cdefs.h

View File

@ -1,21 +0,0 @@
System calls new in v2.0.6
==========================
select $4303
InstallNetDriver $4403
socket $4503
bind $4603
connect $4703
listen $4703
accept $4903
recvfrom $4A03
sendto $4B03
recv $4C03
send $4D03
getpeername $4E03
getsockname $4F03
getsockopt $5003
setsockopt $5103
shutdown $5203
setreuid $5303
setregid $5403

View File

@ -11,7 +11,7 @@
* * * *
* Devin Reade, 10 April 1998. * * Devin Reade, 10 April 1998. *
* * * *
* $Id: status.bin,v 1.17 1998/10/31 19:14:49 gdr-ftp Exp $ * * $Id: status.bin,v 1.18 1999/01/09 21:28:35 gdr-ftp Exp $ *
* * * *
************************************************************************* *************************************************************************
@ -100,7 +100,7 @@ Program 204 Req Owner Source Man Compile Test Target Target [Note] Comments
/bin/domainname /bin/domainname
/bin/du Y Y evan Y /bin/du Y Y evan Y
/bin/echo N Y dt /bin/echo N Y dt
/bin/ed /bin/ed N . mober . . . . . . # avail separately (trenco)
/bin/edit Y Y Y /bin/edit Y Y Y
/bin/egrep Y Y evan /bin/egrep Y Y evan
/bin/expr /bin/expr
@ -213,8 +213,8 @@ Program 204 Req Owner Source Man Compile Test Target Target [Note] Comments
/usr/bin/apply N N /usr/bin/apply N N
/usr/bin/apropos N Y gdr Y T Y Y Y RI (man) /usr/bin/apropos N Y gdr Y T Y Y Y RI (man)
/usr/bin/ar N N /usr/bin/ar N N
/usr/bin/asml N Y gdr Y T Y Y Y RI /usr/bin/asml N Y gdr Y T Y Y Y RI (compile)
/usr/bin/assemble N Y gdr Y T Y Y Y RI /usr/bin/assemble N Y gdr Y T Y Y Y RI (compile)
/usr/bin/at . . sr /usr/bin/at . . sr
/usr/bin/aw30 Y . . Y . . . Y /usr/bin/aw30 Y . . Y . . . Y
/usr/bin/awk N Y dave Y T T T Y RI /usr/bin/awk N Y dave Y T T T Y RI
@ -227,9 +227,9 @@ Program 204 Req Owner Source Man Compile Test Target Target [Note] Comments
/usr/bin/catrez N Y dave Y T Y Y Y RI /usr/bin/catrez N Y dave Y T Y Y Y RI
/usr/bin/cclean N Y sonk /usr/bin/cclean N Y sonk
/usr/bin/cksum N Y dave Y Y Y Y Y RI /usr/bin/cksum N Y dave Y Y Y Y Y RI
/usr/bin/cmpl Y Y gdr Y T Y Y Y RI /usr/bin/cmpl Y Y gdr Y T Y Y Y RI (compile)
/usr/bin/coff N Y /usr/bin/coff N Y
/usr/bin/col /usr/bin/col N . mober . . . . . . # avail separately (trenco)
/usr/bin/colcrt N Y sr Y T Y Y Y RI /usr/bin/colcrt N Y sr Y T Y Y Y RI
/usr/bin/column N . mober /usr/bin/column N . mober
/usr/bin/compile Y Y gdr Y T Y Y Y RI /usr/bin/compile Y Y gdr Y T Y Y Y RI
@ -328,7 +328,7 @@ Program 204 Req Owner Source Man Compile Test Target Target [Note] Comments
/usr/bin/yankit Y Y /usr/bin/yankit Y Y
/usr/bin/zsh N Y lb # renamed to nosh /usr/bin/zsh N Y lb # renamed to nosh
/usr/games Y Y gdr dir - - - - Y /usr/games Y Y gdr dir - - - - Y
/usr/games/calendar N Y ma Y T Y Y Y /usr/games/calendar N Y ma Y T Y Y Y RI
/usr/games/wump Y /usr/games/wump Y
/usr/include Y Y gdr dir - - - - Y /usr/include Y Y gdr dir - - - - Y
/usr/lib Y Y gdr dir - - - - Y /usr/lib Y Y gdr dir - - - - Y

View File

@ -1,4 +1,4 @@
$Id: status.lib,v 1.7 1998/10/31 19:14:49 gdr-ftp Exp $ $Id: status.lib,v 1.8 1999/01/09 21:28:35 gdr-ftp Exp $
Key for Code Status column: Key for Code Status column:
R == reviewed R == reviewed
@ -81,7 +81,7 @@ syslogmt libc/gen/syslog.c T 3 sys/syslog.h
tcnewpgrp libc/sys/trap.asm C 2 gno/gno.h tcnewpgrp libc/sys/trap.asm C 2 gno/gno.h
tctpgrp libc/sys/trap.asm C 2 gno/gno.h tctpgrp libc/sys/trap.asm C 2 gno/gno.h
vsprintmt libc/gno/sprintmt.c T 3 gno/gno.h vsprintmt libc/gno/sprintmt.c T 3 gno/gno.h
vyslogmt libc/gen/syslog.c T 3 sys/syslog.h vsyslogmt libc/gen/syslog.c T 3 sys/syslog.h
~GNO_COMMAND libc/gno/gnocmd.asm C 3 na ~GNO_COMMAND libc/gno/gnocmd.asm C 3 na
~GNO_FREEARG libc/gno/parsearg.asm C 3 na ~GNO_FREEARG libc/gno/parsearg.asm C 3 na
~GNO_PARSEARG libc/gno/parsearg.asm C 3 na ~GNO_PARSEARG libc/gno/parsearg.asm C 3 na
@ -370,6 +370,7 @@ umask libc/sys/syscall.c C 2 sys/stat.h
ungetc libc/stdio/ungetc.c C 3 stdio.h ungetc libc/stdio/ungetc.c C 3 stdio.h
unlink libc/sys/syscall.c T 2 unistd.h unlink libc/sys/syscall.c T 2 unistd.h
unsetenv libc/gen/environ.c T 3 stdlib.h unsetenv libc/gen/environ.c T 3 stdlib.h
unvis libc/gen/unvis.c C 3 vis.h
user_from_uid libc/gen/pwcache.c C 3 na user_from_uid libc/gen/pwcache.c C 3 na
utime libc/gen/utime.c T 3 sys/time.h utime libc/gen/utime.c T 3 sys/time.h
utimes libc/gen/utime.c T 2 utime.h utimes libc/gen/utime.c T 2 utime.h
@ -378,6 +379,7 @@ verrx libc/gen/err.c T 3 err.h
vfork libc/sys/trap.asm C 2 unistd.h vfork libc/sys/trap.asm C 2 unistd.h
vfprintf libc/stdio/vfprintf.c C 3 stdio.h vfprintf libc/stdio/vfprintf.c C 3 stdio.h
vfscanf libc/stdio/vfscanf.c C 3 stdio.h vfscanf libc/stdio/vfscanf.c C 3 stdio.h
vis libc/gen/vis.c C 3 vis.h
vprintf libc/stdio/vprintf.c C 3 stdio.h vprintf libc/stdio/vprintf.c C 3 stdio.h
vscanf libc/stdio/fscanf.c C 3 stdio.h vscanf libc/stdio/fscanf.c C 3 stdio.h
vsnprintf libc/stdio/vsnprintf.c C 3 stdio.h vsnprintf libc/stdio/vsnprintf.c C 3 stdio.h
@ -439,10 +441,11 @@ BANK MODEL COMPLETE
na na N N libc/gen/setjmp.asm na na N N libc/gen/setjmp.asm
78 0 0 Y N libc/gen/siglist.c 78 0 0 Y N libc/gen/siglist.c
78 0 0 Y Y libc/gen/sleep.c 78 0 0 Y Y libc/gen/sleep.c
na na Y N libc/gen/syslog.c 78 0 0 Y N libc/gen/syslog.c
na na Y N libc/gen/syslog2.asm [superceded by syslog.c] na na Y N libc/gen/syslog2.asm [superceded by syslog.c]
78 0 0 Y N libc/gen/tty.c 78 0 0 Y N libc/gen/tty.c
78 0 0 Y Y libc/gen/utime.c 78 0 0 Y Y libc/gen/utime.c
-1 0 0 Y N libc/gen/vis.c
na na N N libc/gno/gnocmd.asm na na N N libc/gno/gnocmd.asm
78 0 0 (1) Y Y libc/gno/gnomisc.c 78 0 0 (1) Y Y libc/gno/gnomisc.c

194
NOTES/status.usrman Normal file
View File

@ -0,0 +1,194 @@
#
# $Id: status.usrman,v 1.1 1999/01/09 21:28:35 gdr-ftp Exp $
#
# This file shows a listing of all the man pages in /src/gno/usr.man
# and what their status is. The formatting should be checked on both
# a linux machine (that being what creates the online version of the
# documentation, and under GNO on the GS using nroff.
#
# In each of the fields, the following characters have the following
# meanings:
# 'y' means that the condition has been checked and found to
# be satisfactory.
# 'n' means that something is known to be wrong with meeting
# the condition, and it has not yet been fixed. There
# shouldn't be many if any of these; problems should be
# fixed as they are located.
# '.' is a space holder to ease in the translation of this file
# to HTML format, and indicates a condition that has not yet
# been checked.
# '-' in the mkso column indicates that no mkso entries are
# needed for this particular man page (ie: that the column
# is irrelevent).
#
# Verifying the man page can be done on both machines using the following
# command:
# nroff -man filename | more
#
# This file can be checked for consistency with the update.usrman script
# in the /src/gno/NOTES directory.
#
# Devin Reade, April 1998.
#
### Do not remove this line. ###
#
# formatting formatting mkso entries
# man page checked (linux) checked (IIgs) exist
# ----------------------------------------------------------------
man1/intro.1 . y -
man2/accept.2 . y -
man2/access.2 . y -
man2/alarm.2 . y y
man2/bind.2 . y -
man2/chdir.2 . y y
man2/chmod.2 . y y
man2/close.2 . y -
man2/connect.2 . y -
man2/creat.2 . y -
man2/dup.2 . y y
man2/execve.2 . y y
man2/fcntl.2 . . .
man2/fork.2 . y y
man2/fsync.2 . y -
man2/getdtablesize.2 . y -
man2/getgid.2 . y y
man2/getlogin.2 . . .
man2/getpeername.2 . y -
man2/getpgrp.2 . y y
man2/getpid.2 . y y
man2/getsockname.2 . . .
man2/getsockopt.2 . . .
man2/gettimeofday.2 . . .
man2/getuid.2 . . .
man2/intro.2 . . -
man2/ioctl.2 . . .
man2/jobcontrol.2 . . .
man2/kernStatus.2 . . .
man2/kill.2 . . .
man2/listen.2 . . .
man2/lseek.2 . . .
man2/mkdir.2 . . .
man2/open.2 . . .
man2/pipe.2 . . .
man2/ports.2 . . .
man2/procsend.2 . . .
man2/read.2 . . .
man2/recv.2 . . .
man2/rename.2 . . .
man2/rmdir.2 . . .
man2/select.2 . . .
man2/semaphore.2 . . .
man2/send.2 . . .
man2/setdebug.2 . . .
man2/setpgid.2 . . .
man2/setregid.2 . . .
man2/setreuid.2 . . .
man2/setruid.2 . . .
man2/setuid.2 . . .
man2/shutdown.2 . . .
man2/sigblock.2 . . .
man2/signal.2 . . .
man2/sigpause.2 . . .
man2/sigsetmask.2 . . .
man2/socket.2 . . .
man2/stat.2 . . .
man2/statfs.2 . . .
man2/times.2 . . .
man2/truncate.2 . . .
man2/umask.2 . . .
man2/undocumented.2 . . .
man2/unlink.2 . . .
man2/utimes.2 . . .
man2/wait.2 . . .
man2/write.2 . . .
man3/GSString.3 . . .
man3/basename.3 . . .
man3/bcopy.3 . . .
man3/buildCmd.3 . . .
man3/buildEnv.3 . . .
man3/buildPath.3 . . .
man3/bzero.3 . . .
man3/clearerr.3 . . .
man3/crypt.3 . . .
man3/directory.3 . . .
man3/ecvt.3 . . .
man3/err.3 . . .
man3/exec.3 . . .
man3/execl.3 . . .
man3/exit.3 . . .
man3/fclose.3 . . .
man3/fflush.3 . . .
man3/fgetln.3 . . .
man3/fgets.3 . . .
man3/fnmatch.3 . . .
man3/fopen.3 . y .
man3/fputs.3 . . .
man3/fread.3 . . .
man3/fseek.3 . . .
man3/fsettext.3 . . .
man3/fts.3 . . .
man3/funopen.3 . . .
man3/getc.3 . . .
man3/getcwd.3 . . .
man3/getenv.3 . . .
man3/getgrent.3 . . .
man3/gethostname.3 . . .
man3/getopt.3 . . .
man3/getpass.3 . . .
man3/getpwent.3 . . .
man3/getsubopt.3 . . .
man3/getttyent.3 . . .
man3/index.3 . . .
man3/intro.3 . . -
man3/isRootPath.3 . . .
man3/isblank.3 . . .
man3/isinf.3 . . .
man3/mapErr.3 . . .
man3/mapMode.3 . . .
man3/mapPath.3 . . .
man3/mktemp.3 . . .
man3/needsgno.3 . . .
man3/parsearg.3 . . .
man3/pause.3 . . .
man3/popen.3 . . .
man3/printf.3 . . .
man3/progname.3 . . .
man3/psignal.3 . . .
man3/putc.3 . . .
man3/pwcache.3 . . .
man3/queue.3 . . .
man3/raise.3 . . .
man3/regex.3 . . .
man3/remove.3 . . .
man3/scandir.3 . . .
man3/scanf.3 . . .
man3/setbuf.3 . . .
man3/setjmp.3 . . .
man3/sleep.3 . . .
man3/sprintmt.3 . . .
man3/stack.3 . . .
man3/stdio.3 . . .
man3/strcasecmp.3 . . .
man3/strdup.3 . . .
man3/strerror.3 . . .
man3/strsep.3 . . .
man3/stty.3 . . .
man3/syslog.3 . . .
man3/tmpnam.3 . . .
man3/ttyname.3 . . .
man3/uname.3 . . .
man3/ungetc.3 . . .
man3/unvis.3 . . .
man3/utime.3 . . .
man3/vis.3 . . .
man4/intro.4 . . -
man4/tty.4 . . .
man5/intro.5 . . -
man5/utmp.5 . . .
man6/intro.6 . . -
man7/environ.7 . . .
man7/intro.7 . . -
man7/re.format.7 . . .
man8/init.8 . . .
man8/intro.8 . . -
man8/syslogd.8 . . .

72
NOTES/update.usrman Executable file
View File

@ -0,0 +1,72 @@
#! /usr/bin/perl
#
# This script is used to verify that the status.usrman file is current,
# at least with respect to which manpages are checked into the src/gno/usr.man
# directory hierarchy.
#
# Usage: update.usrman < status.usrman > output
#
# In other words, it doesn't update the status.usrman file directly; the
# output file would then have to be copied back to the original name, assuming
# that it is satisfactory.
#
# Read the input file for existing entries. Don't modify these.
#
while (<>) {
chomp;
if (m,^(man\S+)(.*),) {
$entries{$1} = $2;
} else {
$header .= $_ . "\n";
}
}
#
# Now get the list of checked in files. We do this by parsing the CVS/Entries
# files directly.
#
@chapters = ( '1', '2', '3', '4', '5', '6', '7', '8' );
foreach $c (@chapters) {
$file = "../usr.man/man$c/CVS/Entries";
open(fp, "< $file") || die("couldn't open $file: $!");
while (<fp>) {
if (m,^/([^/]+\.$c)/,) {
$page = "man$c/$1";
$cvs{$page} = '';
}
}
close(fp);
}
#
# Do some conchecks
#
@keylist_old = sort(keys(%entries));
for $k (@keylist_old) {
defined($cvs{$k}) ||
printf(stderr "Warning: page in input file but not checked in: %s\n",
$k);
}
#
# Do some updates
#
@keylist_new = sort(keys(%cvs));
for $k (@keylist_new) {
defined($entries{$k}) || ($entries{$k} = "\t\t.\t\t.\t\t.");
}
#
# Now print out the result.
#
print $header;
@keylist = sort(keys(%entries));
foreach $k (@keylist) {
if ($entries{$k} =~ m,^\s*$,) {
$entries{$k} = "\t\t.\t\t.\t\t.";
}
printf("%s%s\n", $k, $entries{$k});
}