summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2006-12-23 00:30:12 +0000
committerCharles.Forsyth <devnull@localhost>2006-12-23 00:30:12 +0000
commit6e425a9de8c003b5a733621a6b6730ec3cc902b8 (patch)
tree314123bcab78ff295f38f85f31dc141e5fe22d15
parent74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a (diff)
20061220
-rw-r--r--CHANGES78
-rwxr-xr-xFreeBSD/386/bin/data2cbin40729 -> 40729 bytes
-rwxr-xr-xFreeBSD/386/bin/mkbin160607 -> 160607 bytes
-rwxr-xr-xFreeBSD/386/bin/yaccbin94814 -> 94814 bytes
-rwxr-xr-xIrix/mips/bin/mkbin272072 -> 272072 bytes
-rwxr-xr-xIrix/mips/bin/mkextbin150136 -> 150136 bytes
-rwxr-xr-xIrix/mips/bin/yaccbin198184 -> 198184 bytes
-rw-r--r--LICENCE6
-rwxr-xr-xLinux/386/bin/data2cbin50083 -> 51457 bytes
-rwxr-xr-xLinux/386/bin/mkbin190738 -> 193552 bytes
-rw-r--r--Linux/386/bin/mkextbin0 -> 83755 bytes
-rwxr-xr-xLinux/386/bin/yaccbin111379 -> 113053 bytes
-rw-r--r--Linux/arm/include/fpuctl.h52
-rw-r--r--Linux/arm/include/lib9.h497
-rw-r--r--MacOSX/README8
-rwxr-xr-xMacOSX/power/bin/data2cbin25616 -> 31528 bytes
-rwxr-xr-xMacOSX/power/bin/mkbin76736 -> 78020 bytes
-rwxr-xr-xMacOSX/power/bin/yaccbin65948 -> 67740 bytes
-rwxr-xr-xNt/386/bin/c2l.exebin225280 -> 225280 bytes
-rwxr-xr-xNt/386/bin/cp.exebin61440 -> 61440 bytes
-rwxr-xr-xNt/386/bin/data2c.exebin53248 -> 53248 bytes
-rwxr-xr-xNt/386/bin/echo.exebin49152 -> 49152 bytes
-rwxr-xr-xNt/386/bin/format.exebin65536 -> 65536 bytes
-rwxr-xr-xNt/386/bin/mkdir.exebin49152 -> 49152 bytes
-rwxr-xr-xNt/386/bin/mkext.exebin69632 -> 69632 bytes
-rwxr-xr-xNt/386/bin/mv.exebin61440 -> 61440 bytes
-rwxr-xr-xNt/386/bin/rm.exebin57344 -> 57344 bytes
-rwxr-xr-xNt/386/bin/sed.exebin77824 -> 77824 bytes
-rwxr-xr-xNt/386/bin/test.exebin61440 -> 61440 bytes
-rwxr-xr-xNt/386/bin/tr.exebin53248 -> 53248 bytes
-rwxr-xr-xNt/386/bin/yacc.exebin86016 -> 86016 bytes
-rwxr-xr-xNt/386/include/lib9.h4
-rwxr-xr-xSolaris/sparc/bin/data2cbin261272 -> 261272 bytes
-rwxr-xr-xSolaris/sparc/bin/mkbin826928 -> 826928 bytes
-rwxr-xr-xSolaris/sparc/bin/mkextbin424500 -> 424500 bytes
-rwxr-xr-xSolaris/sparc/bin/yaccbin421936 -> 421936 bytes
-rw-r--r--acme/mail/Mailpop3.disbin18989 -> 19083 bytes
-rw-r--r--appl/acme/acme/mail/src/Mailpop3.b20
-rw-r--r--appl/charon/build.b4
-rw-r--r--appl/charon/http.b2
-rw-r--r--appl/charon/layout.b4
-rwxr-xr-xappl/cmd/fortune.b4
-rw-r--r--appl/cmd/limbo/com.b2
-rw-r--r--appl/cmd/limbo/ecom.b2
-rw-r--r--appl/cmd/limbo/lex.b1
-rw-r--r--appl/cmd/limbo/limbo.b825
-rw-r--r--appl/cmd/limbo/limbo.y1
-rw-r--r--appl/cmd/limbo/typecheck.b6
-rw-r--r--appl/cmd/mk/mk.b11
-rw-r--r--appl/cmd/mkfile5
-rw-r--r--appl/cmd/os.b53
-rw-r--r--appl/cmd/test.b370
-rw-r--r--appl/lib/chanfill.b34
-rw-r--r--appl/lib/dis.b2
-rw-r--r--appl/lib/mkfile3
-rw-r--r--appl/lib/newns.b16
-rw-r--r--appl/lib/pop3.b14
-rw-r--r--appl/lib/sets.b2
-rw-r--r--appl/lib/sets32.b2
-rw-r--r--appl/lib/venti.b6
-rw-r--r--appl/lib/w3c/mkfile2
-rw-r--r--appl/lib/w3c/xpointers.b2
-rw-r--r--appl/lib/xml.b21
-rw-r--r--appl/svc/httpd/mkfile3
-rw-r--r--appl/svc/webget/date.b24
-rw-r--r--appl/svc/webget/http.b49
-rw-r--r--appl/svc/webget/webget.b2
-rw-r--r--appl/svc/webget/wgutils.b10
-rw-r--r--appl/svc/webget/wgutils.m2
-rw-r--r--appl/wm/sh.b31
-rw-r--r--appl/wm/unibrowse.b26
-rw-r--r--asm/asm.y6
-rw-r--r--dis/ar.disbin0 -> 10395 bytes
-rw-r--r--dis/cddb.disbin0 -> 4483 bytes
-rw-r--r--dis/charon/build.disbin38630 -> 38649 bytes
-rw-r--r--dis/charon/http.disbin12032 -> 12056 bytes
-rw-r--r--dis/charon/layout.disbin67609 -> 67654 bytes
-rw-r--r--dis/ebook/ebook.disbin29845 -> 29855 bytes
-rw-r--r--dis/ebook/oebpackage.disbin4387 -> 4387 bytes
-rw-r--r--dis/fortune.disbin1743 -> 1743 bytes
-rw-r--r--dis/lib/chanfill.disbin404 -> 356 bytes
-rw-r--r--dis/lib/csv.disbin0 -> 663 bytes
-rw-r--r--dis/lib/dis.disbin7147 -> 7147 bytes
-rw-r--r--dis/lib/newns.disbin6998 -> 7041 bytes
-rw-r--r--dis/lib/pop3.disbin3422 -> 3377 bytes
-rw-r--r--dis/lib/rfc822.disbin0 -> 5557 bytes
-rw-r--r--dis/lib/sets.disbin3360 -> 3360 bytes
-rw-r--r--dis/lib/sets32.disbin2051 -> 2051 bytes
-rw-r--r--dis/lib/w3c/uris.disbin0 -> 3822 bytes
-rw-r--r--dis/lib/xml.disbin8324 -> 8385 bytes
-rw-r--r--dis/limbo.disbin343078 -> 343171 bytes
-rw-r--r--dis/lookman18
-rw-r--r--dis/lookman.disbin2861 -> 0 bytes
-rw-r--r--dis/man2html.disbin0 -> 15911 bytes
-rw-r--r--dis/mk.disbin58674 -> 58835 bytes
-rw-r--r--dis/os.disbin3321 -> 3690 bytes
-rw-r--r--dis/shutdown18
-rw-r--r--dis/shutdown.disbin673 -> 0 bytes
-rw-r--r--dis/svc/webget/http.disbin9923 -> 10161 bytes
-rw-r--r--dis/svc/webget/webget.disbin5594 -> 5601 bytes
-rw-r--r--dis/svc/webget/wgutils.disbin4062 -> 4151 bytes
-rw-r--r--dis/test.disbin3178 -> 4189 bytes
-rw-r--r--dis/wm/dmwm.disbin2943 -> 2943 bytes
-rw-r--r--dis/wm/sh.disbin15488 -> 15872 bytes
-rw-r--r--dis/wm/unibrowse.disbin17138 -> 17336 bytes
-rw-r--r--doc/install.ms2
-rw-r--r--emu/FreeBSD/asm-386.S3
-rw-r--r--emu/FreeBSD/cmd.c25
-rw-r--r--emu/FreeBSD/ipif.c5
-rw-r--r--emu/Hp/cmd.c26
-rw-r--r--emu/Irix/cmd.c26
-rw-r--r--emu/Linux/asm-386.S6
-rw-r--r--emu/Linux/asm-arm.S131
-rw-r--r--emu/Linux/asm-power.S72
-rw-r--r--emu/Linux/cmd.c26
-rw-r--r--emu/Linux/emu-g96
-rw-r--r--emu/Linux/mkfile2
-rw-r--r--emu/Linux/os.c12
-rw-r--r--emu/Linux/segflush-power.c27
-rw-r--r--emu/MacOSX/NOTICE1
-rw-r--r--emu/MacOSX/asm-386.s28
-rw-r--r--emu/MacOSX/cmd.c25
-rw-r--r--emu/MacOSX/mkfile5
-rw-r--r--emu/MacOSX/os.c2
-rw-r--r--emu/NOTICE1
-rw-r--r--emu/Nt/cmd.c84
-rw-r--r--emu/Nt/os.c105
-rw-r--r--emu/Nt/win.c130
-rw-r--r--emu/Plan9/cmd.c29
-rw-r--r--emu/Plan9/win.c69
-rw-r--r--emu/Solaris/cmd.c28
-rw-r--r--emu/Unixware/cmd.c28
-rw-r--r--emu/mkfile2
-rw-r--r--emu/port/chan.c1
-rw-r--r--emu/port/dev.c2
-rw-r--r--emu/port/devcmd.c88
-rw-r--r--emu/port/devcons.c334
-rw-r--r--emu/port/devmem.c1
-rw-r--r--emu/port/devprof.c18
-rw-r--r--emu/port/error.h3
-rw-r--r--emu/port/exportfs.c2
-rw-r--r--emu/port/fns.h2
-rw-r--r--emu/port/inferno.c3
-rw-r--r--fonts/LICENCE73
-rw-r--r--fonts/README.FONTS2
-rw-r--r--include/interp.h3
-rw-r--r--include/version.h2
-rw-r--r--lib/games/fortunes8
-rw-r--r--lib/games/fortunes.indexbin0 -> 32 bytes
-rw-r--r--lib/proto/FreeBSD3
-rw-r--r--lib/proto/Hp2
-rw-r--r--lib/proto/Irix2
-rw-r--r--lib/proto/Linux8
-rw-r--r--lib/proto/MacOSX25
-rw-r--r--lib/proto/Nt2
-rw-r--r--lib/proto/Plan92
-rw-r--r--lib/proto/Solaris2
-rw-r--r--lib/proto/inferno24
-rw-r--r--lib/proto/utils5
-rw-r--r--lib9/getcallerpc-Linux-386.S1
-rw-r--r--lib9/utfecpy.c2
-rw-r--r--libinterp/ipint.c157
-rw-r--r--libinterp/keyring.h6
-rw-r--r--libinterp/runt.h39
-rw-r--r--libkern/utfecpy.c2
-rw-r--r--liblogfs/NOTICE28
-rw-r--r--libmath/FPcontrol-MacOSX.c16
-rw-r--r--libmemdraw/draw.c2
-rw-r--r--libmp/port/mptouv.c2
-rw-r--r--libtk/textu.c2
-rw-r--r--libtk/textw.c12
-rw-r--r--libtk/tindx.c3
-rw-r--r--libtk/utils.c1
-rw-r--r--libtk/windw.c1
-rw-r--r--limbo/com.c2
-rw-r--r--limbo/decls.c2
-rw-r--r--limbo/ecom.c4
-rw-r--r--limbo/lex.c1
-rw-r--r--limbo/limbo.y1
-rw-r--r--limbo/optim.c2
-rw-r--r--limbo/sbl.c1
-rw-r--r--limbo/typecheck.c8
-rw-r--r--limbo/types.c12
-rw-r--r--man/1/INDEX2
-rw-r--r--man/1/ar163
-rw-r--r--man/1/man49
-rw-r--r--man/1/os18
-rw-r--r--man/1/sh12
-rw-r--r--man/1/sh-expr21
-rw-r--r--man/1/sh-std7
-rw-r--r--man/1/sh-tk25
-rw-r--r--man/2/INDEX7
-rw-r--r--man/2/csv58
-rw-r--r--man/2/fsproto1
-rw-r--r--man/2/keyring-ipint29
-rw-r--r--man/2/pop311
-rw-r--r--man/2/rfc822327
-rw-r--r--man/2/smtp10
-rw-r--r--man/2/sys-print7
-rw-r--r--man/2/w3c-uris242
-rw-r--r--man/2/xml15
-rw-r--r--man/3/cmd15
-rw-r--r--man/7/INDEX1
-rw-r--r--man/7/cddb56
-rw-r--r--man/8/httpd25
-rw-r--r--man/8/shutdown6
-rw-r--r--man/index691
-rw-r--r--mkfile6
-rw-r--r--mkfiles/mkfile-FreeBSD-3862
-rw-r--r--mkfiles/mkfile-Linux-3862
-rw-r--r--mkfiles/mkfile-MacOSX-power6
-rw-r--r--mkfiles/mkfile-Unixware-3862
-rw-r--r--mkfiles/mklibsubdirs2
-rw-r--r--mkfiles/mksubdirs2
-rw-r--r--module/keyring.m6
-rw-r--r--module/xml.m1
-rw-r--r--os/README4
-rw-r--r--os/ip/loopbackmedium.c2
-rw-r--r--os/ip/rudp.c2
-rw-r--r--os/ipaq1110/NOTICE2
-rw-r--r--os/port/devprof.c4
-rw-r--r--os/port/error.h3
-rw-r--r--os/port/exportfs.c7
-rw-r--r--os/port/inferno.c3
-rw-r--r--os/port/portmkfile3
-rw-r--r--utils/0c/peep.c3
-rw-r--r--utils/0c/reg.c1
-rw-r--r--utils/5c/peep.c2
-rw-r--r--utils/5c/txt.c1
-rw-r--r--utils/5l/obj.c1
-rw-r--r--utils/acid/os-Nt.c1
-rw-r--r--utils/acid/os-Posix.c1
-rw-r--r--utils/c2l/cc.h1
-rw-r--r--utils/data2s/data2s.c5
-rw-r--r--utils/kc/peep.c5
-rw-r--r--utils/kc/reg.c1
-rw-r--r--utils/kc/txt.c1
-rw-r--r--utils/lib/yaccpar4
-rw-r--r--utils/libmach/5db.c6
-rw-r--r--utils/mk/graph.c2
-rw-r--r--utils/mk/mk.c2
-rw-r--r--utils/mkfile2
-rw-r--r--utils/qa/lex.c1
-rw-r--r--utils/qc/peep.c5
-rw-r--r--utils/ql/asm.c92
-rw-r--r--utils/ql/l.h4
-rw-r--r--utils/sqz/sqz.c2
-rw-r--r--utils/tc/peep.c2
-rw-r--r--utils/vc/peep.c2
-rw-r--r--utils/vc/reg.c1
-rw-r--r--utils/vl/obj.c1
-rw-r--r--utils/vl/span.c1
-rw-r--r--utils/yacc/yaccpar4
253 files changed, 4638 insertions, 1541 deletions
diff --git a/CHANGES b/CHANGES
index b8a60acd..821f65da 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,81 @@
+20061219
+ cmd(3) and thus os(1) change to separate standard output and error streams
+ all /emu/*/cmd.c change to account for that (original changes to devcmd.c and MacOSX/cmd.c courtesy Cibernet)
+20061215
+ replaced things like <???> because gcc annoyingly whines even with 1950's trigraphs off
+ libtk/textu.c: uninitialised field in boundary case
+ libtk/textw.c: possibly uninitialised value; leave unchanged
+ utils/ql/l.h: uchar as to ushort, because of extra ops
+20061214
+ added fopen to xml.m to allow bufio->sopen and others to be used
+20061213
+ added MacOSX/386 components
+20061013
+ updated /os/ip/lookbackmedium.c and /os/ip/rudp.c
+20061021
+ change /os/port/exportfs.c to allow negotiating up to 64k msize
+ (matching /emu/port/exportfs.c)
+20060809
+ /appl/lib/newns.b uses String->unquoted, if it can load it
+20060803
+ /libtk/textw.c: default page up/down scrolls 0.75 of a page (to give context); also allows fractional value
+20060801
+ /utils/data2s/data2s.c: allocate at least one linker byte to empty files to avoid complaints
+20060715
+ /appl/lib/pop3.b remove defaultserver(); update pop3(2) to remove references to /services
+ similarly update smtp(2)
+ avoid some boundary cases in /appl/charon/^(build.b layout.b)
+20060625
+ added caerwynj@gmail.com changes to /appl/acme/acme/mail/src/Mailpop3.b
+20060622
+ /appl/lib/sets*.b: correct op's implementation of 2r1101
+20060613
+ added csv(2), /module/csv.m, /appl/lib/csv.b
+20060608
+ preliminary rfc822(2), /appl/lib/rfc822.b
+20060605
+ /appl/lib/chanfill.b: remove alt => *
+20060601
+ fix /appl/lib/dis.b to save the real array once read in
+20060526
+ /appl/lib/venti.b: fix g64's byte ordering [not that it is, or can be called yet]
+20060524
+ copy end fix to lib*/utfecpy.c
+20060523
+ w3c-uris(2): add a .copy() operation
+20060518
+ /Nt/386/include/lib9.h define _USE_32BIT_TIME_T and deprecate `deprecated' warnings
+20060504
+ remove use of HEAP_ALIGN from /*/port/devprof.c; change Heap.pad to Heap.hprof in /include/interp.h
+20060426
+ correct text and selection colours in wm/sh for loss-of-focus and holding modes
+20060423
+ add /appl/lib/w3c/uris.b w3c-uris(2) /module/uris.m
+20060419
+ /emu/port/devcmd.c: correct wakeup state for started command
+20060412
+ /appl/svc/webget include caerwyn's changes
+20060411
+ put `|| exit 1' after each (command-list) in the mkfiles, just for bash
+20060410
+ /appl/cmd/limbo/typecheck.b /limbo/typecheck.c - stop wrong warning wrt use of ref fn
+20060313
+ remembered to install cddb port from last year... cddb(7)
+20060312
+ /emu/Nt/win.c; #define windows names out of the way to remove IPoint etc
+ /emu/Nt/os.c, simplify osblock/osready and eliminate erendezvous
+ /emu/port/devcons.c, tug into line with /os/port, to prepare for single-window changes
+ echo ^U on CAN (ctrl-U)
+20060311
+ replace Limbo version of shutdown by sh script; it's still a bit silly
+20060309
+ /*/port/inferno.c: 0 or -1 return value from dial functions
+ /os/port/portmkfile: remove reference to ../kfs
+ /man/8/httpd document -a; /appl/svc/httpd/httpd.b
+ /libmp/port/mptouv.c sign extension fix from 9
+ /module/keyring.m, /libinterp/ipint.c: add some bitwise operators
+ change (undocumented) /appl/cmd/test.b so that `host' mkfiles will work in Inferno
+ should probably change the mkfiles to replace it
20060303
/emu/Plan9/win.c replace ldepthof
20060302
diff --git a/FreeBSD/386/bin/data2c b/FreeBSD/386/bin/data2c
index f755f8fa..edbc2664 100755
--- a/FreeBSD/386/bin/data2c
+++ b/FreeBSD/386/bin/data2c
Binary files differ
diff --git a/FreeBSD/386/bin/mk b/FreeBSD/386/bin/mk
index 766d6349..d484548c 100755
--- a/FreeBSD/386/bin/mk
+++ b/FreeBSD/386/bin/mk
Binary files differ
diff --git a/FreeBSD/386/bin/yacc b/FreeBSD/386/bin/yacc
index 7390e221..8b8bc277 100755
--- a/FreeBSD/386/bin/yacc
+++ b/FreeBSD/386/bin/yacc
Binary files differ
diff --git a/Irix/mips/bin/mk b/Irix/mips/bin/mk
index 6c822e2a..7e3cc0bf 100755
--- a/Irix/mips/bin/mk
+++ b/Irix/mips/bin/mk
Binary files differ
diff --git a/Irix/mips/bin/mkext b/Irix/mips/bin/mkext
index 2ea0ad21..e3997deb 100755
--- a/Irix/mips/bin/mkext
+++ b/Irix/mips/bin/mkext
Binary files differ
diff --git a/Irix/mips/bin/yacc b/Irix/mips/bin/yacc
index 46dabda6..90e87fde 100755
--- a/Irix/mips/bin/yacc
+++ b/Irix/mips/bin/yacc
Binary files differ
diff --git a/LICENCE b/LICENCE
index fc565e3f..9f09ae0c 100644
--- a/LICENCE
+++ b/LICENCE
@@ -16,9 +16,9 @@ licences, listed here in increasing order of liberality:
The text of each licence can be found in lib/legal.
Some portions of the software are subject to GPL and LGPL.
-Through their `copyleft' clauses impose some degree of reciprocity in terms of (for instance)
-making changes and additions available in source form if you distribute software
-that is subject to those licences, but only to the extent the licences require.
+Their `copyleft' clauses impose some degree of reciprocity; for instance, if you
+make changes and additions to such software, and you also distribute the result,
+you must make those changes and additions available in source form.
Other portions are subject to the Lucent Public or Vita Nuova `free for all' licence
and do not impose `copyleft' conditions.
diff --git a/Linux/386/bin/data2c b/Linux/386/bin/data2c
index 8bebd48a..6d037e94 100755
--- a/Linux/386/bin/data2c
+++ b/Linux/386/bin/data2c
Binary files differ
diff --git a/Linux/386/bin/mk b/Linux/386/bin/mk
index 792062b5..c1f23218 100755
--- a/Linux/386/bin/mk
+++ b/Linux/386/bin/mk
Binary files differ
diff --git a/Linux/386/bin/mkext b/Linux/386/bin/mkext
new file mode 100644
index 00000000..586a1ea8
--- /dev/null
+++ b/Linux/386/bin/mkext
Binary files differ
diff --git a/Linux/386/bin/yacc b/Linux/386/bin/yacc
index 396cd46e..31082cf1 100755
--- a/Linux/386/bin/yacc
+++ b/Linux/386/bin/yacc
Binary files differ
diff --git a/Linux/arm/include/fpuctl.h b/Linux/arm/include/fpuctl.h
new file mode 100644
index 00000000..7903c04b
--- /dev/null
+++ b/Linux/arm/include/fpuctl.h
@@ -0,0 +1,52 @@
+/*
+ * Linux arm fpu support
+ * Mimic Plan9 floating point support
+ */
+
+#include <fenv.h>
+
+static void
+setfcr(ulong fcr)
+{
+}
+
+static ulong
+getfcr(void)
+{
+ ulong fcr = 0;
+ return fcr;
+}
+
+static ulong
+getfsr(void)
+{
+ ulong fsr = -1;
+ return fsr;
+}
+
+static void
+setfsr(ulong fsr)
+{
+}
+
+/* FCR */
+#define FPINEX (1<<5)
+#define FPUNFL ((1<<4)|(1<<1))
+#define FPOVFL (1<<3)
+#define FPZDIV (1<<2)
+#define FPINVAL (1<<0)
+#define FPRNR (0<<10)
+#define FPRZ (3<<10)
+#define FPRPINF (2<<10)
+#define FPRNINF (1<<10)
+#define FPRMASK (3<<10)
+#define FPPEXT (3<<8)
+#define FPPSGL (0<<8)
+#define FPPDBL (2<<8)
+#define FPPMASK (3<<8)
+/* FSR */
+#define FPAINEX FPINEX
+#define FPAOVFL FPOVFL
+#define FPAUNFL FPUNFL
+#define FPAZDIV FPZDIV
+#define FPAINVAL FPINVAL
diff --git a/Linux/arm/include/lib9.h b/Linux/arm/include/lib9.h
new file mode 100644
index 00000000..afb40f7b
--- /dev/null
+++ b/Linux/arm/include/lib9.h
@@ -0,0 +1,497 @@
+/* define _BSD_SOURCE to use ISO C, POSIX, and 4.3BSD things. */
+#ifndef _BSD_SOURCE
+#define _BSD_SOURCE
+#endif
+#define _LARGEFILE_SOURCE 1
+#define _LARGEFILE64_SOURCE 1
+#define _FILE_OFFSET_BITS 64
+#include <features.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#define sync __os_sync
+#include <unistd.h>
+#undef sync
+#include <errno.h>
+#define __NO_STRING_INLINES
+#include <string.h>
+#include "math.h"
+#include <fcntl.h>
+#include <setjmp.h>
+#include <float.h>
+#include <endian.h>
+
+#define getwd infgetwd
+
+#ifndef EMU
+typedef struct Proc Proc;
+#endif
+
+/*
+ * math module dtoa
+ * #define __LITTLE_ENDIAN /usr/include/endian.h under linux
+ */
+
+#define nil ((void*)0)
+
+typedef unsigned char uchar;
+typedef signed char schar;
+typedef unsigned short Rune;
+typedef long long int vlong;
+typedef unsigned long long int uvlong;
+typedef unsigned int u32int;
+typedef unsigned int mpdigit; /* for /sys/include/mp.h */
+typedef unsigned short u16int;
+typedef unsigned char u8int;
+typedef unsigned long uintptr;
+
+#define USED(x) if(x){}else{}
+#define SET(x)
+
+#undef nelem
+#define nelem(x) (sizeof(x)/sizeof((x)[0]))
+#undef offsetof
+#define offsetof(s, m) (ulong)(&(((s*)0)->m))
+#undef assert
+#define assert(x) if(x){}else _assert("x")
+
+/*
+ * most mem and string routines are declared by ANSI/POSIX files above
+ */
+
+extern char* strecpy(char*, char*, char*);
+extern char* strdup(const char*);
+extern int cistrncmp(char*, char*, int);
+extern int cistrcmp(char*, char*);
+extern char* cistrstr(char*, char*);
+extern int tokenize(char*, char**, int);
+
+enum
+{
+ UTFmax = 3, /* maximum bytes per rune */
+ Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */
+ Runeself = 0x80, /* rune and UTF sequences are the same (<) */
+ Runeerror = 0x80 /* decoding error in UTF */
+};
+
+/*
+ * rune routines
+ */
+extern int runetochar(char*, Rune*);
+extern int chartorune(Rune*, char*);
+extern int runelen(long);
+extern int runenlen(Rune*, int);
+extern int fullrune(char*, int);
+extern int utflen(char*);
+extern int utfnlen(char*, long);
+extern char* utfrune(char*, long);
+extern char* utfrrune(char*, long);
+extern char* utfutf(char*, char*);
+extern char* utfecpy(char*, char*, char*);
+
+extern Rune* runestrcat(Rune*, Rune*);
+extern Rune* runestrchr(Rune*, Rune);
+extern int runestrcmp(Rune*, Rune*);
+extern Rune* runestrcpy(Rune*, Rune*);
+extern Rune* runestrncpy(Rune*, Rune*, long);
+extern Rune* runestrecpy(Rune*, Rune*, Rune*);
+extern Rune* runestrdup(Rune*);
+extern Rune* runestrncat(Rune*, Rune*, long);
+extern int runestrncmp(Rune*, Rune*, long);
+extern Rune* runestrrchr(Rune*, Rune);
+extern long runestrlen(Rune*);
+extern Rune* runestrstr(Rune*, Rune*);
+
+extern Rune tolowerrune(Rune);
+extern Rune totitlerune(Rune);
+extern Rune toupperrune(Rune);
+extern int isalpharune(Rune);
+extern int islowerrune(Rune);
+extern int isspacerune(Rune);
+extern int istitlerune(Rune);
+extern int isupperrune(Rune);
+
+/*
+ * malloc
+ */
+extern void* malloc(size_t);
+extern void* mallocz(ulong, int);
+extern void free(void*);
+extern ulong msize(void*);
+extern void* calloc(size_t, size_t);
+extern void* realloc(void*, size_t);
+extern void setmalloctag(void*, ulong);
+extern void setrealloctag(void*, ulong);
+extern ulong getmalloctag(void*);
+extern ulong getrealloctag(void*);
+extern void* malloctopoolblock(void*);
+
+/*
+ * print routines
+ */
+typedef struct Fmt Fmt;
+struct Fmt{
+ uchar runes; /* output buffer is runes or chars? */
+ void *start; /* of buffer */
+ void *to; /* current place in the buffer */
+ void *stop; /* end of the buffer; overwritten if flush fails */
+ int (*flush)(Fmt *); /* called when to == stop */
+ void *farg; /* to make flush a closure */
+ int nfmt; /* num chars formatted so far */
+ va_list args; /* args passed to dofmt */
+ int r; /* % format Rune */
+ int width;
+ int prec;
+ ulong flags;
+};
+
+enum{
+ FmtWidth = 1,
+ FmtLeft = FmtWidth << 1,
+ FmtPrec = FmtLeft << 1,
+ FmtSharp = FmtPrec << 1,
+ FmtSpace = FmtSharp << 1,
+ FmtSign = FmtSpace << 1,
+ FmtZero = FmtSign << 1,
+ FmtUnsigned = FmtZero << 1,
+ FmtShort = FmtUnsigned << 1,
+ FmtLong = FmtShort << 1,
+ FmtVLong = FmtLong << 1,
+ FmtComma = FmtVLong << 1,
+ FmtByte = FmtComma << 1,
+
+ FmtFlag = FmtByte << 1
+};
+
+extern int print(char*, ...);
+extern char* seprint(char*, char*, char*, ...);
+extern char* vseprint(char*, char*, char*, va_list);
+extern int snprint(char*, int, char*, ...);
+extern int vsnprint(char*, int, char*, va_list);
+extern char* smprint(char*, ...);
+extern char* vsmprint(char*, va_list);
+extern int sprint(char*, char*, ...);
+extern int fprint(int, char*, ...);
+extern int vfprint(int, char*, va_list);
+
+extern int runesprint(Rune*, char*, ...);
+extern int runesnprint(Rune*, int, char*, ...);
+extern int runevsnprint(Rune*, int, char*, va_list);
+extern Rune* runeseprint(Rune*, Rune*, char*, ...);
+extern Rune* runevseprint(Rune*, Rune*, char*, va_list);
+extern Rune* runesmprint(char*, ...);
+extern Rune* runevsmprint(char*, va_list);
+
+extern int fmtfdinit(Fmt*, int, char*, int);
+extern int fmtfdflush(Fmt*);
+extern int fmtstrinit(Fmt*);
+extern char* fmtstrflush(Fmt*);
+extern int runefmtstrinit(Fmt*);
+extern Rune* runefmtstrflush(Fmt*);
+
+extern int fmtinstall(int, int (*)(Fmt*));
+extern int dofmt(Fmt*, char*);
+extern int dorfmt(Fmt*, Rune*);
+extern int fmtprint(Fmt*, char*, ...);
+extern int fmtvprint(Fmt*, char*, va_list);
+extern int fmtrune(Fmt*, int);
+extern int fmtstrcpy(Fmt*, char*);
+extern int fmtrunestrcpy(Fmt*, Rune*);
+/*
+ * error string for %r
+ * supplied on per os basis, not part of fmt library
+ */
+extern int errfmt(Fmt *f);
+
+/*
+ * quoted strings
+ */
+extern char *unquotestrdup(char*);
+extern Rune *unquoterunestrdup(Rune*);
+extern char *quotestrdup(char*);
+extern Rune *quoterunestrdup(Rune*);
+extern int quotestrfmt(Fmt*);
+extern int quoterunestrfmt(Fmt*);
+extern void quotefmtinstall(void);
+extern int (*doquote)(int);
+
+/*
+ * random number
+ */
+extern ulong truerand(void);
+extern ulong ntruerand(ulong);
+
+/*
+ * math
+ */
+extern int isNaN(double);
+extern int isInf(double, int);
+
+/*
+ * Time-of-day
+ */
+
+typedef struct Tm Tm;
+struct Tm {
+ int sec;
+ int min;
+ int hour;
+ int mday;
+ int mon;
+ int year;
+ int wday;
+ int yday;
+ char zone[4];
+ int tzoff;
+};
+extern vlong osnsec(void);
+#define nsec osnsec
+
+/*
+ * one-of-a-kind
+ */
+extern void _assert(char*);
+extern double charstod(int(*)(void*), void*);
+extern char* cleanname(char*);
+//extern ulong getcallerpc(void*);
+extern int getfields(char*, char**, int, int, char*);
+extern char* getuser(void);
+extern char* getwd(char*, int);
+extern double ipow10(int);
+#define pow10 infpow10
+extern double pow10(int);
+extern vlong strtoll(const char*, char**, int);
+extern uvlong strtoull(const char*, char**, int);
+extern void sysfatal(char*, ...);
+extern int dec64(uchar*, int, char*, int);
+extern int enc64(char*, int, uchar*, int);
+extern int dec32(uchar*, int, char*, int);
+extern int enc32(char*, int, uchar*, int);
+extern int dec16(uchar*, int, char*, int);
+extern int enc16(char*, int, uchar*, int);
+extern int encodefmt(Fmt*);
+
+/*
+ * synchronization
+ */
+typedef
+struct Lock {
+ ulong val;
+ int pid;
+} Lock;
+
+extern ulong _tas(ulong*);
+
+extern void lock(Lock*);
+extern void unlock(Lock*);
+extern int canlock(Lock*);
+
+typedef struct QLock QLock;
+struct QLock
+{
+ Lock use; /* to access Qlock structure */
+ Proc *head; /* next process waiting for object */
+ Proc *tail; /* last process waiting for object */
+ int locked; /* flag */
+};
+
+extern void qlock(QLock*);
+extern void qunlock(QLock*);
+extern int canqlock(QLock*);
+extern void _qlockinit(ulong (*)(ulong, ulong)); /* called only by the thread library */
+
+typedef
+struct RWLock
+{
+ Lock l; /* Lock modify lock */
+ QLock x; /* Mutual exclusion lock */
+ QLock k; /* Lock for waiting writers */
+ int readers; /* Count of readers in lock */
+} RWLock;
+
+extern int canrlock(RWLock*);
+extern int canwlock(RWLock*);
+extern void rlock(RWLock*);
+extern void runlock(RWLock*);
+extern void wlock(RWLock*);
+extern void wunlock(RWLock*);
+
+/*
+ * network dialing
+ */
+#define NETPATHLEN 40
+
+/*
+ * system calls
+ *
+ */
+#define STATMAX 65535U /* max length of machine-independent stat structure */
+#define DIRMAX (sizeof(Dir)+STATMAX) /* max length of Dir structure */
+#define ERRMAX 128 /* max length of error string */
+
+#define MORDER 0x0003 /* mask for bits defining order of mounting */
+#define MREPL 0x0000 /* mount replaces object */
+#define MBEFORE 0x0001 /* mount goes before others in union directory */
+#define MAFTER 0x0002 /* mount goes after others in union directory */
+#define MCREATE 0x0004 /* permit creation in mounted directory */
+#define MCACHE 0x0010 /* cache some data */
+#define MMASK 0x0017 /* all bits on */
+
+#define OREAD 0 /* open for read */
+#define OWRITE 1 /* write */
+#define ORDWR 2 /* read and write */
+#define OEXEC 3 /* execute, == read but check execute permission */
+#define OTRUNC 16 /* or'ed in (except for exec), truncate file first */
+#define OCEXEC 32 /* or'ed in, close on exec */
+#define ORCLOSE 64 /* or'ed in, remove on close */
+#define OEXCL 0x1000 /* or'ed in, exclusive use (create only) */
+
+#define AEXIST 0 /* accessible: exists */
+#define AEXEC 1 /* execute access */
+#define AWRITE 2 /* write access */
+#define AREAD 4 /* read access */
+
+/* bits in Qid.type */
+#define QTDIR 0x80 /* type bit for directories */
+#define QTAPPEND 0x40 /* type bit for append only files */
+#define QTEXCL 0x20 /* type bit for exclusive use files */
+#define QTMOUNT 0x10 /* type bit for mounted channel */
+#define QTAUTH 0x08 /* type bit for authentication file */
+#define QTFILE 0x00 /* plain file */
+
+/* bits in Dir.mode */
+#define DMDIR 0x80000000 /* mode bit for directories */
+#define DMAPPEND 0x40000000 /* mode bit for append only files */
+#define DMEXCL 0x20000000 /* mode bit for exclusive use files */
+#define DMMOUNT 0x10000000 /* mode bit for mounted channel */
+#define DMAUTH 0x08000000 /* mode bit for authentication file */
+#define DMREAD 0x4 /* mode bit for read permission */
+#define DMWRITE 0x2 /* mode bit for write permission */
+#define DMEXEC 0x1 /* mode bit for execute permission */
+
+typedef
+struct Qid
+{
+ uvlong path;
+ ulong vers;
+ uchar type;
+} Qid;
+
+typedef
+struct Dir {
+ /* system-modified data */
+ ushort type; /* server type */
+ uint dev; /* server subtype */
+ /* file data */
+ Qid qid; /* unique id from server */
+ ulong mode; /* permissions */
+ ulong atime; /* last read time */
+ ulong mtime; /* last write time */
+ vlong length; /* file length */
+ char *name; /* last element of path */
+ char *uid; /* owner name */
+ char *gid; /* group name */
+ char *muid; /* last modifier name */
+} Dir;
+
+extern Dir* dirstat(char*);
+extern Dir* dirfstat(int);
+extern int dirwstat(char*, Dir*);
+extern int dirfwstat(int, Dir*);
+extern long dirread(int, Dir**);
+extern void nulldir(Dir*);
+extern long dirreadall(int, Dir**);
+
+typedef
+struct Waitmsg
+{
+ int pid; /* of loved one */
+ ulong time[3]; /* of loved one & descendants */
+ char *msg;
+} Waitmsg;
+
+extern void _exits(char*);
+
+extern void exits(char*);
+extern int create(char*, int, int);
+extern int errstr(char*, uint);
+
+extern void perror(const char*);
+extern long readn(int, void*, long);
+extern int remove(const char*);
+extern void rerrstr(char*, uint);
+extern vlong seek(int, vlong, int);
+extern int segflush(void*, ulong);
+extern void werrstr(char*, ...);
+
+extern char *argv0;
+#define ARGBEGIN for((argv0||(argv0=*argv)),argv++,argc--;\
+ argv[0] && argv[0][0]=='-' && argv[0][1];\
+ argc--, argv++) {\
+ char *_args, *_argt;\
+ Rune _argc;\
+ _args = &argv[0][1];\
+ if(_args[0]=='-' && _args[1]==0){\
+ argc--; argv++; break;\
+ }\
+ _argc = 0;\
+ while(*_args && (_args += chartorune(&_argc, _args)))\
+ switch(_argc)
+#define ARGEND SET(_argt);USED(_argt);USED(_argc); USED(_args);}USED(argv); USED(argc);
+#define ARGF() (_argt=_args, _args="",\
+ (*_argt? _argt: argv[1]? (argc--, *++argv): 0))
+#define EARGF(x) (_argt=_args, _args="",\
+ (*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0)))
+
+#define ARGC() _argc
+
+/*
+ * Extensions for Inferno to basic libc.h
+ */
+
+#define setbinmode()
+
+/* need the inline because the link register is not saved in a known location */
+static __inline ulong getcallerpc(void* dummy) {
+ ulong lr;
+ __asm__( "mov %0, %%lr;"
+ : "=r" (lr)
+ );
+ return lr;
+}
+
+/*
+ * Extensions for emu kernel emulation
+ */
+#ifdef EMU
+
+/*
+ * This structure must agree with FPsave and FPrestore asm routines
+ */
+typedef struct FPU FPU;
+struct FPU
+{
+ uchar env[28];
+};
+
+/*
+ * Later versions of Linux seemed to need large stack for gethostbyname()
+ * so we had this at 128k, which is excessive. More recently, we've
+ * reduced it again after testing stack usage by gethostbyname.
+ */
+#define KSTACK (16 * 1024)
+
+static __inline Proc *getup(void) {
+ Proc* p;
+ __asm__( "mov %0, %%sp;"
+ : "=r" (p)
+ );
+ return *(Proc **)((unsigned long)p & ~(KSTACK - 1));
+};
+
+#define up (getup())
+
+typedef sigjmp_buf osjmpbuf;
+#define ossetjmp(buf) sigsetjmp(buf, 1)
+
+#endif
diff --git a/MacOSX/README b/MacOSX/README
index 3fe0c7fc..6b450e6a 100644
--- a/MacOSX/README
+++ b/MacOSX/README
@@ -1,3 +1,9 @@
+This file is of historical interest only, but serves to note that
+much of the work of the MacOSX ports was originally done by Corpus Callosum.
+Bugs to support@vitanuova.com, though.
+
+March 2006: initial MacOSX 10.4/x86 port
+
12-Dec-2003
Emu can use wm with Apple's X11R6 again.
@@ -63,4 +69,4 @@ Some of the base libraries and utils will have *.pbproj files which were used to
-"Mac OS X" and "Mac OS X Server" are trade marks of Apple Computer, Inc. \ No newline at end of file
+"Mac OS X" and "Mac OS X Server" are trade marks of Apple Computer, Inc.
diff --git a/MacOSX/power/bin/data2c b/MacOSX/power/bin/data2c
index 04622c35..079d983d 100755
--- a/MacOSX/power/bin/data2c
+++ b/MacOSX/power/bin/data2c
Binary files differ
diff --git a/MacOSX/power/bin/mk b/MacOSX/power/bin/mk
index 2be3415d..1f0818ae 100755
--- a/MacOSX/power/bin/mk
+++ b/MacOSX/power/bin/mk
Binary files differ
diff --git a/MacOSX/power/bin/yacc b/MacOSX/power/bin/yacc
index fbb0bc16..c0cf3b73 100755
--- a/MacOSX/power/bin/yacc
+++ b/MacOSX/power/bin/yacc
Binary files differ
diff --git a/Nt/386/bin/c2l.exe b/Nt/386/bin/c2l.exe
index 998edf79..173001da 100755
--- a/Nt/386/bin/c2l.exe
+++ b/Nt/386/bin/c2l.exe
Binary files differ
diff --git a/Nt/386/bin/cp.exe b/Nt/386/bin/cp.exe
index 9a314722..c8a8a7b1 100755
--- a/Nt/386/bin/cp.exe
+++ b/Nt/386/bin/cp.exe
Binary files differ
diff --git a/Nt/386/bin/data2c.exe b/Nt/386/bin/data2c.exe
index fe2a7819..310d0ebc 100755
--- a/Nt/386/bin/data2c.exe
+++ b/Nt/386/bin/data2c.exe
Binary files differ
diff --git a/Nt/386/bin/echo.exe b/Nt/386/bin/echo.exe
index 37e5def9..2d21d18e 100755
--- a/Nt/386/bin/echo.exe
+++ b/Nt/386/bin/echo.exe
Binary files differ
diff --git a/Nt/386/bin/format.exe b/Nt/386/bin/format.exe
index 30ab07e1..abd5d805 100755
--- a/Nt/386/bin/format.exe
+++ b/Nt/386/bin/format.exe
Binary files differ
diff --git a/Nt/386/bin/mkdir.exe b/Nt/386/bin/mkdir.exe
index 34810a39..2333454b 100755
--- a/Nt/386/bin/mkdir.exe
+++ b/Nt/386/bin/mkdir.exe
Binary files differ
diff --git a/Nt/386/bin/mkext.exe b/Nt/386/bin/mkext.exe
index c3bc6d0e..6082dea3 100755
--- a/Nt/386/bin/mkext.exe
+++ b/Nt/386/bin/mkext.exe
Binary files differ
diff --git a/Nt/386/bin/mv.exe b/Nt/386/bin/mv.exe
index 14d1955f..a0f1b4d0 100755
--- a/Nt/386/bin/mv.exe
+++ b/Nt/386/bin/mv.exe
Binary files differ
diff --git a/Nt/386/bin/rm.exe b/Nt/386/bin/rm.exe
index cce5adbf..49d67143 100755
--- a/Nt/386/bin/rm.exe
+++ b/Nt/386/bin/rm.exe
Binary files differ
diff --git a/Nt/386/bin/sed.exe b/Nt/386/bin/sed.exe
index 5926b70c..07fad4c2 100755
--- a/Nt/386/bin/sed.exe
+++ b/Nt/386/bin/sed.exe
Binary files differ
diff --git a/Nt/386/bin/test.exe b/Nt/386/bin/test.exe
index 5f88b8d3..20af903c 100755
--- a/Nt/386/bin/test.exe
+++ b/Nt/386/bin/test.exe
Binary files differ
diff --git a/Nt/386/bin/tr.exe b/Nt/386/bin/tr.exe
index b653c3dd..0e5e187c 100755
--- a/Nt/386/bin/tr.exe
+++ b/Nt/386/bin/tr.exe
Binary files differ
diff --git a/Nt/386/bin/yacc.exe b/Nt/386/bin/yacc.exe
index 0a833692..4a055df9 100755
--- a/Nt/386/bin/yacc.exe
+++ b/Nt/386/bin/yacc.exe
Binary files differ
diff --git a/Nt/386/include/lib9.h b/Nt/386/include/lib9.h
index 75dea8cc..4f66302a 100755
--- a/Nt/386/include/lib9.h
+++ b/Nt/386/include/lib9.h
@@ -1,4 +1,5 @@
#define _POSIX_SOURCE
+#define _USE_32BIT_TIME_T
#include <stdlib.h>
#include <stdarg.h>
#include <errno.h>
@@ -34,8 +35,9 @@ typedef struct Proc Proc;
* 4090 different volatile quals
* 4554 operator precedence
* 4146 unary - on unsigned type
+ * 4996 `deprecated' functions: they often suggest non-portable replacements
*/
-#pragma warning( disable : 4305 4244 4102 4761 4018 4245 4244 4068 4090 4554 4146)
+#pragma warning( disable : 4305 4244 4102 4761 4018 4245 4244 4068 4090 4554 4146 4996)
#define nil ((void*)0)
diff --git a/Solaris/sparc/bin/data2c b/Solaris/sparc/bin/data2c
index ceaab39e..f886c894 100755
--- a/Solaris/sparc/bin/data2c
+++ b/Solaris/sparc/bin/data2c
Binary files differ
diff --git a/Solaris/sparc/bin/mk b/Solaris/sparc/bin/mk
index a30757c1..7120627d 100755
--- a/Solaris/sparc/bin/mk
+++ b/Solaris/sparc/bin/mk
Binary files differ
diff --git a/Solaris/sparc/bin/mkext b/Solaris/sparc/bin/mkext
index 7c51ccbd..34a5424b 100755
--- a/Solaris/sparc/bin/mkext
+++ b/Solaris/sparc/bin/mkext
Binary files differ
diff --git a/Solaris/sparc/bin/yacc b/Solaris/sparc/bin/yacc
index 15ac558a..c1e33fef 100755
--- a/Solaris/sparc/bin/yacc
+++ b/Solaris/sparc/bin/yacc
Binary files differ
diff --git a/acme/mail/Mailpop3.dis b/acme/mail/Mailpop3.dis
index 256da17b..41a7de3f 100644
--- a/acme/mail/Mailpop3.dis
+++ b/acme/mail/Mailpop3.dis
Binary files differ
diff --git a/appl/acme/acme/mail/src/Mailpop3.b b/appl/acme/acme/mail/src/Mailpop3.b
index f267d737..4189cacf 100644
--- a/appl/acme/acme/mail/src/Mailpop3.b
+++ b/appl/acme/acme/mail/src/Mailpop3.b
@@ -648,7 +648,7 @@ nrunes(s : array of byte, nb : int) : int
n = 0;
for(i=0; i<nb; n++) {
- (r, b, ok) := byte2char(s, i);
+ (nil, b, ok) := byte2char(s, i);
if (!ok)
error("help needed in nrunes()");
i += b;
@@ -869,7 +869,7 @@ Win.wreadall(w : self ref Win) : string
return s;
}
-None,Unknown,Ignore,CC,From,ReplyTo,Sender,Subject,Re,To, Date : con iota;
+None, Unknown, Ignore, CC, From, ReplyTo, Sender, Subject, Re, To, Date, Received : con iota;
NHeaders : con 200;
Hdrs : adt {
@@ -887,6 +887,7 @@ hdrs := array[NHeaders+1] of {
Hdrs ( "Re:", Re ),
Hdrs ( "To:", To ),
Hdrs ( "Date:", Date),
+ Hdrs ( "Received:", Received),
* => Hdrs ( "", 0 ),
};
@@ -967,11 +968,14 @@ Mesg.read(b : ref Box) : ref Mesg
s : string;
n, typex : int;
- s = b.readline();
- n = len s;
- if(n <= 0)
- return nil;
-
+ for(;;){
+ s = b.readline();
+ n = len s;
+ if(n <= 0)
+ return nil;
+ if(n >= 5 && (s[0:5] == "From:" || s[0:5] == "From "))
+ break;
+ }
{
if(n < 5 || (s[0:5] !="From " && s[0:5] != "From:"))
raise("e");
@@ -1262,7 +1266,7 @@ Mesg.command(m : self ref Mesg, s : string) : int
}
if(len s >= 4 && s[0:4] == "Save"){
s = s[4:];
- while(s[0]==' ' || s[0]=='\t' || s[0]=='\n')
+ while(len s > 0 && (s[0]==' ' || s[0]=='\t' || s[0]=='\n'))
s = s[1:];
if(s == nil)
m.save("stored");
diff --git a/appl/charon/build.b b/appl/charon/build.b
index cf3a0b09..92ba90aa 100644
--- a/appl/charon/build.b
+++ b/appl/charon/build.b
@@ -2772,6 +2772,10 @@ Tablerow.new(align: Align, bg: Background, flags: byte) : ref Tablerow
Tablecell.new(cellid, rowspan, colspan: int, align: Align, wspec: Dimen,
hspec: int, bg: Background, flags: byte) : ref Tablecell
{
+ if(colspan < 0)
+ colspan = 0;
+ if(rowspan < 0)
+ rowspan = 0;
return ref Tablecell(cellid,
nil, -1, # content, layid
rowspan, colspan, align, flags, wspec, hspec, bg,
diff --git a/appl/charon/http.b b/appl/charon/http.b
index 27c7d695..d1208091 100644
--- a/appl/charon/http.b
+++ b/appl/charon/http.b
@@ -478,7 +478,7 @@ writereq(nc: ref Netconn, bs: ref ByteSource)
rv = sys->write(nc.conn.dfd, req.body, len req.body);
}
if(rv < 0) {
- err = "error writing to host";
+ err = sys->sprint("error writing to host: %r");
#constate("writereq", nc.conn);
}
if(err != "") {
diff --git a/appl/charon/layout.b b/appl/charon/layout.b
index 6db8f619..ee5c9064 100644
--- a/appl/charon/layout.b
+++ b/appl/charon/layout.b
@@ -2249,6 +2249,8 @@ drawtable(f : ref Frame, parentlay: ref Lay, torigin: Point, tab: ref Table)
clay := f.sublays[c.layid];
if(clay == nil)
continue;
+ if(c.col >= len tab.cols)
+ continue;
cx := x + tab.cols[c.col].pos.x;
cy := y + tab.rows[c.row].pos.y;
wd := cellwidth(tab, c, hsep);
@@ -3304,6 +3306,8 @@ Control.scrollset(c: self ref Control, v1, v2, vmax, nsteps, draw: int)
breadth = sc.r.max.y - sc.r.min.y;
}
l := length - (2*breadth + MINSCR);
+ if(l <= 0)
+ l = 1;
if(l < 0)
CU->raisex("EXInternal: negative scrollbar trough");
sc.top = l*v1/vmax;
diff --git a/appl/cmd/fortune.b b/appl/cmd/fortune.b
index 7368e992..daf48185 100755
--- a/appl/cmd/fortune.b
+++ b/appl/cmd/fortune.b
@@ -52,7 +52,7 @@ init(nil: ref Draw->Context, args: list of string)
if(ix != nil){
(nil, ixbuf) := sys->fstat(ix);
(nil, fbuf) := sys->fstat(f.fd);
- if(fbuf.mtime > ixbuf.mtime){
+ if(fbuf.mtime >= ixbuf.mtime){
ix = nil;
nix = sys->create(findex, Sys->OWRITE, 8r666);
}else
@@ -71,7 +71,7 @@ init(nil: ref Draw->Context, args: list of string)
}else{
rand->init(truerand());
offs := 0;
- g := bufio->fopen(ix, Bufio->ORDWR);
+ g := bufio->fopen(nix, Bufio->ORDWR);
for(i := 1;; i++){
if(nix != nil)
offs = int f.offset();
diff --git a/appl/cmd/limbo/com.b b/appl/cmd/limbo/com.b
index bc977d0a..c14cd923 100644
--- a/appl/cmd/limbo/com.b
+++ b/appl/cmd/limbo/com.b
@@ -1140,7 +1140,7 @@ rewritecomm(n, comm, slot: ref Node): (ref Node, ref Node)
}
}
if(n.right == comm && n.op == Oas && comm.op == Orcv
- && sumark(n.left).addable < Rcant)
+ && sumark(n.left).addable < Rcant && (n.left.op != Oname || n.left.decl != nildecl))
adr = n.left;
if(adr != nil){
p := genrawop(comm.left.src, ILEA, adr, nil, slot);
diff --git a/appl/cmd/limbo/ecom.b b/appl/cmd/limbo/ecom.b
index 978882ab..b8ca030f 100644
--- a/appl/cmd/limbo/ecom.b
+++ b/appl/cmd/limbo/ecom.b
@@ -557,7 +557,7 @@ sumark(n: ref Node): ref Node
if(int n.flags & FNPTR){
if(int n.flags == FNPTR2)
n.addable = Roff;
- else if(int n.flags == FNPTR2|FNPTRN)
+ else if(int n.flags == (FNPTR2|FNPTRN))
n.addable = Rnoff;
}
else
diff --git a/appl/cmd/limbo/lex.b b/appl/cmd/limbo/lex.b
index ae87b4a9..0aca4925 100644
--- a/appl/cmd/limbo/lex.b
+++ b/appl/cmd/limbo/lex.b
@@ -95,6 +95,7 @@ keywords := array [] of
Keywd("continue", Lcont),
Keywd("cyclic", Lcyclic),
Keywd("do", Ldo),
+ Keywd("dynamic", Ldynamic),
Keywd("else", Lelse),
Keywd("exception", Lexcept),
Keywd("exit", Lexit),
diff --git a/appl/cmd/limbo/limbo.b b/appl/cmd/limbo/limbo.b
index c8f51779..969dbf8b 100644
--- a/appl/cmd/limbo/limbo.b
+++ b/appl/cmd/limbo/limbo.b
@@ -93,6 +93,7 @@ Lexit: con 57414;
Lspawn: con 57415;
Lraise: con 57416;
Lfix: con 57417;
+Ldynamic: con 57418;
};
@@ -171,7 +172,7 @@ YYEOFCODE: con 1;
YYERRCODE: con 2;
YYMAXDEPTH: con 200;
-#line 1630 "limbo.y"
+#line 1631 "limbo.y"
include "keyring.m";
@@ -526,7 +527,7 @@ yyexca := array[] of {-1, 1,
39, 88,
50, 62,
54, 88,
- 98, 62,
+ 99, 62,
-2, 252,
-1, 211,
59, 29,
@@ -554,7 +555,7 @@ yyexca := array[] of {-1, 1,
-2, 0,
-1, 380,
50, 62,
- 98, 62,
+ 99, 62,
-2, 252,
-1, 381,
72, 175,
@@ -601,7 +602,7 @@ yyexca := array[] of {-1, 1,
-2, 113,
-1, 452,
71, 279,
- 98, 279,
+ 99, 279,
-2, 163,
-1, 469,
72, 175,
@@ -614,7 +615,7 @@ yyexca := array[] of {-1, 1,
-2, 0,
-1, 486,
50, 126,
- 98, 126,
+ 99, 126,
-2, 239,
-1, 491,
71, 276,
@@ -715,7 +716,7 @@ yyexca := array[] of {-1, 1,
50, 62,
56, 171,
62, 171,
- 98, 62,
+ 99, 62,
-2, 252,
};
YYNPROD: con 284;
@@ -728,88 +729,88 @@ yyact := array[] of {
379, 591, 453, 364, 505, 384, 412, 310, 369, 314,
359, 451, 449, 185, 84, 83, 432, 298, 270, 15,
8, 49, 213, 102, 320, 12, 42, 110, 48, 78,
- 79, 80, 4, 35, 198, 51, 23, 459, 363, 6,
- 458, 3, 6, 544, 486, 491, 365, 14, 382, 21,
- 14, 353, 400, 293, 350, 423, 225, 285, 118, 330,
- 286, 226, 223, 46, 31, 112, 465, 11, 105, 517,
- 566, 599, 308, 186, 164, 165, 166, 167, 168, 169,
- 170, 171, 172, 173, 174, 175, 176, 43, 117, 309,
- 182, 183, 184, 349, 71, 10, 349, 205, 10, 208,
- 93, 286, 286, 422, 32, 37, 119, 114, 40, 294,
- 349, 294, 32, 585, 44, 286, 119, 428, 427, 426,
- 547, 430, 429, 431, 231, 232, 233, 234, 235, 236,
- 237, 238, 239, 240, 241, 242, 485, 244, 245, 246,
+ 79, 80, 4, 35, 198, 51, 23, 544, 363, 6,
+ 423, 3, 6, 486, 459, 382, 365, 14, 458, 21,
+ 14, 353, 350, 293, 285, 491, 118, 225, 400, 330,
+ 286, 226, 31, 223, 46, 112, 465, 11, 105, 517,
+ 420, 419, 418, 186, 164, 165, 166, 167, 168, 169,
+ 170, 171, 172, 173, 174, 175, 176, 43, 117, 422,
+ 182, 183, 184, 599, 71, 10, 286, 205, 10, 208,
+ 93, 349, 286, 601, 119, 349, 32, 114, 40, 349,
+ 294, 32, 294, 286, 44, 119, 428, 427, 426, 308,
+ 430, 429, 431, 585, 231, 232, 233, 234, 235, 236,
+ 237, 238, 239, 240, 241, 242, 309, 244, 245, 246,
247, 248, 249, 250, 251, 252, 253, 254, 255, 256,
257, 258, 259, 260, 261, 262, 263, 264, 265, 186,
- 6, 483, 273, 230, 482, 22, 481, 438, 14, 22,
- 271, 424, 267, 210, 5, 409, 407, 565, 279, 187,
- 513, 410, 284, 87, 420, 419, 418, 228, 94, 288,
- 85, 312, 311, 90, 289, 99, 269, 415, 217, 202,
+ 6, 547, 273, 230, 37, 22, 194, 195, 14, 22,
+ 271, 485, 267, 210, 5, 483, 482, 565, 279, 481,
+ 513, 410, 284, 87, 438, 559, 424, 228, 409, 288,
+ 85, 407, 94, 90, 289, 99, 269, 415, 217, 202,
5, 415, 47, 92, 82, 22, 209, 26, 303, 25,
- 212, 19, 24, 218, 229, 508, 10, 354, 96, 601,
- 98, 95, 100, 595, 101, 88, 89, 86, 572, 194,
- 195, 17, 87, 557, 553, 18, 297, 19, 536, 85,
- 525, 77, 90, 313, 326, 305, 490, 13, 512, 112,
- 323, 318, 92, 82, 468, 207, 399, 17, 87, 383,
- 498, 18, 215, 23, 479, 85, 316, 467, 90, 6,
- 398, 2, 500, 13, 88, 89, 86, 14, 92, 82,
- 194, 195, 361, 186, 43, 282, 219, 340, 194, 195,
- 77, 114, 193, 211, 487, 499, 338, 182, 500, 559,
- 88, 89, 86, 336, 194, 195, 488, 535, 87, 324,
- 341, 44, 87, 325, 580, 85, 77, 579, 90, 85,
+ 212, 19, 24, 218, 229, 566, 10, 354, 96, 595,
+ 98, 95, 100, 572, 101, 88, 89, 86, 557, 194,
+ 195, 17, 87, 312, 311, 18, 297, 19, 187, 85,
+ 553, 77, 90, 313, 326, 305, 536, 13, 512, 112,
+ 323, 318, 92, 82, 525, 207, 490, 17, 87, 468,
+ 399, 18, 383, 23, 508, 85, 316, 215, 90, 6,
+ 498, 2, 500, 13, 88, 89, 86, 14, 92, 82,
+ 194, 195, 479, 186, 43, 467, 398, 340, 194, 195,
+ 77, 114, 193, 361, 282, 499, 338, 182, 500, 535,
+ 88, 89, 86, 336, 194, 195, 219, 530, 87, 211,
+ 341, 44, 87, 324, 580, 85, 77, 325, 90, 85,
381, 348, 90, 206, 19, 10, 358, 357, 92, 82,
- 214, 393, 92, 82, 604, 33, 389, 387, 391, 448,
+ 579, 393, 92, 82, 604, 214, 389, 387, 391, 448,
614, 194, 195, 402, 45, 539, 194, 195, 18, 392,
88, 89, 86, 356, 88, 89, 86, 321, 194, 195,
- 192, 194, 195, 403, 404, 530, 77, 281, 317, 108,
- 77, 416, 493, 19, 19, 421, 436, 495, 612, 186,
- 301, 385, 604, 435, 564, 437, 507, 216, 603, 493,
- 434, 441, 439, 115, 115, 600, 562, 116, 116, 452,
- 543, 340, 183, 444, 443, 504, 414, 45, 316, 493,
- 22, 18, 493, 480, 493, 597, 336, 493, 588, 70,
- 574, 493, 63, 555, 540, 73, 473, 494, 469, 433,
- 478, 442, 476, 76, 75, 69, 68, 74, 291, 18,
- 54, 55, 62, 60, 61, 64, 87, 290, 268, 452,
- 157, 91, 120, 85, 91, 104, 90, 65, 66, 67,
- 159, 489, 507, 39, 497, 103, 92, 82, 194, 195,
- 594, 510, 186, 77, 568, 477, 168, 487, 36, 518,
- 523, 466, 522, 515, 516, 511, 406, 417, 88, 89,
- 86, 87, 452, 527, 523, 529, 528, 408, 85, 329,
- 533, 90, 593, 526, 77, 91, 224, 91, 532, 537,
- 106, 92, 82, 34, 545, 91, 401, 177, 546, 541,
- 523, 331, 552, 397, 335, 556, 91, 592, 299, 554,
- 332, 300, 201, 88, 89, 86, 158, 200, 161, 197,
- 162, 163, 560, 563, 441, 316, 179, 446, 445, 77,
- 160, 159, 570, 328, 227, 577, 569, 575, 571, 573,
- 81, 477, 181, 97, 177, 346, 180, 523, 178, 583,
- 345, 41, 584, 203, 577, 606, 587, 138, 139, 140,
- 137, 135, 586, 72, 561, 548, 386, 327, 414, 222,
- 596, 221, 549, 73, 598, 477, 475, 577, 602, 605,
- 91, 76, 75, 45, 607, 74, 611, 18, 474, 471,
- 613, 425, 137, 135, 196, 477, 199, 91, 39, 188,
- 91, 91, 19, 91, 204, 524, 243, 360, 538, 307,
- 91, 183, 168, 287, 29, 220, 141, 142, 138, 139,
- 140, 137, 135, 368, 91, 91, 30, 121, 1, 464,
- 272, 274, 315, 477, 123, 124, 125, 126, 127, 128,
- 129, 130, 131, 132, 133, 134, 136, 542, 156, 155,
+ 192, 385, 72, 403, 404, 495, 77, 33, 317, 108,
+ 77, 416, 73, 19, 19, 421, 436, 301, 281, 186,
+ 76, 75, 45, 435, 74, 437, 18, 216, 487, 493,
+ 434, 441, 439, 115, 115, 612, 564, 116, 116, 452,
+ 488, 340, 183, 444, 443, 507, 414, 45, 316, 604,
+ 562, 18, 493, 543, 493, 603, 336, 493, 600, 70,
+ 597, 493, 63, 588, 504, 73, 473, 574, 469, 22,
+ 478, 442, 476, 76, 75, 69, 68, 74, 480, 18,
+ 54, 55, 62, 60, 61, 64, 87, 433, 291, 452,
+ 290, 91, 268, 85, 91, 157, 90, 65, 66, 67,
+ 120, 489, 493, 104, 497, 493, 92, 82, 555, 540,
+ 594, 494, 186, 77, 159, 477, 168, 194, 195, 103,
+ 523, 507, 522, 515, 516, 511, 406, 510, 88, 89,
+ 86, 87, 452, 527, 523, 529, 528, 487, 85, 518,
+ 533, 90, 593, 526, 77, 91, 39, 91, 532, 537,
+ 466, 92, 82, 417, 545, 91, 408, 568, 546, 541,
+ 523, 36, 552, 329, 224, 556, 91, 592, 299, 554,
+ 106, 300, 34, 88, 89, 86, 158, 401, 161, 397,
+ 162, 163, 560, 563, 441, 316, 335, 332, 201, 77,
+ 160, 159, 570, 200, 197, 577, 569, 575, 571, 573,
+ 81, 477, 177, 97, 181, 179, 331, 523, 180, 583,
+ 446, 177, 584, 445, 577, 178, 587, 141, 142, 138,
+ 139, 140, 137, 135, 561, 328, 227, 346, 414, 345,
+ 596, 41, 203, 606, 598, 477, 586, 577, 602, 605,
+ 91, 548, 386, 327, 607, 222, 611, 221, 549, 475,
+ 613, 474, 471, 425, 196, 477, 199, 91, 137, 135,
+ 91, 91, 39, 91, 204, 138, 139, 140, 137, 135,
+ 91, 183, 168, 188, 19, 220, 29, 27, 524, 243,
+ 360, 538, 307, 287, 91, 91, 368, 121, 30, 28,
+ 1, 464, 272, 477, 123, 124, 125, 126, 127, 128,
+ 129, 130, 131, 132, 133, 134, 136, 274, 156, 155,
154, 153, 152, 151, 149, 150, 145, 146, 147, 148,
- 144, 143, 141, 142, 138, 139, 140, 137, 135, 582,
- 343, 581, 413, 503, 502, 590, 27, 589, 91, 144,
- 143, 141, 142, 138, 139, 140, 137, 135, 28, 283,
- 16, 411, 306, 355, 91, 9, 551, 550, 521, 520,
- 91, 7, 450, 337, 266, 506, 292, 371, 109, 295,
- 296, 107, 113, 111, 20, 87, 38, 0, 0, 199,
- 0, 91, 85, 0, 0, 90, 0, 99, 342, 0,
- 0, 91, 91, 319, 322, 92, 82, 0, 0, 0,
- 0, 87, 0, 0, 0, 91, 91, 0, 85, 91,
- 96, 90, 98, 95, 0, 0, 0, 88, 89, 86,
- 0, 92, 82, 0, 0, 0, 0, 0, 0, 0,
- 0, 87, 282, 77, 0, 0, 0, 0, 85, 0,
- 0, 90, 0, 88, 89, 86, 0, 333, 91, 0,
- 455, 92, 82, 0, 0, 0, 0, 91, 0, 77,
- 0, 91, 0, 347, 0, 50, 91, 0, 91, 351,
- 0, 0, 0, 88, 89, 86, 0, 91, 0, 0,
- 52, 53, 454, 91, 0, 0, 59, 72, 0, 77,
+ 144, 143, 141, 142, 138, 139, 140, 137, 135, 315,
+ 343, 542, 582, 581, 413, 503, 502, 590, 91, 144,
+ 143, 141, 142, 138, 139, 140, 137, 135, 589, 283,
+ 16, 411, 306, 355, 91, 9, 551, 87, 550, 521,
+ 91, 520, 7, 450, 85, 337, 292, 90, 266, 295,
+ 296, 506, 371, 109, 107, 87, 113, 92, 82, 199,
+ 111, 91, 85, 20, 38, 90, 0, 99, 282, 342,
+ 0, 91, 91, 319, 322, 92, 82, 0, 0, 88,
+ 89, 86, 0, 0, 0, 91, 91, 0, 0, 91,
+ 96, 0, 98, 95, 0, 77, 87, 88, 89, 86,
+ 0, 0, 0, 85, 0, 0, 90, 0, 0, 0,
+ 0, 0, 0, 77, 0, 0, 92, 82, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 333, 91, 0,
+ 455, 0, 0, 0, 0, 0, 0, 91, 88, 89,
+ 86, 91, 0, 347, 0, 50, 91, 0, 91, 351,
+ 0, 0, 0, 0, 77, 0, 0, 91, 0, 0,
+ 52, 53, 454, 91, 0, 0, 59, 72, 0, 0,
390, 57, 58, 0, 63, 0, 0, 73, 0, 0,
395, 396, 0, 0, 0, 76, 75, 69, 68, 74,
0, 18, 54, 55, 62, 60, 61, 64, 405, 0,
@@ -1000,78 +1001,78 @@ yyact := array[] of {
141, 142, 138, 139, 140, 137, 135,
};
yypact := array[] of {
- 198,-1000, 351, 172,-1000, 140,-1000,-1000, 137, 135,
- 692, 630, 14, 274, 463,-1000, 424, 530,-1000, 285,
+ 198,-1000, 370, 172,-1000, 140,-1000,-1000, 137, 135,
+ 633, 632, 12, 306, 482,-1000, 467, 550,-1000, 285,
-35, 130,-1000,-1000,-1000,-1000,-1000,1507,1507,1507,
-1507, 752, 583, 116, 144, 413, 396, -19, 460, 335,
--1000, 351, 18,-1000,-1000,-1000, 393,-1000,2272,-1000,
- 391, 497,1548,1548,1548,1548,1548,1548,1548,1548,
-1548,1548,1548,1548,1548, 523, 501, 521,1548, 376,
-1548,-1000,1507, 579,-1000,-1000,-1000, 580,2217,2162,
-2107, 288,-1000,-1000,-1000, 752, 494, 752, 492, 487,
- 530,-1000, 532,-1000,-1000, 752,1507, 251,1507, 134,
- 223, 530, 260, 348, 530, 216, 752, 551, 549, -36,
--1000, 456, 6, -37,-1000,-1000,-1000, 512,-1000, 285,
+1507, 737, 595, 120, 144, 427, 404, -19, 480, 335,
+-1000, 370, 16,-1000,-1000,-1000, 401,-1000,2272,-1000,
+ 396, 497,1548,1548,1548,1548,1548,1548,1548,1548,
+1548,1548,1548,1548,1548, 530, 520, 523,1548, 376,
+1548,-1000,1507, 583,-1000,-1000,-1000, 594,2217,2162,
+2107, 288,-1000,-1000,-1000, 737, 509, 737, 508, 503,
+ 550,-1000, 551,-1000,-1000, 737,1507, 251,1507, 134,
+ 239, 550, 265, 348, 550, 236, 737, 567, 565, -36,
+-1000, 474, 7, -38,-1000,-1000,-1000, 544,-1000, 285,
-1000, 172,-1000,1507,1507,1507,1507,1507,1507,1507,
-1507,1507,1507,1507,1507, 622,1507,1507,1507,1507,
+1507,1507,1507,1507,1507, 635,1507,1507,1507,1507,
1507,1507,1507,1507,1507,1507,1507,1507,1507,1507,
-1507,1507,1507,1507,1507,1507,1507,1507,1507, 389,
- 544,1396,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,-1000,-1000,-1000,-1000,-1000,1452, 307, 215,
- 752,1507,-1000,-1000,-1000, 17,2667,-1000,1507,-1000,
--1000,-1000,-1000,1507, 388, 379, 415, 752, 13, 415,
- 752, 752, 579, 452, 308,2052,-1000,1507,1997,-1000,
- 752, 627, 2,-1000,-1000, 121, 285,-1000,-1000, 351,
- 415,-1000,-1000, 334, 273, 273, 250,-1000,-1000,-1000,
+1507,1507,1507,1507,1507,1507,1507,1507,1507, 393,
+ 323,1396,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
+-1000,-1000,-1000,-1000,-1000,-1000,-1000,1452, 318, 224,
+ 737,1507,-1000,-1000,-1000, 14,2667,-1000,1507,-1000,
+-1000,-1000,-1000,1507, 391, 389, 424, 737, 13, 424,
+ 737, 737, 583, 452, 305,2052,-1000,1507,1997,-1000,
+ 737, 640, 49,-1000,-1000, 163, 285,-1000,-1000, 370,
+ 424,-1000,-1000, 334, 273, 273, 254,-1000,-1000,-1000,
172,2667,2667,2667,2667,2667,2667,2667,2667,2667,
-2667,2667,2667,1507,2667, 575, 575, 575, 575, 543,
- 543, 604, 604, 669, 669, 669, 669, 866, 866,1624,
-1848,1794,1741,1741,1687,2688, 547, -38,-1000, 406,
- 511, 449, -39,2667,-1000,1548, 476, 485, 752,2554,
- 479,1548,1507, 415,2515,-1000,1507, 260, 650,1942,
- 529, 524, 415,-1000, 752, 415, 415, 413, 12, 415,
- 752,-1000,-1000,1887,-1000, 11, 146,-1000, 625, 212,
-1121,-1000,-1000, 8, 188,-1000, 319, 546,-1000, 415,
--1000,2277, 415,-1000,-1000,-1000,2667,-1000,-1000,1507,
-1396,2273, 722, 415, 478, 200,-1000, 185, -46, 471,
-2667,-1000,1507,-1000,-1000, 452, 452, 415,-1000, 407,
--1000, 415,-1000, 104,-1000,-1000, 447, 103,-1000, 110,
--1000, 351,-1000,-1000,-1000, 437, 114,-1000, 5, 99,
- 572, 32, 370, 370,1507,1507,1507, 95,1507,2667,
- 376,1051,-1000,-1000, 351,-1000,-1000,-1000, 752,-1000,
- 415, 506, 505,2667,1548, 415, 415, 269, 808,-1000,
-1507, 752,2630, -2, -5, 415, 752,-1000,1587,-1000,
- -21,-1000,-1000,-1000, 431, 197, 183, 696,-1000,-1000,
--1000, 981, 570, 752,-1000,1507, 569, 557,1329,1507,
- 194, 354, 94,-1000, 92, 89,1832, 64,-1000, 4,
--1000,-1000, 244,-1000,-1000,-1000,-1000, 415, 808, 175,
- -53,-1000,2477, 365,1548,-1000, 415,-1000,-1000,-1000,
- 415, 305, 752,1507,-1000, 190, 219, 403, 145, 911,
- 420,1507, 176,2593,1507,1507, -17, 429,2424, 808,
- 609,-1000,-1000,-1000,-1000,-1000,-1000, 193,-1000, 169,
--1000, 808,1507, 808,1507,-1000, 293,1777, 351,1507,
- 752, 235, 167, 626,-1000, 283, 368,-1000, 625,-1000,
- 341, 3,-1000,1507,1329, 48, 545, 553,-1000, 808,
- 163,-1000, 361,2477,1507,-1000,-1000,2667,-1000,2667,
--1000,-1000, 162,1722, 227,-1000,-1000, 337, 327,-1000,
- 325, 106, 0,-1000,-1000,1667, 426,1507,1329,1507,
- 157,-1000, 358,-1000,1260,-1000,2371,-1000,-1000,-1000,
- 255, 427,-1000, 252,-1000,-1000, 808,-1000,1329, 41,
--1000, 542,-1000,1260,-1000, 356, 114,2477, 468,-1000,
--1000, 152,-1000, 353,-1000,1507, -1, 333,-1000, 148,
--1000, 326,-1000,-1000,-1000,-1000,1260,-1000, 535,-1000,
--1000,-1000,1191,-1000, 468, 316,1329, 278, 114, 376,
+2667,2667,2667,1507,2667, 581, 581, 581, 581, 591,
+ 591, 545, 545, 669, 669, 669, 669, 866, 866,1624,
+1848,1794,1741,1741,1687,2688, 563, -39,-1000, 420,
+ 543, 473, -40,2667,-1000,1548, 521, 502, 737,2554,
+ 501,1548,1507, 424,2515,-1000,1507, 265, 650,1942,
+ 548, 546, 424,-1000, 737, 424, 424, 427, 10, 424,
+ 737,-1000,-1000,1887,-1000, 11, 146,-1000, 638, 223,
+1121,-1000,-1000, 5, 191,-1000, 299, 562,-1000, 424,
+-1000,2277, 424,-1000,-1000,-1000,2667,-1000,-1000,1507,
+1396,2273, 678, 424, 494, 216,-1000, 189, -41, 492,
+2667,-1000,1507,-1000,-1000, 452, 452, 424,-1000, 407,
+-1000, 424,-1000, 119,-1000,-1000, 466, 116,-1000, 110,
+-1000, 370,-1000,-1000,-1000, 463, 0,-1000, -10, 114,
+ 574, 31, 388, 388,1507,1507,1507, 112,1507,2667,
+ 376,1051,-1000,-1000, 370,-1000,-1000,-1000, 737,-1000,
+ 424, 531, 528,2667,1548, 424, 424, 269, 808,-1000,
+1507, 737,2630, 6, 2, 424, 737,-1000,1587,-1000,
+ -21,-1000,-1000,-1000, 460, 215, 188, 696,-1000,-1000,
+-1000, 981, 573, 737,-1000,1507, 572, 570,1329,1507,
+ 212, 379, 107,-1000, 104, 103,1832, 99,-1000, 3,
+-1000,-1000, 338,-1000,-1000,-1000,-1000, 424, 808, 185,
+ -44,-1000,2477, 409,1548,-1000, 424,-1000,-1000,-1000,
+ 424, 293, 737,1507,-1000, 200, 219, 422, 194, 911,
+ 436,1507, 176,2593,1507,1507, -17, 449,2424, 808,
+ 622,-1000,-1000,-1000,-1000,-1000,-1000, 193,-1000, 183,
+-1000, 808,1507, 808,1507,-1000, 235,1777, 370,1507,
+ 737, 227, 175, 639,-1000, 283, 413,-1000, 638,-1000,
+ 354, -3,-1000,1507,1329, 89, 561, 569,-1000, 808,
+ 169,-1000, 406,2477,1507,-1000,-1000,2667,-1000,2667,
+-1000,-1000, 157,1722, 113,-1000,-1000, 351, 346,-1000,
+ 337, 106, 145,-1000,-1000,1667, 469,1507,1329,1507,
+ 152,-1000, 365,-1000,1260,-1000,2371,-1000,-1000,-1000,
+ 268, 447,-1000, 252,-1000,-1000, 808,-1000,1329, 51,
+-1000, 556,-1000,1260,-1000, 361, 0,2477, 468,-1000,
+-1000, 148,-1000, 358,-1000,1507, 21, 356,-1000, 32,
+-1000, 353,-1000,-1000,-1000,-1000,1260,-1000, 553,-1000,
+-1000,-1000,1191,-1000, 468, 333,1329, 278, 0, 376,
1548,-1000,-1000,-1000,-1000,
};
yypgo := array[] of {
- 0, 528, 736, 105, 33, 24, 419, 15, 14, 46,
- 734, 733, 732, 34, 731, 728, 27, 727, 16, 4,
- 725, 108, 8, 0, 21, 35, 13, 724, 723, 94,
- 25, 67, 26, 12, 722, 11, 2, 38, 41, 32,
- 721, 22, 3, 7, 719, 718, 717, 716, 715, 20,
- 713, 712, 711, 10, 710, 697, 695, 1, 694, 693,
- 692, 6, 5, 691, 689, 667, 19, 23, 652, 9,
- 651, 18, 650, 649, 17, 648, 647, 643, 633,
+ 0, 528, 744, 164, 33, 24, 419, 15, 14, 46,
+ 743, 740, 736, 34, 734, 733, 27, 732, 16, 4,
+ 731, 108, 8, 0, 21, 35, 13, 728, 725, 94,
+ 25, 67, 26, 12, 723, 11, 2, 38, 41, 32,
+ 722, 22, 3, 7, 721, 719, 718, 716, 715, 20,
+ 713, 712, 711, 10, 710, 708, 697, 1, 696, 695,
+ 694, 6, 5, 693, 692, 691, 19, 23, 689, 9,
+ 667, 18, 652, 651, 17, 650, 647, 646, 643,
};
yyr1 := array[] of {
0, 76, 75, 75, 38, 38, 39, 39, 39, 39,
@@ -1139,15 +1140,15 @@ yychk := array[] of {
-1000, -75, 73, -38, -39, 2, -37, -40, -49, -48,
-29, -31, -30, 75, -9, -66, -54, 59, 63, 39,
-10, -9, 59, -39, 72, 72, 72, 4, 16, 4,
- 16, 50, 98, 61, 50, -4, 54, -3, -2, 39,
- -21, 41, -32, -31, -29, 59, 98, 72, -23, -24,
+ 16, 50, 99, 61, 50, -4, 54, -3, -2, 39,
+ -21, 41, -32, -31, -29, 59, 99, 72, -23, -24,
17, -25, 32, 33, 64, 65, 34, 43, 44, 38,
67, 68, 66, 46, 69, 81, 82, 83, 60, 59,
-6, -29, 39, 49, 61, 58, 57, 97, -23, -23,
-23, -1, 60, -7, -8, 46, 83, 39, 81, 82,
49, -6, 59, -31, 72, 77, 74, -1, 76, 51,
78, 80, -67, 52, 59, 87, 50, -14, 34, -15,
- -16, -11, -30, -12, -31, 59, 63, -9, 40, 98,
+ -16, -11, -30, -12, -31, 59, 63, -9, 40, 99,
59, -76, 72, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 38, 16, 37, 34, 35,
36, 32, 33, 31, 30, 26, 27, 28, 29, 24,
@@ -1158,34 +1159,34 @@ yychk := array[] of {
72, 72, 72, 4, 53, 54, -1, 45, -13, -1,
45, 45, -21, 41, -1, -23, 72, 4, -23, 72,
39, 70, -21, -41, 70, 2, 39, -29, -21, 70,
- -1, 40, 40, 98, 50, 50, 98, 42, -31, -29,
+ -1, 40, 40, 99, 50, 50, 99, 42, -31, -29,
-38, -23, -23, -23, -23, -23, -23, -23, -23, -23,
-23, -23, -23, 4, -23, -23, -23, -23, -23, -23,
-23, -23, -23, -23, -23, -23, -23, -23, -23, -23,
-23, -23, -23, -23, -23, -23, -27, -26, 59, -25,
-71, -22, -72, -23, -70, 60, 81, 82, 79, -23,
- 42, 60, 70, -1, -23, 40, 98, -78, -23, -23,
- 59, 59, -1, 40, 98, -1, -1, -4, -74, -1,
+ 42, 60, 70, -1, -23, 40, 99, -78, -23, -23,
+ 59, 59, -1, 40, 99, -1, -1, -4, -74, -1,
79, 72, 72, -23, 72, -13, -51, 2, 70, 87,
-43, 71, 70, -32, -69, -68, -9, 34, -16, -1,
-5, 84, -1, -5, 59, 63, -23, 40, 42, 50,
- 98, 45, 45, -1, 42, 45, -24, -28, -26, 42,
- -23, -41, 98, 40, 72, 41, 41, -1, -67, 98,
+ 99, 45, 45, -1, 42, 45, -24, -28, -26, 42,
+ -23, -41, 99, 40, 72, 41, 41, -1, -67, 99,
42, -1, 72, 40, 71, -50, -9, -49, -66, -53,
2, 70, 71, -37, -42, -9, 2, 70, -77, -22,
47, -17, 88, 92, 93, 95, 96, 94, 39, -23,
59, -43, 40, 71, -62, 62, 40, -7, 46, -8,
-1, -22, -71, -23, 60, -1, -1, 45, 70, 71,
- 98, 45, -23, -74, -74, -1, 79, 72, 50, 72,
+ 99, 45, -23, -74, -74, -1, 79, 72, 50, 72,
71, -52, -61, -60, -9, 91, -69, 50, 72, 71,
- 70, -43, 98, 50, 72, 39, 87, 86, 85, 90,
+ 70, -43, 99, 50, 72, 39, 87, 86, 85, 90,
89, 91, -18, 59, -18, -22, -23, -22, 72, -26,
71, -61, -9, -7, -8, 42, 42, -1, 70, -33,
-34, -35, -23, -36, 34, 2, -1, 40, 42, 42,
-1, -1, 77, 76, -73, 87, 50, 70, 71, -43,
71, 39, -1, -23, 39, 39, -42, -9, -23, 70,
59, 72, 72, 72, 72, 72, 40, 50, 62, -33,
- 71, 98, 55, 56, 62, 72, -1, -23, 70, 76,
+ 71, 99, 55, 56, 62, 72, -1, -23, 70, 76,
79, -1, -58, -59, 2, -19, -20, 59, 70, 71,
51, -26, 72, 4, 40, -22, -22, 86, 50, 70,
-44, -45, -36, -23, 16, 71, -35, -23, -36, -23,
@@ -1268,7 +1269,7 @@ yytok1 := array[] of {
3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 64, 3, 3, 3, 36, 23, 3,
- 39, 40, 34, 32, 98, 33, 54, 35, 3, 3,
+ 39, 40, 34, 32, 99, 33, 54, 35, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 50, 72,
26, 4, 27, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
@@ -1286,7 +1287,7 @@ yytok2 := array[] of {
59, 60, 61, 62, 63, 66, 67, 68, 69, 73,
74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
84, 85, 86, 87, 88, 89, 90, 91, 92, 93,
- 94, 95, 96, 97,
+ 94, 95, 96, 97, 98,
};
yytok3 := array[] of {
0
@@ -1498,17 +1499,17 @@ yystack:
case yym {
1=>
-#line 151 "limbo.y"
+#line 152 "limbo.y"
{
impmods = yys[yypt-1].yyv.ids;
}
2=>
-#line 154 "limbo.y"
+#line 155 "limbo.y"
{
tree = rotater(yys[yypt-0].yyv.node);
}
3=>
-#line 158 "limbo.y"
+#line 159 "limbo.y"
{
impmods = nil;
tree = rotater(yys[yypt-0].yyv.node);
@@ -1516,7 +1517,7 @@ yystack:
4=>
yyval.node = yys[yyp+1].yyv.node;
5=>
-#line 166 "limbo.y"
+#line 167 "limbo.y"
{
if(yys[yypt-1].yyv.node == nil)
yyval.node = yys[yypt-0].yyv.node;
@@ -1526,7 +1527,7 @@ yyval.node = yys[yyp+1].yyv.node;
yyval.node = mkbin(Oseq, yys[yypt-1].yyv.node, yys[yypt-0].yyv.node);
}
6=>
-#line 177 "limbo.y"
+#line 178 "limbo.y"
{
yyval.node = nil;
}
@@ -1539,33 +1540,33 @@ yyval.node = yys[yyp+1].yyv.node;
10=>
yyval.node = yys[yyp+1].yyv.node;
11=>
-#line 185 "limbo.y"
+#line 186 "limbo.y"
{
yyval.node = mkbin(Oas, yys[yypt-3].yyv.node, yys[yypt-1].yyv.node);
}
12=>
-#line 189 "limbo.y"
+#line 190 "limbo.y"
{
yyval.node = mkbin(Oas, yys[yypt-3].yyv.node, yys[yypt-1].yyv.node);
}
13=>
-#line 193 "limbo.y"
+#line 194 "limbo.y"
{
yyval.node = mkbin(Odas, yys[yypt-3].yyv.node, yys[yypt-1].yyv.node);
}
14=>
-#line 197 "limbo.y"
+#line 198 "limbo.y"
{
yyval.node = mkbin(Odas, yys[yypt-3].yyv.node, yys[yypt-1].yyv.node);
}
15=>
-#line 201 "limbo.y"
+#line 202 "limbo.y"
{
yyerror("illegal declaration");
yyval.node = nil;
}
16=>
-#line 206 "limbo.y"
+#line 207 "limbo.y"
{
yyerror("illegal declaration");
yyval.node = nil;
@@ -1573,68 +1574,68 @@ yyval.node = yys[yyp+1].yyv.node;
17=>
yyval.node = yys[yyp+1].yyv.node;
18=>
-#line 214 "limbo.y"
+#line 215 "limbo.y"
{
yyval.node = mkbin(Oseq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
19=>
-#line 220 "limbo.y"
+#line 221 "limbo.y"
{
includef(yys[yypt-1].yyv.tok.v.idval);
yyval.node = nil;
}
20=>
-#line 225 "limbo.y"
+#line 226 "limbo.y"
{
yyval.node = typedecl(yys[yypt-4].yyv.ids, yys[yypt-1].yyv.ty);
}
21=>
-#line 229 "limbo.y"
+#line 230 "limbo.y"
{
yyval.node = importdecl(yys[yypt-1].yyv.node, yys[yypt-4].yyv.ids);
yyval.node.src.start = yys[yypt-4].yyv.ids.src.start;
yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
}
22=>
-#line 235 "limbo.y"
+#line 236 "limbo.y"
{
yyval.node = vardecl(yys[yypt-3].yyv.ids, yys[yypt-1].yyv.ty);
}
23=>
-#line 239 "limbo.y"
+#line 240 "limbo.y"
{
yyval.node = mkbin(Ovardecli, vardecl(yys[yypt-5].yyv.ids, yys[yypt-3].yyv.ty), varinit(yys[yypt-5].yyv.ids, yys[yypt-1].yyv.node));
}
24=>
-#line 243 "limbo.y"
+#line 244 "limbo.y"
{
yyval.node = condecl(yys[yypt-4].yyv.ids, yys[yypt-1].yyv.node);
}
25=>
yyval.node = yys[yyp+1].yyv.node;
26=>
-#line 250 "limbo.y"
+#line 251 "limbo.y"
{
yyval.node = exdecl(yys[yypt-3].yyv.ids, nil);
}
27=>
-#line 254 "limbo.y"
+#line 255 "limbo.y"
{
yyval.node = exdecl(yys[yypt-6].yyv.ids, revids(yys[yypt-2].yyv.ids));
}
28=>
-#line 260 "limbo.y"
+#line 261 "limbo.y"
{
yys[yypt-5].yyv.ids.src.stop = yys[yypt-0].yyv.tok.src.stop;
yyval.node = moddecl(yys[yypt-5].yyv.ids, rotater(yys[yypt-1].yyv.node));
}
29=>
-#line 267 "limbo.y"
+#line 268 "limbo.y"
{
yyval.node = nil;
}
30=>
-#line 271 "limbo.y"
+#line 272 "limbo.y"
{
if(yys[yypt-1].yyv.node == nil)
yyval.node = yys[yypt-0].yyv.node;
@@ -1644,31 +1645,31 @@ yyval.node = yys[yyp+1].yyv.node;
yyval.node = mkn(Oseq, yys[yypt-1].yyv.node, yys[yypt-0].yyv.node);
}
31=>
-#line 280 "limbo.y"
+#line 281 "limbo.y"
{
yyval.node = nil;
}
32=>
-#line 286 "limbo.y"
+#line 287 "limbo.y"
{
yyval.node = fielddecl(Dglobal, typeids(yys[yypt-3].yyv.ids, yys[yypt-1].yyv.ty));
}
33=>
yyval.node = yys[yyp+1].yyv.node;
34=>
-#line 291 "limbo.y"
+#line 292 "limbo.y"
{
yyval.node = typedecl(yys[yypt-4].yyv.ids, yys[yypt-1].yyv.ty);
}
35=>
-#line 295 "limbo.y"
+#line 296 "limbo.y"
{
yyval.node = condecl(yys[yypt-4].yyv.ids, yys[yypt-1].yyv.node);
}
36=>
yyval.node = yys[yyp+1].yyv.node;
37=>
-#line 302 "limbo.y"
+#line 303 "limbo.y"
{
yys[yypt-7].yyv.ids.src.stop = yys[yypt-1].yyv.tok.src.stop;
yyval.node = adtdecl(yys[yypt-7].yyv.ids, rotater(yys[yypt-2].yyv.node));
@@ -1676,7 +1677,7 @@ yyval.node = yys[yyp+1].yyv.node;
yyval.node.ty.val = rotater(yys[yypt-0].yyv.node);
}
38=>
-#line 309 "limbo.y"
+#line 310 "limbo.y"
{
yys[yypt-10].yyv.ids.src.stop = yys[yypt-0].yyv.tok.src.stop;
yyval.node = adtdecl(yys[yypt-10].yyv.ids, rotater(yys[yypt-1].yyv.node));
@@ -1684,22 +1685,22 @@ yyval.node = yys[yyp+1].yyv.node;
yyval.node.ty.val = rotater(yys[yypt-4].yyv.node);
}
39=>
-#line 318 "limbo.y"
+#line 319 "limbo.y"
{
yyval.node = nil;
}
40=>
-#line 322 "limbo.y"
+#line 323 "limbo.y"
{
yyval.node = yys[yypt-1].yyv.node;
}
41=>
-#line 328 "limbo.y"
+#line 329 "limbo.y"
{
yyval.node = nil;
}
42=>
-#line 332 "limbo.y"
+#line 333 "limbo.y"
{
if(yys[yypt-1].yyv.node == nil)
yyval.node = yys[yypt-0].yyv.node;
@@ -1709,7 +1710,7 @@ yyval.node = yys[yyp+1].yyv.node;
yyval.node = mkn(Oseq, yys[yypt-1].yyv.node, yys[yypt-0].yyv.node);
}
43=>
-#line 341 "limbo.y"
+#line 342 "limbo.y"
{
yyval.node = nil;
}
@@ -1718,17 +1719,17 @@ yyval.node = yys[yyp+1].yyv.node;
45=>
yyval.node = yys[yyp+1].yyv.node;
46=>
-#line 349 "limbo.y"
+#line 350 "limbo.y"
{
yyval.node = condecl(yys[yypt-4].yyv.ids, yys[yypt-1].yyv.node);
}
47=>
-#line 355 "limbo.y"
+#line 356 "limbo.y"
{
yyval.node = nil;
}
48=>
-#line 359 "limbo.y"
+#line 360 "limbo.y"
{
if(yys[yypt-1].yyv.node == nil)
yyval.node = yys[yypt-0].yyv.node;
@@ -1738,159 +1739,159 @@ yyval.node = yys[yyp+1].yyv.node;
yyval.node = mkn(Oseq, yys[yypt-1].yyv.node, yys[yypt-0].yyv.node);
}
49=>
-#line 370 "limbo.y"
+#line 371 "limbo.y"
{
for(d := yys[yypt-4].yyv.ids; d != nil; d = d.next)
d.cyc = byte 1;
yyval.node = fielddecl(Dfield, typeids(yys[yypt-4].yyv.ids, yys[yypt-1].yyv.ty));
}
50=>
-#line 376 "limbo.y"
+#line 377 "limbo.y"
{
yyval.node = fielddecl(Dfield, typeids(yys[yypt-3].yyv.ids, yys[yypt-1].yyv.ty));
}
51=>
-#line 382 "limbo.y"
+#line 383 "limbo.y"
{
yyval.node = yys[yypt-1].yyv.node;
}
52=>
-#line 388 "limbo.y"
+#line 389 "limbo.y"
{
yys[yypt-1].yyv.node.right.right = yys[yypt-0].yyv.node;
yyval.node = yys[yypt-1].yyv.node;
}
53=>
-#line 393 "limbo.y"
+#line 394 "limbo.y"
{
yyval.node = nil;
}
54=>
-#line 397 "limbo.y"
+#line 398 "limbo.y"
{
yyval.node = nil;
}
55=>
-#line 403 "limbo.y"
+#line 404 "limbo.y"
{
yyval.node = mkn(Opickdecl, nil, mkn(Oseq, fielddecl(Dtag, yys[yypt-1].yyv.ids), nil));
typeids(yys[yypt-1].yyv.ids, mktype(yys[yypt-1].yyv.ids.src.start, yys[yypt-1].yyv.ids.src.stop, Tadtpick, nil, nil));
}
56=>
-#line 408 "limbo.y"
+#line 409 "limbo.y"
{
yys[yypt-3].yyv.node.right.right = yys[yypt-2].yyv.node;
yyval.node = mkn(Opickdecl, yys[yypt-3].yyv.node, mkn(Oseq, fielddecl(Dtag, yys[yypt-1].yyv.ids), nil));
typeids(yys[yypt-1].yyv.ids, mktype(yys[yypt-1].yyv.ids.src.start, yys[yypt-1].yyv.ids.src.stop, Tadtpick, nil, nil));
}
57=>
-#line 414 "limbo.y"
+#line 415 "limbo.y"
{
yyval.node = mkn(Opickdecl, nil, mkn(Oseq, fielddecl(Dtag, yys[yypt-1].yyv.ids), nil));
typeids(yys[yypt-1].yyv.ids, mktype(yys[yypt-1].yyv.ids.src.start, yys[yypt-1].yyv.ids.src.stop, Tadtpick, nil, nil));
}
58=>
-#line 421 "limbo.y"
+#line 422 "limbo.y"
{
yyval.ids = revids(yys[yypt-0].yyv.ids);
}
59=>
-#line 427 "limbo.y"
+#line 428 "limbo.y"
{
yyval.ids = mkids(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval, nil, nil);
}
60=>
-#line 431 "limbo.y"
+#line 432 "limbo.y"
{
yyval.ids = mkids(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval, nil, yys[yypt-2].yyv.ids);
}
61=>
-#line 437 "limbo.y"
+#line 438 "limbo.y"
{
yyval.ids = revids(yys[yypt-0].yyv.ids);
}
62=>
-#line 443 "limbo.y"
+#line 444 "limbo.y"
{
yyval.ids = mkids(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval, nil, nil);
}
63=>
-#line 447 "limbo.y"
+#line 448 "limbo.y"
{
yyval.ids = mkids(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval, nil, yys[yypt-2].yyv.ids);
}
64=>
-#line 453 "limbo.y"
+#line 454 "limbo.y"
{
yyval.ty = mktype(yys[yypt-5].yyv.tok.src.start, yys[yypt-0].yyv.tok.src.stop, Tfix, nil, nil);
yyval.ty.val = mkbin(Oseq, yys[yypt-3].yyv.node, yys[yypt-1].yyv.node);
}
65=>
-#line 458 "limbo.y"
+#line 459 "limbo.y"
{
yyval.ty = mktype(yys[yypt-3].yyv.tok.src.start, yys[yypt-0].yyv.tok.src.stop, Tfix, nil, nil);
yyval.ty.val = yys[yypt-1].yyv.node;
}
66=>
-#line 465 "limbo.y"
+#line 466 "limbo.y"
{
yyval.types = addtype(yys[yypt-0].yyv.ty, nil);
}
67=>
-#line 469 "limbo.y"
+#line 470 "limbo.y"
{
yyval.types = addtype(yys[yypt-0].yyv.ty, nil);
yys[yypt-0].yyv.ty.flags |= CYCLIC;
}
68=>
-#line 474 "limbo.y"
+#line 475 "limbo.y"
{
yyval.types = addtype(yys[yypt-0].yyv.ty, yys[yypt-2].yyv.types);
}
69=>
-#line 478 "limbo.y"
+#line 479 "limbo.y"
{
yyval.types = addtype(yys[yypt-0].yyv.ty, yys[yypt-3].yyv.types);
yys[yypt-0].yyv.ty.flags |= CYCLIC;
}
70=>
-#line 485 "limbo.y"
+#line 486 "limbo.y"
{
yyval.ty = mkidtype(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval);
}
71=>
-#line 489 "limbo.y"
+#line 490 "limbo.y"
{
yyval.ty = yys[yypt-0].yyv.ty;
}
72=>
-#line 493 "limbo.y"
+#line 494 "limbo.y"
{
yyval.ty = yys[yypt-0].yyv.ty;
}
73=>
-#line 497 "limbo.y"
+#line 498 "limbo.y"
{
yyval.ty = mkarrowtype(yys[yypt-2].yyv.ty.src.start, yys[yypt-0].yyv.tok.src.stop, yys[yypt-2].yyv.ty, yys[yypt-0].yyv.tok.v.idval);
}
74=>
-#line 501 "limbo.y"
+#line 502 "limbo.y"
{
yyval.ty = mkarrowtype(yys[yypt-5].yyv.ty.src.start, yys[yypt-3].yyv.tok.src.stop, yys[yypt-5].yyv.ty, yys[yypt-3].yyv.tok.v.idval);
yyval.ty = mkinsttype(yys[yypt-5].yyv.ty.src, yyval.ty, yys[yypt-1].yyv.types);
}
75=>
-#line 506 "limbo.y"
+#line 507 "limbo.y"
{
yyval.ty = mktype(yys[yypt-1].yyv.tok.src.start, yys[yypt-0].yyv.ty.src.stop, Tref, yys[yypt-0].yyv.ty, nil);
}
76=>
-#line 510 "limbo.y"
+#line 511 "limbo.y"
{
yyval.ty = mktype(yys[yypt-2].yyv.tok.src.start, yys[yypt-0].yyv.ty.src.stop, Tchan, yys[yypt-0].yyv.ty, nil);
}
77=>
-#line 514 "limbo.y"
+#line 515 "limbo.y"
{
if(yys[yypt-1].yyv.ids.next == nil)
yyval.ty = yys[yypt-1].yyv.ids.ty;
@@ -1898,17 +1899,17 @@ yyval.node = yys[yyp+1].yyv.node;
yyval.ty = mktype(yys[yypt-2].yyv.tok.src.start, yys[yypt-0].yyv.tok.src.stop, Ttuple, nil, revids(yys[yypt-1].yyv.ids));
}
78=>
-#line 521 "limbo.y"
+#line 522 "limbo.y"
{
yyval.ty = mktype(yys[yypt-2].yyv.tok.src.start, yys[yypt-0].yyv.ty.src.stop, Tarray, yys[yypt-0].yyv.ty, nil);
}
79=>
-#line 525 "limbo.y"
+#line 526 "limbo.y"
{
yyval.ty = mktype(yys[yypt-2].yyv.tok.src.start, yys[yypt-0].yyv.ty.src.stop, Tlist, yys[yypt-0].yyv.ty, nil);
}
80=>
-#line 529 "limbo.y"
+#line 530 "limbo.y"
{
yys[yypt-1].yyv.ty.src.start = yys[yypt-3].yyv.tok.src.start;
yys[yypt-1].yyv.ty.polys = yys[yypt-2].yyv.ids;
@@ -1918,88 +1919,88 @@ yyval.node = yys[yyp+1].yyv.node;
81=>
yyval.ty = yys[yyp+1].yyv.ty;
82=>
-#line 549 "limbo.y"
+#line 550 "limbo.y"
{
yyval.ty = mkidtype(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval);
}
83=>
-#line 553 "limbo.y"
+#line 554 "limbo.y"
{
yyval.ty = mkinsttype(yys[yypt-3].yyv.tok.src, mkidtype(yys[yypt-3].yyv.tok.src, yys[yypt-3].yyv.tok.v.idval), yys[yypt-1].yyv.types);
}
84=>
-#line 559 "limbo.y"
+#line 560 "limbo.y"
{
yyval.ty = mkdottype(yys[yypt-2].yyv.ty.src.start, yys[yypt-0].yyv.tok.src.stop, yys[yypt-2].yyv.ty, yys[yypt-0].yyv.tok.v.idval);
}
85=>
-#line 563 "limbo.y"
+#line 564 "limbo.y"
{
yyval.ty = mkdottype(yys[yypt-5].yyv.ty.src.start, yys[yypt-3].yyv.tok.src.stop, yys[yypt-5].yyv.ty, yys[yypt-3].yyv.tok.v.idval);
yyval.ty = mkinsttype(yys[yypt-5].yyv.ty.src, yyval.ty, yys[yypt-1].yyv.types);
}
86=>
-#line 570 "limbo.y"
+#line 571 "limbo.y"
{
yyval.ids = mkids(yys[yypt-0].yyv.ty.src, nil, yys[yypt-0].yyv.ty, nil);
}
87=>
-#line 574 "limbo.y"
+#line 575 "limbo.y"
{
yyval.ids = mkids(yys[yypt-2].yyv.ids.src, nil, yys[yypt-0].yyv.ty, yys[yypt-2].yyv.ids);
}
88=>
-#line 580 "limbo.y"
+#line 581 "limbo.y"
{
yyval.ids = nil;
}
89=>
-#line 584 "limbo.y"
+#line 585 "limbo.y"
{
yyval.ids = polydecl(yys[yypt-1].yyv.ids);
}
90=>
-#line 590 "limbo.y"
+#line 591 "limbo.y"
{
yyval.ty = mktype(yys[yypt-2].yyv.tok.src.start, yys[yypt-0].yyv.tok.src.stop, Tfn, tnone, yys[yypt-1].yyv.ids);
}
91=>
-#line 594 "limbo.y"
+#line 595 "limbo.y"
{
yyval.ty = mktype(yys[yypt-2].yyv.tok.src.start, yys[yypt-0].yyv.tok.src.stop, Tfn, tnone, nil);
yyval.ty.varargs = byte 1;
}
92=>
-#line 599 "limbo.y"
+#line 600 "limbo.y"
{
yyval.ty = mktype(yys[yypt-4].yyv.tok.src.start, yys[yypt-0].yyv.tok.src.stop, Tfn, tnone, yys[yypt-3].yyv.ids);
yyval.ty.varargs = byte 1;
}
93=>
-#line 606 "limbo.y"
+#line 607 "limbo.y"
{
yyval.ty = yys[yypt-0].yyv.ty;
}
94=>
-#line 610 "limbo.y"
+#line 611 "limbo.y"
{
yys[yypt-2].yyv.ty.tof = yys[yypt-0].yyv.ty;
yys[yypt-2].yyv.ty.src.stop = yys[yypt-0].yyv.ty.src.stop;
yyval.ty = yys[yypt-2].yyv.ty;
}
95=>
-#line 618 "limbo.y"
+#line 619 "limbo.y"
{
yyval.ty = yys[yypt-0].yyv.ty;
}
96=>
-#line 622 "limbo.y"
+#line 623 "limbo.y"
{
yyval.ty = yys[yypt-4].yyv.ty;
yyval.ty.val = rotater(yys[yypt-1].yyv.node);
}
97=>
-#line 629 "limbo.y"
+#line 630 "limbo.y"
{
yyval.ids = nil;
}
@@ -2008,87 +2009,87 @@ yyval.ids = yys[yyp+1].yyv.ids;
99=>
yyval.ids = yys[yyp+1].yyv.ids;
100=>
-#line 637 "limbo.y"
+#line 638 "limbo.y"
{
yyval.ids = appdecls(yys[yypt-2].yyv.ids, yys[yypt-0].yyv.ids);
}
101=>
-#line 643 "limbo.y"
+#line 644 "limbo.y"
{
yyval.ids = typeids(yys[yypt-2].yyv.ids, yys[yypt-0].yyv.ty);
}
102=>
-#line 647 "limbo.y"
+#line 648 "limbo.y"
{
yyval.ids = typeids(yys[yypt-2].yyv.ids, yys[yypt-0].yyv.ty);
for(d := yyval.ids; d != nil; d = d.next)
d.implicit = byte 1;
}
103=>
-#line 653 "limbo.y"
+#line 654 "limbo.y"
{
yyval.ids = mkids(yys[yypt-2].yyv.node.src, enter("junk", 0), yys[yypt-0].yyv.ty, nil);
yyval.ids.store = Darg;
yyerror("illegal argument declaraion");
}
104=>
-#line 659 "limbo.y"
+#line 660 "limbo.y"
{
yyval.ids = mkids(yys[yypt-2].yyv.node.src, enter("junk", 0), yys[yypt-0].yyv.ty, nil);
yyval.ids.store = Darg;
yyerror("illegal argument declaraion");
}
105=>
-#line 667 "limbo.y"
+#line 668 "limbo.y"
{
yyval.ids = revids(yys[yypt-0].yyv.ids);
}
106=>
-#line 673 "limbo.y"
+#line 674 "limbo.y"
{
yyval.ids = mkids(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval, nil, nil);
yyval.ids.store = Darg;
}
107=>
-#line 678 "limbo.y"
+#line 679 "limbo.y"
{
yyval.ids = mkids(yys[yypt-0].yyv.tok.src, nil, nil, nil);
yyval.ids.store = Darg;
}
108=>
-#line 683 "limbo.y"
+#line 684 "limbo.y"
{
yyval.ids = mkids(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval, nil, yys[yypt-2].yyv.ids);
yyval.ids.store = Darg;
}
109=>
-#line 688 "limbo.y"
+#line 689 "limbo.y"
{
yyval.ids = mkids(yys[yypt-0].yyv.tok.src, nil, nil, yys[yypt-2].yyv.ids);
yyval.ids.store = Darg;
}
110=>
-#line 695 "limbo.y"
+#line 696 "limbo.y"
{
yyval.ty = yys[yypt-0].yyv.ty;
}
111=>
-#line 699 "limbo.y"
+#line 700 "limbo.y"
{
yyval.ty = mktype(yys[yypt-1].yyv.tok.src.start, yys[yypt-0].yyv.tok.src.stop, Tref, yys[yypt-0].yyv.ty, nil);
}
112=>
-#line 703 "limbo.y"
+#line 704 "limbo.y"
{
yyval.ty = yys[yypt-0].yyv.ty;
}
113=>
-#line 707 "limbo.y"
+#line 708 "limbo.y"
{
yyval.ty = mktype(yys[yypt-1].yyv.tok.src.start, yys[yypt-0].yyv.tok.src.stop, Tref, yys[yypt-0].yyv.ty, nil);
}
114=>
-#line 713 "limbo.y"
+#line 714 "limbo.y"
{
yyval.node = fndecl(yys[yypt-3].yyv.node, yys[yypt-2].yyv.ty, yys[yypt-0].yyv.node);
nfns++;
@@ -2113,26 +2114,26 @@ yyval.ids = yys[yyp+1].yyv.ids;
yyval.node.src = yys[yypt-3].yyv.node.src;
}
115=>
-#line 739 "limbo.y"
+#line 740 "limbo.y"
{
yyval.node = mkn(Otuple, rotater(yys[yypt-1].yyv.node), nil);
yyval.node.src.start = yys[yypt-3].yyv.tok.src.start;
yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
}
116=>
-#line 745 "limbo.y"
+#line 746 "limbo.y"
{
yyval.node = mkn(Otuple, mkunary(Oseq, yys[yypt-0].yyv.node), nil);
yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
yyval.node.src.stop = yys[yypt-0].yyv.node.src.stop;
}
117=>
-#line 751 "limbo.y"
+#line 752 "limbo.y"
{
yyval.node = nil;
}
118=>
-#line 757 "limbo.y"
+#line 758 "limbo.y"
{
if(yys[yypt-1].yyv.node == nil){
yys[yypt-1].yyv.node = mkn(Onothing, nil, nil);
@@ -2144,17 +2145,17 @@ yyval.ids = yys[yyp+1].yyv.ids;
yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
}
119=>
-#line 768 "limbo.y"
+#line 769 "limbo.y"
{
yyval.node = mkn(Onothing, nil, nil);
}
120=>
-#line 772 "limbo.y"
+#line 773 "limbo.y"
{
yyval.node = mkn(Onothing, nil, nil);
}
121=>
-#line 778 "limbo.y"
+#line 779 "limbo.y"
{
yyval.node = mkname(yys[yypt-1].yyv.tok.src, yys[yypt-1].yyv.tok.v.idval);
if(yys[yypt-0].yyv.ids != nil){
@@ -2163,7 +2164,7 @@ yyval.ids = yys[yyp+1].yyv.ids;
}
}
122=>
-#line 786 "limbo.y"
+#line 787 "limbo.y"
{
yyval.node = mkbin(Odot, yys[yypt-3].yyv.node, mkname(yys[yypt-1].yyv.tok.src, yys[yypt-1].yyv.tok.v.idval));
if(yys[yypt-0].yyv.ids != nil){
@@ -2172,12 +2173,12 @@ yyval.ids = yys[yyp+1].yyv.ids;
}
}
123=>
-#line 796 "limbo.y"
+#line 797 "limbo.y"
{
yyval.node = nil;
}
124=>
-#line 800 "limbo.y"
+#line 801 "limbo.y"
{
if(yys[yypt-1].yyv.node == nil)
yyval.node = yys[yypt-0].yyv.node;
@@ -2187,7 +2188,7 @@ yyval.ids = yys[yyp+1].yyv.ids;
yyval.node = mkbin(Oseq, yys[yypt-1].yyv.node, yys[yypt-0].yyv.node);
}
125=>
-#line 809 "limbo.y"
+#line 810 "limbo.y"
{
if(yys[yypt-1].yyv.node == nil)
yyval.node = yys[yypt-0].yyv.node;
@@ -2195,28 +2196,28 @@ yyval.ids = yys[yyp+1].yyv.ids;
yyval.node = mkbin(Oseq, yys[yypt-1].yyv.node, yys[yypt-0].yyv.node);
}
128=>
-#line 822 "limbo.y"
+#line 823 "limbo.y"
{
yyval.node = mkn(Onothing, nil, nil);
yyval.node.src.start = curline();
yyval.node.src.stop = yyval.node.src.start;
}
129=>
-#line 828 "limbo.y"
+#line 829 "limbo.y"
{
yyval.node = mkn(Onothing, nil, nil);
yyval.node.src.start = curline();
yyval.node.src.stop = yyval.node.src.start;
}
130=>
-#line 834 "limbo.y"
+#line 835 "limbo.y"
{
yyval.node = mkn(Onothing, nil, nil);
yyval.node.src.start = curline();
yyval.node.src.stop = yyval.node.src.start;
}
131=>
-#line 840 "limbo.y"
+#line 841 "limbo.y"
{
if(yys[yypt-1].yyv.node == nil){
yys[yypt-1].yyv.node = mkn(Onothing, nil, nil);
@@ -2226,7 +2227,7 @@ yyval.ids = yys[yyp+1].yyv.ids;
yyval.node = mkscope(rotater(yys[yypt-1].yyv.node));
}
132=>
-#line 849 "limbo.y"
+#line 850 "limbo.y"
{
yyerror("illegal declaration");
yyval.node = mkn(Onothing, nil, nil);
@@ -2234,7 +2235,7 @@ yyval.ids = yys[yyp+1].yyv.ids;
yyval.node.src.stop = yyval.node.src.start;
}
133=>
-#line 856 "limbo.y"
+#line 857 "limbo.y"
{
yyerror("illegal declaration");
yyval.node = mkn(Onothing, nil, nil);
@@ -2242,26 +2243,26 @@ yyval.ids = yys[yyp+1].yyv.ids;
yyval.node.src.stop = yyval.node.src.start;
}
134=>
-#line 863 "limbo.y"
+#line 864 "limbo.y"
{
yyval.node = yys[yypt-1].yyv.node;
}
135=>
-#line 867 "limbo.y"
+#line 868 "limbo.y"
{
yyval.node = mkn(Oif, yys[yypt-2].yyv.node, mkunary(Oseq, yys[yypt-0].yyv.node));
yyval.node.src.start = yys[yypt-4].yyv.tok.src.start;
yyval.node.src.stop = yys[yypt-0].yyv.node.src.stop;
}
136=>
-#line 873 "limbo.y"
+#line 874 "limbo.y"
{
yyval.node = mkn(Oif, yys[yypt-4].yyv.node, mkbin(Oseq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node));
yyval.node.src.start = yys[yypt-6].yyv.tok.src.start;
yyval.node.src.stop = yys[yypt-0].yyv.node.src.stop;
}
137=>
-#line 879 "limbo.y"
+#line 880 "limbo.y"
{
yyval.node = mkunary(Oseq, yys[yypt-0].yyv.node);
if(yys[yypt-2].yyv.node.op != Onothing)
@@ -2272,7 +2273,7 @@ yyval.ids = yys[yyp+1].yyv.ids;
yyval.node = mkbin(Oseq, yys[yypt-6].yyv.node, yyval.node);
}
138=>
-#line 889 "limbo.y"
+#line 890 "limbo.y"
{
yyval.node = mkn(Ofor, yys[yypt-2].yyv.node, mkunary(Oseq, yys[yypt-0].yyv.node));
yyval.node.src.start = yys[yypt-4].yyv.tok.src.start;
@@ -2280,7 +2281,7 @@ yyval.ids = yys[yyp+1].yyv.ids;
yyval.node.decl = yys[yypt-5].yyv.ids;
}
139=>
-#line 896 "limbo.y"
+#line 897 "limbo.y"
{
yyval.node = mkn(Odo, yys[yypt-2].yyv.node, yys[yypt-5].yyv.node);
yyval.node.src.start = yys[yypt-6].yyv.tok.src.start;
@@ -2288,21 +2289,21 @@ yyval.ids = yys[yyp+1].yyv.ids;
yyval.node.decl = yys[yypt-7].yyv.ids;
}
140=>
-#line 903 "limbo.y"
+#line 904 "limbo.y"
{
yyval.node = mkn(Obreak, nil, nil);
yyval.node.decl = yys[yypt-1].yyv.ids;
yyval.node.src = yys[yypt-2].yyv.tok.src;
}
141=>
-#line 909 "limbo.y"
+#line 910 "limbo.y"
{
yyval.node = mkn(Ocont, nil, nil);
yyval.node.decl = yys[yypt-1].yyv.ids;
yyval.node.src = yys[yypt-2].yyv.tok.src;
}
142=>
-#line 915 "limbo.y"
+#line 916 "limbo.y"
{
yyval.node = mkn(Oret, yys[yypt-1].yyv.node, nil);
yyval.node.src = yys[yypt-2].yyv.tok.src;
@@ -2312,35 +2313,35 @@ yyval.ids = yys[yyp+1].yyv.ids;
yyval.node.src.stop = yys[yypt-1].yyv.node.src.stop;
}
143=>
-#line 924 "limbo.y"
+#line 925 "limbo.y"
{
yyval.node = mkn(Ospawn, yys[yypt-1].yyv.node, nil);
yyval.node.src.start = yys[yypt-2].yyv.tok.src.start;
yyval.node.src.stop = yys[yypt-1].yyv.node.src.stop;
}
144=>
-#line 930 "limbo.y"
+#line 931 "limbo.y"
{
yyval.node = mkn(Oraise, yys[yypt-1].yyv.node, nil);
yyval.node.src.start = yys[yypt-2].yyv.tok.src.start;
yyval.node.src.stop = yys[yypt-1].yyv.node.src.stop;
}
145=>
-#line 936 "limbo.y"
+#line 937 "limbo.y"
{
yyval.node = mkn(Ocase, yys[yypt-3].yyv.node, caselist(yys[yypt-1].yyv.node, nil));
yyval.node.src = yys[yypt-3].yyv.node.src;
yyval.node.decl = yys[yypt-5].yyv.ids;
}
146=>
-#line 942 "limbo.y"
+#line 943 "limbo.y"
{
yyval.node = mkn(Oalt, caselist(yys[yypt-1].yyv.node, nil), nil);
yyval.node.src = yys[yypt-3].yyv.tok.src;
yyval.node.decl = yys[yypt-4].yyv.ids;
}
147=>
-#line 948 "limbo.y"
+#line 949 "limbo.y"
{
yyval.node = mkn(Opick, mkbin(Odas, mkname(yys[yypt-5].yyv.tok.src, yys[yypt-5].yyv.tok.v.idval), yys[yypt-3].yyv.node), caselist(yys[yypt-1].yyv.node, nil));
yyval.node.src.start = yys[yypt-5].yyv.tok.src.start;
@@ -2348,13 +2349,13 @@ yyval.ids = yys[yyp+1].yyv.ids;
yyval.node.decl = yys[yypt-7].yyv.ids;
}
148=>
-#line 955 "limbo.y"
+#line 956 "limbo.y"
{
yyval.node = mkn(Oexit, nil, nil);
yyval.node.src = yys[yypt-1].yyv.tok.src;
}
149=>
-#line 960 "limbo.y"
+#line 961 "limbo.y"
{
if(yys[yypt-6].yyv.node == nil){
yys[yypt-6].yyv.node = mkn(Onothing, nil, nil);
@@ -2364,74 +2365,74 @@ yyval.ids = yys[yyp+1].yyv.ids;
yyval.node = mkbin(Oexstmt, yys[yypt-6].yyv.node, mkn(Oexcept, yys[yypt-3].yyv.node, caselist(yys[yypt-1].yyv.node, nil)));
}
150=>
-#line 975 "limbo.y"
+#line 976 "limbo.y"
{
yyval.ids = nil;
}
151=>
-#line 979 "limbo.y"
+#line 980 "limbo.y"
{
if(yys[yypt-1].yyv.ids.next != nil)
yyerror("only one identifier allowed in a label");
yyval.ids = yys[yypt-1].yyv.ids;
}
152=>
-#line 987 "limbo.y"
+#line 988 "limbo.y"
{
yyval.ids = nil;
}
153=>
-#line 991 "limbo.y"
+#line 992 "limbo.y"
{
yyval.ids = mkids(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval, nil, nil);
}
154=>
-#line 997 "limbo.y"
+#line 998 "limbo.y"
{
yys[yypt-1].yyv.node.left.right.right = yys[yypt-0].yyv.node;
yyval.node = yys[yypt-1].yyv.node;
}
155=>
-#line 1004 "limbo.y"
+#line 1005 "limbo.y"
{
yyval.node = mkunary(Oseq, mkscope(mkunary(Olabel, rotater(yys[yypt-1].yyv.node))));
}
156=>
-#line 1008 "limbo.y"
+#line 1009 "limbo.y"
{
yys[yypt-3].yyv.node.left.right.right = yys[yypt-2].yyv.node;
yyval.node = mkbin(Oseq, mkscope(mkunary(Olabel, rotater(yys[yypt-1].yyv.node))), yys[yypt-3].yyv.node);
}
157=>
-#line 1015 "limbo.y"
+#line 1016 "limbo.y"
{
yys[yypt-1].yyv.node.left.right = mkscope(yys[yypt-0].yyv.node);
yyval.node = yys[yypt-1].yyv.node;
}
158=>
-#line 1022 "limbo.y"
+#line 1023 "limbo.y"
{
yyval.node = mkunary(Oseq, mkunary(Olabel, rotater(yys[yypt-1].yyv.node)));
}
159=>
-#line 1026 "limbo.y"
+#line 1027 "limbo.y"
{
yys[yypt-3].yyv.node.left.right = mkscope(yys[yypt-2].yyv.node);
yyval.node = mkbin(Oseq, mkunary(Olabel, rotater(yys[yypt-1].yyv.node)), yys[yypt-3].yyv.node);
}
160=>
-#line 1033 "limbo.y"
+#line 1034 "limbo.y"
{
yys[yypt-1].yyv.node.left.right = mkscope(yys[yypt-0].yyv.node);
yyval.node = yys[yypt-1].yyv.node;
}
161=>
-#line 1040 "limbo.y"
+#line 1041 "limbo.y"
{
yyval.node = mkunary(Oseq, mkunary(Olabel, rotater(yys[yypt-1].yyv.node)));
}
162=>
-#line 1044 "limbo.y"
+#line 1045 "limbo.y"
{
yys[yypt-3].yyv.node.left.right = mkscope(yys[yypt-2].yyv.node);
yyval.node = mkbin(Oseq, mkunary(Olabel, rotater(yys[yypt-1].yyv.node)), yys[yypt-3].yyv.node);
@@ -2439,70 +2440,70 @@ yyval.ids = yys[yyp+1].yyv.ids;
163=>
yyval.node = yys[yyp+1].yyv.node;
164=>
-#line 1052 "limbo.y"
+#line 1053 "limbo.y"
{
yyval.node = mkbin(Orange, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
165=>
-#line 1056 "limbo.y"
+#line 1057 "limbo.y"
{
yyval.node = mkn(Owild, nil, nil);
yyval.node.src = yys[yypt-0].yyv.tok.src;
}
166=>
-#line 1061 "limbo.y"
+#line 1062 "limbo.y"
{
yyval.node = mkbin(Oseq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
167=>
-#line 1065 "limbo.y"
+#line 1066 "limbo.y"
{
yyval.node = mkn(Onothing, nil, nil);
yyval.node.src.start = curline();
yyval.node.src.stop = yyval.node.src.start;
}
168=>
-#line 1073 "limbo.y"
+#line 1074 "limbo.y"
{
yys[yypt-1].yyv.node.left.right = mkscope(yys[yypt-0].yyv.node);
yyval.node = yys[yypt-1].yyv.node;
}
169=>
-#line 1080 "limbo.y"
+#line 1081 "limbo.y"
{
yyval.node = mkunary(Oseq, mkunary(Olabel, rotater(yys[yypt-1].yyv.node)));
}
170=>
-#line 1084 "limbo.y"
+#line 1085 "limbo.y"
{
yys[yypt-3].yyv.node.left.right = mkscope(yys[yypt-2].yyv.node);
yyval.node = mkbin(Oseq, mkunary(Olabel, rotater(yys[yypt-1].yyv.node)), yys[yypt-3].yyv.node);
}
171=>
-#line 1091 "limbo.y"
+#line 1092 "limbo.y"
{
yyval.node = mkname(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval);
}
172=>
-#line 1095 "limbo.y"
+#line 1096 "limbo.y"
{
yyval.node = mkn(Owild, nil, nil);
yyval.node.src = yys[yypt-0].yyv.tok.src;
}
173=>
-#line 1100 "limbo.y"
+#line 1101 "limbo.y"
{
yyval.node = mkbin(Oseq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
174=>
-#line 1104 "limbo.y"
+#line 1105 "limbo.y"
{
yyval.node = mkn(Onothing, nil, nil);
yyval.node.src.start = curline();
yyval.node.src.stop = yyval.node.src.start;
}
175=>
-#line 1112 "limbo.y"
+#line 1113 "limbo.y"
{
yyval.node = mkn(Onothing, nil, nil);
yyval.node.src.start = curline();
@@ -2513,77 +2514,77 @@ yyval.node = yys[yyp+1].yyv.node;
177=>
yyval.node = yys[yyp+1].yyv.node;
178=>
-#line 1122 "limbo.y"
+#line 1123 "limbo.y"
{
yyval.node = mkbin(Oas, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
179=>
-#line 1126 "limbo.y"
+#line 1127 "limbo.y"
{
yyval.node = mkbin(Oandas, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
180=>
-#line 1130 "limbo.y"
+#line 1131 "limbo.y"
{
yyval.node = mkbin(Ooras, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
181=>
-#line 1134 "limbo.y"
+#line 1135 "limbo.y"
{
yyval.node = mkbin(Oxoras, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
182=>
-#line 1138 "limbo.y"
+#line 1139 "limbo.y"
{
yyval.node = mkbin(Olshas, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
183=>
-#line 1142 "limbo.y"
+#line 1143 "limbo.y"
{
yyval.node = mkbin(Orshas, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
184=>
-#line 1146 "limbo.y"
+#line 1147 "limbo.y"
{
yyval.node = mkbin(Oaddas, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
185=>
-#line 1150 "limbo.y"
+#line 1151 "limbo.y"
{
yyval.node = mkbin(Osubas, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
186=>
-#line 1154 "limbo.y"
+#line 1155 "limbo.y"
{
yyval.node = mkbin(Omulas, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
187=>
-#line 1158 "limbo.y"
+#line 1159 "limbo.y"
{
yyval.node = mkbin(Odivas, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
188=>
-#line 1162 "limbo.y"
+#line 1163 "limbo.y"
{
yyval.node = mkbin(Omodas, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
189=>
-#line 1166 "limbo.y"
+#line 1167 "limbo.y"
{
yyval.node = mkbin(Oexpas, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
190=>
-#line 1170 "limbo.y"
+#line 1171 "limbo.y"
{
yyval.node = mkbin(Osnd, yys[yypt-3].yyv.node, yys[yypt-0].yyv.node);
}
191=>
-#line 1174 "limbo.y"
+#line 1175 "limbo.y"
{
yyval.node = mkbin(Odas, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
192=>
-#line 1178 "limbo.y"
+#line 1179 "limbo.y"
{
yyval.node = mkn(Oload, yys[yypt-0].yyv.node, nil);
yyval.node.src.start = yys[yypt-2].yyv.tok.src.start;
@@ -2591,201 +2592,201 @@ yyval.node = yys[yyp+1].yyv.node;
yyval.node.ty = mkidtype(yys[yypt-1].yyv.tok.src, yys[yypt-1].yyv.tok.v.idval);
}
193=>
-#line 1185 "limbo.y"
+#line 1186 "limbo.y"
{
yyval.node = yyval.node = mkbin(Oexp, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
194=>
-#line 1189 "limbo.y"
+#line 1190 "limbo.y"
{
yyval.node = mkbin(Omul, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
195=>
-#line 1193 "limbo.y"
+#line 1194 "limbo.y"
{
yyval.node = mkbin(Odiv, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
196=>
-#line 1197 "limbo.y"
+#line 1198 "limbo.y"
{
yyval.node = mkbin(Omod, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
197=>
-#line 1201 "limbo.y"
+#line 1202 "limbo.y"
{
yyval.node = mkbin(Oadd, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
198=>
-#line 1205 "limbo.y"
+#line 1206 "limbo.y"
{
yyval.node = mkbin(Osub, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
199=>
-#line 1209 "limbo.y"
+#line 1210 "limbo.y"
{
yyval.node = mkbin(Orsh, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
200=>
-#line 1213 "limbo.y"
+#line 1214 "limbo.y"
{
yyval.node = mkbin(Olsh, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
201=>
-#line 1217 "limbo.y"
+#line 1218 "limbo.y"
{
yyval.node = mkbin(Olt, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
202=>
-#line 1221 "limbo.y"
+#line 1222 "limbo.y"
{
yyval.node = mkbin(Ogt, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
203=>
-#line 1225 "limbo.y"
+#line 1226 "limbo.y"
{
yyval.node = mkbin(Oleq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
204=>
-#line 1229 "limbo.y"
+#line 1230 "limbo.y"
{
yyval.node = mkbin(Ogeq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
205=>
-#line 1233 "limbo.y"
+#line 1234 "limbo.y"
{
yyval.node = mkbin(Oeq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
206=>
-#line 1237 "limbo.y"
+#line 1238 "limbo.y"
{
yyval.node = mkbin(Oneq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
207=>
-#line 1241 "limbo.y"
+#line 1242 "limbo.y"
{
yyval.node = mkbin(Oand, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
208=>
-#line 1245 "limbo.y"
+#line 1246 "limbo.y"
{
yyval.node = mkbin(Oxor, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
209=>
-#line 1249 "limbo.y"
+#line 1250 "limbo.y"
{
yyval.node = mkbin(Oor, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
210=>
-#line 1253 "limbo.y"
+#line 1254 "limbo.y"
{
yyval.node = mkbin(Ocons, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
211=>
-#line 1257 "limbo.y"
+#line 1258 "limbo.y"
{
yyval.node = mkbin(Oandand, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
212=>
-#line 1261 "limbo.y"
+#line 1262 "limbo.y"
{
yyval.node = mkbin(Ooror, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
213=>
yyval.node = yys[yyp+1].yyv.node;
214=>
-#line 1268 "limbo.y"
+#line 1269 "limbo.y"
{
yys[yypt-0].yyv.node.src.start = yys[yypt-1].yyv.tok.src.start;
yyval.node = yys[yypt-0].yyv.node;
}
215=>
-#line 1273 "limbo.y"
+#line 1274 "limbo.y"
{
yyval.node = mkunary(Oneg, yys[yypt-0].yyv.node);
yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
}
216=>
-#line 1278 "limbo.y"
+#line 1279 "limbo.y"
{
yyval.node = mkunary(Onot, yys[yypt-0].yyv.node);
yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
}
217=>
-#line 1283 "limbo.y"
+#line 1284 "limbo.y"
{
yyval.node = mkunary(Ocomp, yys[yypt-0].yyv.node);
yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
}
218=>
-#line 1288 "limbo.y"
+#line 1289 "limbo.y"
{
yyval.node = mkunary(Oind, yys[yypt-0].yyv.node);
yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
}
219=>
-#line 1293 "limbo.y"
+#line 1294 "limbo.y"
{
yyval.node = mkunary(Opreinc, yys[yypt-0].yyv.node);
yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
}
220=>
-#line 1298 "limbo.y"
+#line 1299 "limbo.y"
{
yyval.node = mkunary(Opredec, yys[yypt-0].yyv.node);
yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
}
221=>
-#line 1303 "limbo.y"
+#line 1304 "limbo.y"
{
yyval.node = mkunary(Orcv, yys[yypt-0].yyv.node);
yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
}
222=>
-#line 1308 "limbo.y"
+#line 1309 "limbo.y"
{
yyval.node = mkunary(Ohd, yys[yypt-0].yyv.node);
yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
}
223=>
-#line 1313 "limbo.y"
+#line 1314 "limbo.y"
{
yyval.node = mkunary(Otl, yys[yypt-0].yyv.node);
yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
}
224=>
-#line 1318 "limbo.y"
+#line 1319 "limbo.y"
{
yyval.node = mkunary(Olen, yys[yypt-0].yyv.node);
yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
}
225=>
-#line 1323 "limbo.y"
+#line 1324 "limbo.y"
{
yyval.node = mkunary(Oref, yys[yypt-0].yyv.node);
yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
}
226=>
-#line 1328 "limbo.y"
+#line 1329 "limbo.y"
{
yyval.node = mkunary(Otagof, yys[yypt-0].yyv.node);
yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
}
227=>
-#line 1333 "limbo.y"
+#line 1334 "limbo.y"
{
yyval.node = mkn(Oarray, yys[yypt-3].yyv.node, nil);
yyval.node.ty = mktype(yys[yypt-5].yyv.tok.src.start, yys[yypt-0].yyv.ty.src.stop, Tarray, yys[yypt-0].yyv.ty, nil);
yyval.node.src = yyval.node.ty.src;
}
228=>
-#line 1339 "limbo.y"
+#line 1340 "limbo.y"
{
yyval.node = mkn(Oarray, yys[yypt-5].yyv.node, yys[yypt-1].yyv.node);
yyval.node.src.start = yys[yypt-7].yyv.tok.src.start;
yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
}
229=>
-#line 1345 "limbo.y"
+#line 1346 "limbo.y"
{
yyval.node = mkn(Onothing, nil, nil);
yyval.node.src.start = yys[yypt-5].yyv.tok.src.start;
@@ -2795,49 +2796,49 @@ yyval.node = yys[yyp+1].yyv.node;
yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
}
230=>
-#line 1354 "limbo.y"
+#line 1355 "limbo.y"
{
yyval.node = etolist(yys[yypt-1].yyv.node);
yyval.node.src.start = yys[yypt-4].yyv.tok.src.start;
yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
}
231=>
-#line 1360 "limbo.y"
+#line 1361 "limbo.y"
{
yyval.node = mkn(Ochan, nil, nil);
yyval.node.ty = mktype(yys[yypt-2].yyv.tok.src.start, yys[yypt-0].yyv.ty.src.stop, Tchan, yys[yypt-0].yyv.ty, nil);
yyval.node.src = yyval.node.ty.src;
}
232=>
-#line 1366 "limbo.y"
+#line 1367 "limbo.y"
{
yyval.node = mkn(Ochan, yys[yypt-3].yyv.node, nil);
yyval.node.ty = mktype(yys[yypt-5].yyv.tok.src.start, yys[yypt-0].yyv.ty.src.stop, Tchan, yys[yypt-0].yyv.ty, nil);
yyval.node.src = yyval.node.ty.src;
}
233=>
-#line 1372 "limbo.y"
+#line 1373 "limbo.y"
{
yyval.node = mkunary(Ocast, yys[yypt-0].yyv.node);
yyval.node.ty = mktype(yys[yypt-3].yyv.tok.src.start, yys[yypt-0].yyv.node.src.stop, Tarray, mkidtype(yys[yypt-1].yyv.tok.src, yys[yypt-1].yyv.tok.v.idval), nil);
yyval.node.src = yyval.node.ty.src;
}
234=>
-#line 1378 "limbo.y"
+#line 1379 "limbo.y"
{
yyval.node = mkunary(Ocast, yys[yypt-0].yyv.node);
yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
yyval.node.ty = mkidtype(yyval.node.src, yys[yypt-1].yyv.tok.v.idval);
}
235=>
-#line 1384 "limbo.y"
+#line 1385 "limbo.y"
{
yyval.node = mkunary(Ocast, yys[yypt-0].yyv.node);
yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
yyval.node.ty = mkidtype(yyval.node.src, yys[yypt-1].yyv.tok.v.idval);
}
236=>
-#line 1390 "limbo.y"
+#line 1391 "limbo.y"
{
yyval.node = mkunary(Ocast, yys[yypt-0].yyv.node);
yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
@@ -2846,14 +2847,14 @@ yyval.node = yys[yyp+1].yyv.node;
237=>
yyval.node = yys[yyp+1].yyv.node;
238=>
-#line 1399 "limbo.y"
+#line 1400 "limbo.y"
{
yyval.node = mkn(Ocall, yys[yypt-3].yyv.node, yys[yypt-1].yyv.node);
yyval.node.src.start = yys[yypt-3].yyv.node.src.start;
yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
}
239=>
-#line 1405 "limbo.y"
+#line 1406 "limbo.y"
{
yyval.node = yys[yypt-1].yyv.node;
if(yys[yypt-1].yyv.node.op == Oseq)
@@ -2864,14 +2865,14 @@ yyval.node = yys[yyp+1].yyv.node;
yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
}
240=>
-#line 1415 "limbo.y"
+#line 1416 "limbo.y"
{
# n := mkdeclname($1, mkids($1, enter(".fn"+string nfnexp++, 0), nil, nil));
# $<node>$ = fndef(n, $2);
# nfns++;
}
241=>
-#line 1420 "limbo.y"
+#line 1421 "limbo.y"
{
# $$ = fnfinishdef($<node>3, $4);
# $$ = mkdeclname($1, $$.left.decl);
@@ -2879,23 +2880,23 @@ yyval.node = yys[yyp+1].yyv.node;
yyval.node = nil;
}
242=>
-#line 1427 "limbo.y"
+#line 1428 "limbo.y"
{
yyval.node = mkbin(Odot, yys[yypt-2].yyv.node, mkname(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval));
}
243=>
-#line 1431 "limbo.y"
+#line 1432 "limbo.y"
{
yyval.node = mkbin(Omdot, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
244=>
-#line 1435 "limbo.y"
+#line 1436 "limbo.y"
{
yyval.node = mkbin(Oindex, yys[yypt-3].yyv.node, yys[yypt-1].yyv.node);
yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
}
245=>
-#line 1440 "limbo.y"
+#line 1441 "limbo.y"
{
if(yys[yypt-3].yyv.node.op == Onothing)
yys[yypt-3].yyv.node.src = yys[yypt-2].yyv.tok.src;
@@ -2905,52 +2906,52 @@ yyval.node = yys[yyp+1].yyv.node;
yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
}
246=>
-#line 1449 "limbo.y"
+#line 1450 "limbo.y"
{
yyval.node = mkunary(Oinc, yys[yypt-1].yyv.node);
yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
}
247=>
-#line 1454 "limbo.y"
+#line 1455 "limbo.y"
{
yyval.node = mkunary(Odec, yys[yypt-1].yyv.node);
yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
}
248=>
-#line 1459 "limbo.y"
+#line 1460 "limbo.y"
{
yyval.node = mksconst(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval);
}
249=>
-#line 1463 "limbo.y"
+#line 1464 "limbo.y"
{
yyval.node = mkconst(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.ival);
if(yys[yypt-0].yyv.tok.v.ival > big 16r7fffffff || yys[yypt-0].yyv.tok.v.ival < big -16r7fffffff)
yyval.node.ty = tbig;
}
250=>
-#line 1469 "limbo.y"
+#line 1470 "limbo.y"
{
yyval.node = mkrconst(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.rval);
}
251=>
-#line 1473 "limbo.y"
+#line 1474 "limbo.y"
{
yyval.node = mkbin(Oindex, yys[yypt-5].yyv.node, rotater(mkbin(Oseq, yys[yypt-3].yyv.node, yys[yypt-1].yyv.node)));
yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
}
252=>
-#line 1480 "limbo.y"
+#line 1481 "limbo.y"
{
yyval.node = mkname(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval);
}
253=>
-#line 1484 "limbo.y"
+#line 1485 "limbo.y"
{
yyval.node = mknil(yys[yypt-0].yyv.tok.src);
}
254=>
-#line 1490 "limbo.y"
+#line 1491 "limbo.y"
{
yyval.node = mkn(Otuple, rotater(yys[yypt-1].yyv.node), nil);
yyval.node.src.start = yys[yypt-2].yyv.tok.src.start;
@@ -2959,7 +2960,7 @@ yyval.node = yys[yyp+1].yyv.node;
255=>
yyval.node = yys[yyp+1].yyv.node;
256=>
-#line 1499 "limbo.y"
+#line 1500 "limbo.y"
{
yyval.node = mkbin(Oseq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
@@ -2968,28 +2969,28 @@ yyval.node = yys[yyp+1].yyv.node;
258=>
yyval.node = yys[yyp+1].yyv.node;
259=>
-#line 1509 "limbo.y"
+#line 1510 "limbo.y"
{
yyval.node = mkn(Otype, nil, nil);
yyval.node.ty = mkidtype(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval);
yyval.node.src = yyval.node.ty.src;
}
260=>
-#line 1515 "limbo.y"
+#line 1516 "limbo.y"
{
yyval.node = mkn(Otype, nil, nil);
yyval.node.ty = mktype(yys[yypt-2].yyv.tok.src.start, yys[yypt-0].yyv.ty.src.stop, Tarray, yys[yypt-0].yyv.ty, nil);
yyval.node.src = yyval.node.ty.src;
}
261=>
-#line 1521 "limbo.y"
+#line 1522 "limbo.y"
{
yyval.node = mkn(Otype, nil, nil);
yyval.node.ty = mktype(yys[yypt-2].yyv.tok.src.start, yys[yypt-0].yyv.ty.src.stop, Tlist, yys[yypt-0].yyv.ty, nil);
yyval.node.src = yyval.node.ty.src;
}
262=>
-#line 1527 "limbo.y"
+#line 1528 "limbo.y"
{
yyval.node = mkn(Otype, nil ,nil);
yyval.node.ty = yys[yypt-0].yyv.ty;
@@ -2997,12 +2998,12 @@ yyval.node = yys[yyp+1].yyv.node;
yyval.node.src = yyval.node.ty.src;
}
263=>
-#line 1536 "limbo.y"
+#line 1537 "limbo.y"
{
yyval.node = mkname(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval);
}
264=>
-#line 1540 "limbo.y"
+#line 1541 "limbo.y"
{
yyval.node = nil;
}
@@ -3011,22 +3012,22 @@ yyval.node = yys[yyp+1].yyv.node;
266=>
yyval.node = yys[yyp+1].yyv.node;
267=>
-#line 1548 "limbo.y"
+#line 1549 "limbo.y"
{
yyval.node = mkbin(Oseq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
268=>
-#line 1552 "limbo.y"
+#line 1553 "limbo.y"
{
yyval.node = mkbin(Oseq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
269=>
-#line 1558 "limbo.y"
+#line 1559 "limbo.y"
{
yyval.node = nil;
}
270=>
-#line 1562 "limbo.y"
+#line 1563 "limbo.y"
{
yyval.node = rotater(yys[yypt-0].yyv.node);
}
@@ -3037,40 +3038,40 @@ yyval.node = yys[yyp+1].yyv.node;
273=>
yyval.node = yys[yyp+1].yyv.node;
274=>
-#line 1573 "limbo.y"
+#line 1574 "limbo.y"
{
yyval.node = mkbin(Oseq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
275=>
-#line 1579 "limbo.y"
+#line 1580 "limbo.y"
{
yyval.node = rotater(yys[yypt-0].yyv.node);
}
276=>
-#line 1583 "limbo.y"
+#line 1584 "limbo.y"
{
yyval.node = rotater(yys[yypt-1].yyv.node);
}
277=>
yyval.node = yys[yyp+1].yyv.node;
278=>
-#line 1590 "limbo.y"
+#line 1591 "limbo.y"
{
yyval.node = mkbin(Oseq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
}
279=>
-#line 1596 "limbo.y"
+#line 1597 "limbo.y"
{
yyval.node = mkn(Oelem, nil, yys[yypt-0].yyv.node);
yyval.node.src = yys[yypt-0].yyv.node.src;
}
280=>
-#line 1601 "limbo.y"
+#line 1602 "limbo.y"
{
yyval.node = mkbin(Oelem, rotater(yys[yypt-2].yyv.node), yys[yypt-0].yyv.node);
}
281=>
-#line 1607 "limbo.y"
+#line 1608 "limbo.y"
{
if(yys[yypt-1].yyv.node.op == Oseq)
yys[yypt-1].yyv.node.right.left = rotater(yys[yypt-0].yyv.node);
@@ -3079,12 +3080,12 @@ yyval.node = yys[yyp+1].yyv.node;
yyval.node = yys[yypt-1].yyv.node;
}
282=>
-#line 1617 "limbo.y"
+#line 1618 "limbo.y"
{
yyval.node = typedecl(yys[yypt-1].yyv.ids, mktype(yys[yypt-1].yyv.ids.src.start, yys[yypt-0].yyv.tok.src.stop, Tpoly, nil, nil));
}
283=>
-#line 1621 "limbo.y"
+#line 1622 "limbo.y"
{
if(yys[yypt-3].yyv.node.op == Oseq)
yys[yypt-3].yyv.node.right.left = rotater(yys[yypt-2].yyv.node);
diff --git a/appl/cmd/limbo/limbo.y b/appl/cmd/limbo/limbo.y
index 0c56bd1b..c143923a 100644
--- a/appl/cmd/limbo/limbo.y
+++ b/appl/cmd/limbo/limbo.y
@@ -146,6 +146,7 @@ include "draw.m";
Ldo Lwhile Lfor Lbreak
Lalt Lcase Lpick Lcont
Lreturn Lexit Lspawn Lraise Lfix
+ Ldynamic
%%
prog : Limplement ids ';'
{
diff --git a/appl/cmd/limbo/typecheck.b b/appl/cmd/limbo/typecheck.b
index fc0d43e4..0f1cbe7f 100644
--- a/appl/cmd/limbo/typecheck.b
+++ b/appl/cmd/limbo/typecheck.b
@@ -2116,12 +2116,12 @@ argncompat(n: ref Node, f: ref Decl, a: ref Node): int
passimplicit(fname, args: ref Node): ref Node
{
t := fname.ty;
+ n := fname.left;
if(t.ids == nil || t.ids.implicit == byte 0){
- if(hasside(fname.left, 1))
- nwarn(fname, "result of expression "+expconv(fname.left)+" ignored");
+ if(!isfnrefty(t) && hasside(n, 1))
+ nwarn(fname, "result of expression "+expconv(n)+" ignored");
return args;
}
- n := fname.left;
if(n.op == Oname && n.decl.store == Dtype){
nerror(n, expconv(n)+" is a type and cannot be a self argument");
n = mkn(Onothing, nil, nil);
diff --git a/appl/cmd/mk/mk.b b/appl/cmd/mk/mk.b
index 49a5c1a2..7deadba5 100644
--- a/appl/cmd/mk/mk.b
+++ b/appl/cmd/mk/mk.b
@@ -18,8 +18,6 @@ include "bufio.m";
Iobuf: import bufio;
include "libc0.m";
libc0: Libc0;
-include "math.m";
- math: Math;
include "regex.m";
regex: Regex;
include "ar.m";
@@ -33,9 +31,9 @@ init(nil: ref Draw->Context, argl: list of string)
sys = load Sys Sys->PATH;
bufio = load Bufio Bufio->PATH;
libc0 = load Libc0 Libc0->PATH;
- math = load Math Math->PATH;
regex = load Regex Regex->PATH;
daytime = load Daytime Daytime->PATH;
+ sys->pctl(Sys->FORKNS, nil);
main(len argl, libc0->ls2aab(argl));
}
@@ -622,7 +620,7 @@ initbind()
f := sys->sprint("/usr/%s/lib/mkbinds", getuser());
b := bufio->open(f, Bufio->OREAD);
if(b == nil)
- b = bufio->open("/appl/cmd/mk/mkbinds", Bufio->OREAD);
+ b = bufio->open("/lib/mk/binds", Bufio->OREAD);
if(b == nil)
return;
while((s := b.gets('\n')) != nil){
@@ -3038,6 +3036,11 @@ readenv()
w: ref Word;
sys->pctl(Sys->FORKENV, nil); # use copy of the current environment variables
+ if(sys->open("/env/autoload", Sys->OREAD) == nil){
+ fd := sys->create("/env/autoload", Sys->OWRITE, 8r666);
+ if(fd != nil)
+ sys->fprint(fd, "std");
+ }
envf = sys->open("/env", Sys->OREAD);
if(envf == nil)
return;
diff --git a/appl/cmd/mkfile b/appl/cmd/mkfile
index 2bbdb938..53e7be54 100644
--- a/appl/cmd/mkfile
+++ b/appl/cmd/mkfile
@@ -23,6 +23,7 @@ TARG=\
9srvfs.dis\
9win.dis\
B.dis\
+ ar.dis\
archfs.dis\
auplay.dis\
auhdr.dis\
@@ -34,6 +35,7 @@ TARG=\
cal.dis\
cat.dis\
cd.dis\
+ cddb.dis\
chgrp.dis\
chmod.dis\
cleanname.dis\
@@ -83,11 +85,11 @@ TARG=\
lockfs.dis\
logfile.dis\
look.dis\
- lookman.dis\
lc.dis\
ls.dis\
lstar.dis\
man.dis\
+ man2html.dis\
man2txt.dis\
mathcalc.dis\
mc.dis\
@@ -128,7 +130,6 @@ TARG=\
sed.dis\
sendmail.dis\
sha1sum.dis\
- shutdown.dis\
sleep.dis\
sort.dis\
src.dis\
diff --git a/appl/cmd/os.b b/appl/cmd/os.b
index c51faa2a..23f8b53c 100644
--- a/appl/cmd/os.b
+++ b/appl/cmd/os.b
@@ -26,12 +26,14 @@ init(nil: ref Draw->Context, args: list of string)
fail(sys->sprint("cannot load %s: %r", Arg->PATH));
arg->init(args);
- arg->setusage("os [-d dir] [-n] command [arg...]");
+ arg->setusage("os [-d dir] [-m mount] [-n] [-N nice] [-b] command [arg...]");
nice := 0;
nicearg: string;
workdir := "";
mntpoint := "";
+ foreground := 1;
+
while((opt := arg->opt()) != 0) {
case opt {
'd' =>
@@ -43,6 +45,8 @@ init(nil: ref Draw->Context, args: list of string)
'N' =>
nice = 1;
nicearg = sys->sprint(" %q", arg->earg());
+ 'b' =>
+ foreground = 0;
* =>
arg->usage();
}
@@ -78,32 +82,41 @@ init(nil: ref Draw->Context, args: list of string)
if(workdir != nil && sys->fprint(cfd, "dir %s", workdir) < 0)
fail(sys->sprint("cannot set cwd %q: %r", workdir));
- if(sys->fprint(cfd, "killonclose") < 0)
+ if(foreground && sys->fprint(cfd, "killonclose") < 0)
sys->fprint(sys->fildes(2), "os: warning: cannot write killonclose: %r\n");
if(sys->fprint(cfd, "exec %s", str->quoted(args)) < 0)
fail(sys->sprint("cannot exec: %r"));
- if((tocmd := sys->open(dir+"/data", sys->OWRITE)) == nil)
- fail(sys->sprint("canot open %s/data for writing: %r", dir));
-
- if((fromcmd := sys->open(dir+"/data", sys->OREAD)) == nil)
- fail(sys->sprint("cannot open %s/data for reading: %r", dir));
-
- spawn copy(sync := chan of int, nil, sys->fildes(0), tocmd);
- pid := <-sync;
- sync = nil;
- tocmd = nil;
-
- spawn copy(nil, done := chan of int, fromcmd, sys->fildes(1));
+ if(foreground){
+ if((tocmd := sys->open(dir+"/data", sys->OWRITE)) == nil)
+ fail(sys->sprint("canot open %s/data for writing: %r", dir));
+ if((fromcmd := sys->open(dir+"/data", sys->OREAD)) == nil)
+ fail(sys->sprint("cannot open %s/data for reading: %r", dir));
+ if((errcmd := sys->open(dir+"/stderr", sys->OREAD)) == nil)
+ fail(sys->sprint("cannot open %s/stderr for reading: %r", dir));
+
+ spawn copy(sync := chan of int, nil, sys->fildes(0), tocmd);
+ pid := <-sync;
+ tocmd = nil;
+
+ spawn copy(sync, nil, errcmd, sys->fildes(2));
+ epid := <-sync;
+ sync = nil;
+ errcmd = nil;
+
+ spawn copy(nil, done := chan of int, fromcmd, sys->fildes(1));
+ fromcmd = nil;
- # cfd is still open, so if we're killgrp'ed and we're on a platform
- # (e.g. windows) where the fromcmd read is uninterruptible,
- # cfd will be closed, so the command will be killed (due to killonclose), and
- # the fromcmd read should complete, allowing that process to be killed.
+ # cfd is still open, so if we're killgrp'ed and we're on a platform
+ # (e.g. windows) where the fromcmd read is uninterruptible,
+ # cfd will be closed, so the command will be killed (due to killonclose), and
+ # the fromcmd read should complete, allowing that process to be killed.
- <-done;
- kill(pid);
+ <-done;
+ kill(pid);
+ kill(epid);
+ }
if(wfd != nil){
status := array[1024] of byte;
diff --git a/appl/cmd/test.b b/appl/cmd/test.b
index eb7bf46f..2095d0f7 100644
--- a/appl/cmd/test.b
+++ b/appl/cmd/test.b
@@ -1,193 +1,188 @@
implement Test;
-#
-# POSIX standard
-# test expression
-# [ expression ]
-#
-# translated Brazil /sys/src/cmd/test.c
#
-# print "true" on stdout iff the expression evaluates to true
+# venerable
+# test expression
#
include "sys.m";
-sys: Sys;
-stderr: ref Sys->FD;
+ sys: Sys;
+ stderr: ref Sys->FD;
include "draw.m";
+include "daytime.m";
+ daytime: Daytime;
+
Test: module
{
init: fn(ctxt: ref Draw->Context, argv: list of string);
};
-ap: int;
-ac: int;
-av: array of string;
+gargs: list of string;
-init(nil: ref Draw->Context, argl: list of string)
+init(nil: ref Draw->Context, args: list of string)
{
- if(argl == nil)
+ if(args == nil)
return;
+ gargs = tl args;
sys = load Sys Sys->PATH;
stderr = sys->fildes(2);
- ac = len argl;
- av = array [ac] of string;
- for(i := 0; argl != nil; argl = tl argl)
- av[i++] = hd argl;
-
- if(av[0] == "[") {
- if(av[--ac] != "]")
- synbad("] missing");
- }
-
- ap = 1;
- if(ap<ac && e())
- sys->print("true");
-# exit;
-# sys->raise "fail: false";
+ if(gargs == nil)
+ raise "fail:usage";
+ if(!e())
+ raise "fail:false";
}
-nxtarg(mt: int): string
+nextarg(mt: int): string
{
- if(ap >= ac){
- if(mt){
- ap++;
+ if(gargs == nil){
+ if(mt)
return nil;
- }
synbad("argument expected");
}
- return av[ap++];
+ s := hd gargs;
+ gargs = tl gargs;
+ return s;
}
-nxtintarg(): (int, int)
+nextintarg(): (int, int)
{
- if(ap<ac && isint(av[ap]))
- return (1, int av[ap++]);
+ if(gargs != nil && isint(hd gargs))
+ return (1, int nextarg(0));
return (0, 0);
}
+isnextarg(s: string): int
+{
+ if(gargs != nil && hd gargs == s){
+ gargs = tl gargs;
+ return 1;
+ }
+ return 0;
+}
+
e(): int
{
p1 := e1();
- if(nxtarg(1) == "-o")
+ if(isnextarg("-o"))
return p1 || e();
- ap--;
return p1;
}
e1(): int
{
p1 := e2();
- if(nxtarg(1) == "-a")
+ if(isnextarg("-a"))
return p1 && e1();
- ap--;
return p1;
}
e2(): int
{
- if(nxtarg(0) == "!")
+ if(isnextarg("!"))
return !e2();
- ap--;
return e3();
}
e3(): int
{
- a := nxtarg(0);
- if(a == "(") {
+ a := nextarg(0);
+ case a {
+ "(" =>
p1 := e();
- if(nxtarg(0) != ")")
+ if(nextarg(0) != ")")
synbad(") expected");
return p1;
- }
-
- if(a == "-f")
- return filck(nxtarg(0), Topf);
-
- if(a == "-d")
- return filck(nxtarg(0), Topd);
-
- if(a == "-r")
- return filck(nxtarg(0), Topr);
-
- if(a == "-w")
- return filck(nxtarg(0), Topw);
-
- if(a == "-x")
- return filck(nxtarg(0), Topx);
-
- if(a == "-e")
- return filck(nxtarg(0), Tope);
-
- if(a == "-c")
- return 0;
-
- if(a == "-b")
- return 0;
-
- if(a == "-u")
- return 0;
-
- if(a == "-g")
- return 0;
-
- if(a == "-s")
- return filck(nxtarg(0), Tops);
-
- if(a == "-t") {
- (ok, int1) := nxtintarg();
+ "-A" =>
+ return hasmode(nextarg(0), Sys->DMAPPEND);
+ "-L" =>
+ return hasmode(nextarg(0), Sys->DMEXCL);
+ "-T" =>
+ return hasmode(nextarg(0), Sys->DMTMP);
+ "-f" =>
+ f := nextarg(0);
+ return exists(f) && !hasmode(f, Sys->DMDIR);
+ "-d" =>
+ return hasmode(nextarg(0), Sys->DMDIR);
+ "-r" =>
+ return sys->open(nextarg(0), Sys->OREAD) != nil;
+ "-w" =>
+ return sys->open(nextarg(0), Sys->OWRITE) != nil;
+ "-x" =>
+ fd := sys->open(nextarg(0), Sys->OREAD);
+ if(fd == nil)
+ return 0;
+ (ok, d) := sys->fstat(fd);
+ if(ok < 0)
+ return 0;
+ return (d.mode & 8r111) != 0;
+ "-e" =>
+ return exists(nextarg(0));
+ "-s" =>
+ (ok, d) := sys->stat(nextarg(0));
+ if(ok < 0)
+ return 0;
+ return d.length > big 0;
+ "-t" =>
+ (ok, fd) := nextintarg();
if(!ok)
- return isatty(1);
- else
- return isatty(int1);
- }
-
- if(a == "-n")
- return nxtarg(0) != "";
- if(a == "-z")
- return nxtarg(0) == "";
-
- p2 := nxtarg(1);
- if (p2 == nil)
- return a != nil;
- if(p2 == "=")
- return nxtarg(0) == a;
-
- if(p2 == "!=")
- return nxtarg(0) != a;
+ return iscons(1);
+ return iscons(fd);
+ "-n" =>
+ return nextarg(0) != "";
+ "-z" =>
+ return nextarg(0) == "";
+ * =>
+ p2 := nextarg(1);
+ if(p2 == nil)
+ return a != nil;
+ case p2 {
+ "=" =>
+ return nextarg(0) == a;
+ "!=" =>
+ return nextarg(0) != a;
+ "-older" =>
+ return isolder(nextarg(0), a);
+ "-ot" =>
+ return isolderthan(a, nextarg(0));
+ "-nt" =>
+ return isnewerthan(a, nextarg(0));
+ }
- if(!isint(a))
- return a != nil;
- int1 := int a;
+ if(!isint(a))
+ return a != nil;
+
+ int1 := int a;
+ (ok, int2) := nextintarg();
+ if(ok){
+ case p2 {
+ "-eq" =>
+ return int1 == int2;
+ "-ne" =>
+ return int1 != int2;
+ "-gt" =>
+ return int1 > int2;
+ "-lt" =>
+ return int1 < int2;
+ "-ge" =>
+ return int1 >= int2;
+ "-le" =>
+ return int1 <= int2;
+ }
+ }
- (ok, int2) := nxtintarg();
- if(ok){
- if(p2 == "-eq")
- return int1 == int2;
- if(p2 == "-ne")
- return int1 != int2;
- if(p2 == "-gt")
- return int1 > int2;
- if(p2 == "-lt")
- return int1 < int2;
- if(p2 == "-ge")
- return int1 >= int2;
- if(p2 == "-le")
- return int1 <= int2;
+ synbad("unknown operator " + p2);
+ return 0;
}
-
- synbad("unknown operator " + p2);
- return 0; # to shut ken up
}
synbad(s: string)
{
sys->fprint(stderr, "test: bad syntax: %s\n", s);
- exit;
+ raise "fail:bad syntax";
}
isint(s: string): int
@@ -200,79 +195,90 @@ isint(s: string): int
return 1;
}
-Topr,
-Topw,
-Topx,
-Tope,
-Topf,
-Topd,
-Tops: con iota;
-
-filck(fname: string, Top: int): int
+exists(f: string): int
{
- (ok, dir) := sys->stat(fname);
-
- if(ok >= 0) {
- ok = 0;
- case Top {
- Topr => # readable
- ok = permck(dir, 8r004);
- Topw => # writable
- ok = permck(dir, 8r002);
- Topx => # executable
- ok = permck(dir, 8r001);
- Tope => # exists
- ok = 1;
- Topf => # is a regular file
- ok = (dir.mode & Sys->DMDIR) == 0;
- Topd => # is a directory
- ok = (dir.mode & Sys->DMDIR) != 0;
- Tops => # has length > 0
- ok = dir.length > big 0;
- }
- }
+ return sys->stat(f).t0 >= 0;
+}
- return ok > 0;
+hasmode(f: string, m: int): int
+{
+ (ok, d) := sys->stat(f);
+ if(ok < 0)
+ return 0;
+ return (d.mode & m) != 0;
}
-uid,
-gid: string;
+iscons(fno: int): int
+{
+ fd := sys->fildes(fno);
+ if(fd == nil)
+ return 0;
+ s := sys->fd2path(fd);
+ n := len "/dev/cons";
+ return s == "#c/cons" || len s >= n && s[len s-n:] == "/dev/cons";
+}
-permck(dir: Sys->Dir, mask: int): int
+isolder(t: string, f: string): int
{
- if(uid == nil) {
- fd := sys->open("/dev/user", Sys->OREAD);
- if(fd != nil) {
- buf := array [28] of byte;
- n := sys->read(fd, buf, len buf);
- if(n > 0)
- uid = string buf[:n];
+ (ok, dir) := sys->stat(f);
+ if(ok < 0)
+ return 0;
+
+ n := 0;
+ for(i := 0; i < len t;){
+ for(j := i; j < len t; j++)
+ if(!(t[j] >= '0' && t[j] <= '9'))
+ break;
+ if(i == j)
+ synbad("bad time syntax, "+t);
+ m := int t[i:j];
+ i = j;
+ if(i == len t){
+ n = m;
+ break;
+ }
+ case t[i++] {
+ 'y' => n += m*12*30*24*3600;
+ 'M' => n += m*30*24*3600;
+ 'd' => n += m*24*3600;
+ 'h' => n += m*3600;
+ 'm' => n += m*60;
+ 's' => n += m;
+ * => synbad("bad time syntax, "+t);
}
- gid = nil; # how do I find out what my group is?
}
-
- ok: int = 0;
-
- ok = dir.mode & mask<<0;
- if(!ok && dir.gid == gid)
- ok = dir.mode & mask<<3;
- if(!ok && dir.uid == uid)
- ok = dir.mode & mask<<6;
- return ok > 0;
+ return dir.mtime+n < now();
}
-isatty(fd: int): int
+isolderthan(a: string, b: string): int
{
- d1, d2: Sys->Dir;
+ (aok, ad) := sys->stat(a);
+ if(aok < 0)
+ return 0;
+ (bok, bd) := sys->stat(b);
+ if(bok < 0)
+ return 0;
+ return ad.mtime < bd.mtime;
+}
- ok: int;
- (ok, d1) = sys->fstat(sys->fildes(fd));
- if(ok < 0)
+isnewerthan(a: string, b: string): int
+{
+ (aok, ad) := sys->stat(a);
+ if(aok < 0)
return 0;
- (ok, d2) = sys->stat("/dev/cons");
- if(ok < 0)
+ (bok, bd) := sys->stat(b);
+ if(bok < 0)
return 0;
+ return ad.mtime > bd.mtime;
+}
- return d1.dtype==d2.dtype && d1.dev==d2.dev && d1.qid.path==d2.qid.path;
+now(): int
+{
+ if(daytime == nil){
+ daytime = load Daytime Daytime->PATH;
+ if(daytime == nil)
+ synbad(sys->sprint("can't load %s: %r", Daytime->PATH));
+ }
+ return daytime->now();
}
diff --git a/appl/lib/chanfill.b b/appl/lib/chanfill.b
index 7e7d2685..6f326ea6 100644
--- a/appl/lib/chanfill.b
+++ b/appl/lib/chanfill.b
@@ -32,25 +32,21 @@ init(data: array of byte, f: int, c: Sys->Rwrite, r: ref Sys->FileIO, b: Bufio):
fill(b: ref Iobuf): int
{
for (;;) {
- alt {
- (nil, data, f, c) := <-fio.write =>
- if (f != fid) {
- if (c != nil)
- c <-= (0, "file busy");
- continue;
- }
- if (c == nil)
- return Bufio->EOF;
- c <-= (len data, nil);
- i := len data;
- if (i == 0)
- continue;
- b.buffer[b.size:] = data;
- b.size += i;
- b.filpos += big i;
- return i;
- * =>
- return Bufio->EOF;
+ (nil, data, f, c) := <-fio.write;
+ if (f != fid) {
+ if (c != nil)
+ c <-= (0, "file busy");
+ continue;
}
+ if (c == nil)
+ return Bufio->EOF;
+ c <-= (len data, nil);
+ i := len data;
+ if (i == 0)
+ continue;
+ b.buffer[b.size:] = data;
+ b.size += i;
+ b.filpos += big i;
+ return i;
}
}
diff --git a/appl/lib/dis.b b/appl/lib/dis.b
index f64fd162..c907df61 100644
--- a/appl/lib/dis.b
+++ b/appl/lib/dis.b
@@ -318,7 +318,7 @@ loadobj(disfile: string): (ref Mod, string)
reals := array[n] of real;
for(i = 0; i < n; i++)
reals[i] = math->bits64real(getl());
- dat = ref Data.Reals(op, n, offset, nil);
+ dat = ref Data.Reals(op, n, offset, reals);
} else {
disptr += 8*n; # skip it
dat = ref Data.Reals(op, n, offset, nil);
diff --git a/appl/lib/mkfile b/appl/lib/mkfile
index 210e2f74..f414732d 100644
--- a/appl/lib/mkfile
+++ b/appl/lib/mkfile
@@ -25,6 +25,7 @@ TARG=\
cfgfile.dis\
chanfill.dis\
crc.dis\
+ csv.dis\
daytime.dis\
db.dis\
dbm.dis\
@@ -221,3 +222,5 @@ dhcpclient.dis: $ROOT/module/dhcp.m
ubfa.dis: $ROOT/module/ubfa.m
secstore.dis: $ROOT/module/secstore.m
ida.dis: $ROOT/module/ida.m
+rfc822.dis: $ROOT/module/rfc822.m
+csv.dis: $ROOT/module/csv.m
diff --git a/appl/lib/newns.b b/appl/lib/newns.b
index 7bca18dc..c0868b3c 100644
--- a/appl/lib/newns.b
+++ b/appl/lib/newns.b
@@ -39,6 +39,9 @@ include "factotum.m";
include "arg.m";
arg: Arg;
+include "string.m";
+ str: String;
+
newns(user: string, file: string): string
{
sys = load Sys Sys->PATH;
@@ -63,6 +66,8 @@ newns(user: string, file: string): string
if(err != nil)
return "Auth->init: "+err;
+ str = load String String->PATH; # no check, because we'll live without it
+
if(file == nil){
file = "namespace";
if(sys->stat(file).t0 < 0)
@@ -87,8 +92,11 @@ nsfile(b: ref Iobuf, facfd: ref Sys->FD): string
{
e := "";
while((l := b.gets('\n')) != nil){
- (n, slist) := sys->tokenize(l, " \t\n\r"); # should use str->unquote?
- if(n <= 0)
+ if(str != nil)
+ slist := str->unquoted(l);
+ else
+ (nil, slist) = sys->tokenize(l, " \t\n\r"); # old way, in absence of String
+ if(slist == nil)
continue;
e = nsop(expand(slist), facfd);
if(e != "")
@@ -264,7 +272,7 @@ mount(argv: list of string, facfd: ref Sys->FD): string
return ig(r, sys->sprint("cannot load %s: %r", Factotum->PATH));
factotum->init();
afd := sys->fauth(fd, spec);
- ai := factotum->proxy(afd, facfd, "proto=p9any role=client");
+ ai := factotum->proxy(afd, facfd, "proto=p9any role=client"); # TO DO: something with ai
if(sys->mount(fd, afd, dir, r.flags, spec) < 0)
return ig(r, sys->sprint("mount %q %q: %r", addr, dir));
return nil;
@@ -343,7 +351,7 @@ import9(argv: list of string, facfd: ref Sys->FD): string
}
# TO DO: new style: impo aan|nofilter clear|ssl|tls\n
afd := sys->fauth(fd, "");
- ai := factotum->proxy(afd, facfd, "proto=p9any role=client");
+ ai := factotum->proxy(afd, facfd, "proto=p9any role=client"); # TO DO: something with ai
if(sys->mount(fd, afd, dir, r.flags, "") < 0)
return ig(r, sys->sprint("import %q %q: %r", addr, dir));
return nil;
diff --git a/appl/lib/pop3.b b/appl/lib/pop3.b
index 18e90525..4081b279 100644
--- a/appl/lib/pop3.b
+++ b/appl/lib/pop3.b
@@ -30,12 +30,9 @@ open(user, password, server : string): (int, string)
}
if (conn)
return (-1, "connection is already open");
- if (server == nil) {
- server = defaultserver();
- if (server == nil)
- return (-1, "no default mail server");
- }
- (ok, c) := sys->dial ("tcp!" + server + "!110", nil);
+ if (server == nil)
+ server = "$pop3";
+ (ok, c) := sys->dial ("net!" + server + "!110", nil);
if (ok < 0)
return (-1, "dialup failed");
ibuf = bufio->fopen(c.dfd, Bufio->OREAD);
@@ -256,11 +253,6 @@ mcmd(s : string) : (int, string)
return (-1, r);
}
-defaultserver() : string
-{
- return "$pop3";
-}
-
rev1(l1 : list of int) : list of int
{
l2 : list of int;
diff --git a/appl/lib/sets.b b/appl/lib/sets.b
index 22f25d7b..a770f31c 100644
--- a/appl/lib/sets.b
+++ b/appl/lib/sets.b
@@ -296,7 +296,7 @@ op(o: int, a, b: int): int
2r1010 => return a;
2r1011 => return a | ~b;
2r1100 => return b;
- 2r1101 => return ~(a | b);
+ 2r1101 => return ~a | b;
2r1110 => return a | b;
2r1111 => return ~0;
}
diff --git a/appl/lib/sets32.b b/appl/lib/sets32.b
index 01edea46..5deddbbe 100644
--- a/appl/lib/sets32.b
+++ b/appl/lib/sets32.b
@@ -218,7 +218,7 @@ op(o: int, a, b: int): int
2r1010 => return a;
2r1011 => return a | ~b;
2r1100 => return b;
- 2r1101 => return ~(a | b);
+ 2r1101 => return ~a | b;
2r1110 => return a | b;
2r1111 => return ~0;
}
diff --git a/appl/lib/venti.b b/appl/lib/venti.b
index ec9ec24e..d150f6f8 100644
--- a/appl/lib/venti.b
+++ b/appl/lib/venti.b
@@ -653,8 +653,8 @@ g48(f: array of byte, i: int): big
g64(f: array of byte, i: int): big
{
- b0 := (((((int f[i+3] << 8) | int f[i+2]) << 8) | int f[i+1]) << 8) | int f[i];
- b1 := (((((int f[i+7] << 8) | int f[i+6]) << 8) | int f[i+5]) << 8) | int f[i+4];
- return (big b1 << 32) | (big b0 & 16rFFFFFFFF);
+ b0 := (((((int f[i+0] << 8) | int f[i+1]) << 8) | int f[i+2]) << 8) | int f[i+3];
+ b1 := (((((int f[i+4] << 8) | int f[i+5]) << 8) | int f[i+6]) << 8) | int f[i+7];
+ return (big b0 << 32) | (big b1 & 16rFFFFFFFF);
}
diff --git a/appl/lib/w3c/mkfile b/appl/lib/w3c/mkfile
index 90f4d043..34901e32 100644
--- a/appl/lib/w3c/mkfile
+++ b/appl/lib/w3c/mkfile
@@ -2,6 +2,7 @@
TARG=\
css.dis\
+ uris.dis\
xpointers.dis\
MODULES=
@@ -10,6 +11,7 @@ SYSMODULES= \
sys.m\
bufio.m\
css.m\
+ uris.m\
xpointers.m\
DISBIN=$ROOT/dis/lib/w3c
diff --git a/appl/lib/w3c/xpointers.b b/appl/lib/w3c/xpointers.b
index 0d7c231a..de208d54 100644
--- a/appl/lib/w3c/xpointers.b
+++ b/appl/lib/w3c/xpointers.b
@@ -1,7 +1,7 @@
implement Xpointers;
#
-# Copyright © 2005 Vita Nuova Holdings Oimited
+# Copyright © 2005 Vita Nuova Holdings Limited
#
include "sys.m";
diff --git a/appl/lib/xml.b b/appl/lib/xml.b
index 5e10608d..f93cad8a 100644
--- a/appl/lib/xml.b
+++ b/appl/lib/xml.b
@@ -94,16 +94,22 @@ blankparser: Parser;
open(srcfile: string, warning: chan of (Locator, string), preelem: string): (ref Parser, string)
{
- x := ref blankparser;
- x.in = bufio->open(srcfile, Bufio->OREAD);
- if (x.in == nil)
+ fd := bufio->open(srcfile, Bufio->OREAD);
+ if(fd == nil)
return (nil, sys->sprint("cannot open %s: %r", srcfile));
- # ignore utf16 intialisation character (yuck)
+ return fopen(fd, srcfile, warning, preelem);
+}
+
+fopen(fd: ref Bufio->Iobuf, name: string, warning: chan of (Locator, string), preelem: string): (ref Parser, string)
+{
+ x := ref blankparser;
+ x.in = fd;
+ # ignore utf16 initialisation character (yuck)
c := x.in.getc();
if (c != 16rfffe && c != 16rfeff)
x.in.ungetc();
x.estack = nil;
- x.loc = Locator(1, srcfile, "");
+ x.loc = Locator(1, name, "");
x.warning = warning;
x.preelem = preelem;
return (x, "");
@@ -235,9 +241,8 @@ getparcel(x: ref Parser): ref Parcel
if (p == nil)
p = ref Parcel.EOF;
return p;
- }
- exception e{
- "sax:*" =>
+ }exception e{
+ "sax:*" =>
return ref Parcel.Error(x.loc, x.errormsg);
}
}
diff --git a/appl/svc/httpd/mkfile b/appl/svc/httpd/mkfile
index caba5c47..216c7f23 100644
--- a/appl/svc/httpd/mkfile
+++ b/appl/svc/httpd/mkfile
@@ -37,8 +37,9 @@ DISBIN=$ROOT/dis/svc/httpd
install:V: install-logs-$SHELLTYPE
install-logs-rc install-logs-nt:V:
- for (i in $LOGS)
+ for (i in $LOGS){
rm -f $ROOT/services/httpd/$i && cp $i $ROOT/services/httpd/$i
+ }
# chmod 644 $ROOT/services/httpd/httpd.log
install-logs-sh:V:
diff --git a/appl/svc/webget/date.b b/appl/svc/webget/date.b
index 71248954..8e5ab5d4 100644
--- a/appl/svc/webget/date.b
+++ b/appl/svc/webget/date.b
@@ -62,31 +62,36 @@ dateindex : fn(nil: string, nill:array of string): int;
gmtm2sec : fn(tm: Tm): int;
-yrsize(yr : int): array of int {
+yrsize(yr : int): array of int
+{
if(yr % 4 == 0 && (yr % 100 != 0 || yr % 400 == 0))
return ldmsize;
else
return dmsize;
}
-tolower(c: int): int {
+tolower(c: int): int
+{
if(c >= 'A' && c <= 'Z')
return c - 'A' + 'a';
return c;
}
-isalpha(c: int): int{
+isalpha(c: int): int
+{
return c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z';
}
-isdig(c: int): int {
+isdig(c: int): int
+{
return c >= '0' && c <= '9';
}
-dateconv(t: int): string {
+dateconv(t: int): string
+{
tm : ref Tm;
tm = daytime->gmt(t);
return sys->sprint("%s, %.2d %s %.4d %.2d:%.2d:%.2d GMT",
@@ -132,7 +137,8 @@ datenum(date : string): (string, int){
# return 0 for a failure
# could be big?
-date2sec(date : string): int {
+date2sec(date : string): int
+{
tm : Tm;
buf : string;
@@ -210,14 +216,16 @@ date2sec(date : string): int {
return gmtm2sec(tm);
}
-lowercase(name:string): string {
+lowercase(name:string): string
+{
p: string;
for(i:=0;i<len name;i++)
p[i]=tolower(name[i]);
return p;
}
-dateindex(d : string, tab : array of string): int{
+dateindex(d : string, tab : array of string): int
+{
for(i := 0; i < len tab; i++)
if (lowercase(tab[i]) == d)
return i;
diff --git a/appl/svc/webget/http.b b/appl/svc/webget/http.b
index 35b52966..0a4645ed 100644
--- a/appl/svc/webget/http.b
+++ b/appl/svc/webget/http.b
@@ -69,6 +69,7 @@ usecache := 1;
cachedir: con "/services/webget/cache";
httpproxy: ref ParsedUrl;
+noproxydoms: list of string; # domains that don't require proxy
agent := "Inferno-webget/" + Version;
responses := array[] of {
@@ -137,17 +138,21 @@ readconfig()
}
if(line[0]=='#')
continue;
- (key, val) := S->splitl(line, " \t");
- val = S->take(S->drop(val, " \t"), "^\r\n");
- if(val == "")
+ (key, val) := S->splitl(line, " \t=");
+ val = S->take(S->drop(val, " \t="), "^\r\n");
+ if(val == nil)
continue;
- if(key == "httpproxy" && val != "none") {
- # val should be host or host:port
- httpproxy = U->makeurl("http://" + val);
- W->log(nil, "Using http proxy " + httpproxy.tostring());
- usecache = 0;
- }
- if(key == "agent") {
+ case key{
+ "httpproxy" =>
+ if(val != "none"){
+ # val should be host or host:port
+ httpproxy = U->makeurl("http://" + val);
+ W->log(nil, "Using http proxy " + httpproxy.tostring());
+ usecache = 0;
+ }
+ "noproxy" =>
+ (nil, noproxydoms) = sys->tokenize(val, ";, \t");
+ "agent" =>
agent = val;
W->log(nil, sys->sprint("User agent specfied as '%s'\n", agent));
}
@@ -155,6 +160,22 @@ readconfig()
}
}
+need_proxy(h: string) : int
+{
+ doml := noproxydoms;
+ if(doml == nil)
+ return 1; # all domains need proxy
+
+ lh := len h;
+ for(dom := hd doml; doml != nil; doml = tl doml) {
+ ld := len dom;
+ if(lh >= ld && h[lh-ld:] == dom)
+ return 0; # domain is on the noproxy list
+ }
+
+ return 1;
+}
+
connect(c: ref Fid, r: ref Req, donec: chan of ref Fid)
{
method := r.method;
@@ -202,7 +223,7 @@ connect(c: ref Fid, r: ref Req, donec: chan of ref Fid)
# Find the port and dial the network
#
dialu := u;
- if(httpproxy != nil)
+ if(httpproxy != nil && need_proxy(u.host))
dialu = httpproxy;
port := dialu.port;
if(port == "") {
@@ -237,7 +258,7 @@ connect(c: ref Fid, r: ref Req, donec: chan of ref Fid)
#
m := Msg.newmsg();
requ: string;
- if(httpproxy != nil)
+ if(httpproxy != nil && need_proxy(u.host))
requ = u.tostring();
else {
requ = u.pstart + u.path;
@@ -259,7 +280,7 @@ connect(c: ref Fid, r: ref Req, donec: chan of ref Fid)
m.body = r.body;
m.bodylen = len m.body;
m.addhdrs(Nameval("Content-Length", string (len r.body)) ::
- Nameval("Content-type", "application/x-www-form-urlencoded") ::
+ Nameval("Content-type", "text/xml") :: # was application/x-www-form-urlencoded
nil);
}
io = B->fopen(net.dfd, sys->ORDWR);
@@ -400,7 +421,7 @@ connect(c: ref Fid, r: ref Req, donec: chan of ref Fid)
getcode(status: string) : int
{
- (vers, scode) := S->splitl(status, " ");
+ (nil, scode) := S->splitl(status, " ");
scode = S->drop(scode, " ");
return int scode;
}
diff --git a/appl/svc/webget/webget.b b/appl/svc/webget/webget.b
index 6821303f..c3c3aed8 100644
--- a/appl/svc/webget/webget.b
+++ b/appl/svc/webget/webget.b
@@ -197,7 +197,7 @@ start(ctl: chan of int)
prefix = string data[0:i];
if(i+1 < ndata) {
r.body = array[ndata-i-1] of byte;
- r.body[0:] = data[i:ndata];
+ r.body[0:] = data[i+1:ndata];
}
break;
}
diff --git a/appl/svc/webget/wgutils.b b/appl/svc/webget/wgutils.b
index fdf5c375..2094f7a3 100644
--- a/appl/svc/webget/wgutils.b
+++ b/appl/svc/webget/wgutils.b
@@ -41,6 +41,7 @@ mtypes := array[] of { T->StringInt
("application/pdf", ApplPdf),
("application/postscript", ApplPostscript),
("application/rtf", ApplRtf),
+ ("application/soap+xml", TextPlain),
("application/x-html", TextHtml),
("au", AudioBasic),
("audio/au", AudioBasic),
@@ -67,6 +68,7 @@ mtypes := array[] of { T->StringInt
("text/html", TextHtml),
("text/plain", TextPlain),
("text/x-html", TextHtml),
+ ("text/xml", TextXml),
("tif", ImageTiff),
("tiff", ImageTiff),
("txt", TextPlain),
@@ -91,7 +93,9 @@ mnames := array[] of {
"image/x-xbitmap",
"audio/basic",
"video/mpeg",
- "video/quicktime"
+ "video/quicktime",
+ "application/soap+xml",
+ "text/xml"
};
init(m: Message, s: String, b: Bufio, u: Url, lfd: ref Sys->FD)
@@ -121,7 +125,7 @@ init(m: Message, s: String, b: Bufio, u: Url, lfd: ref Sys->FD)
usererr(r: ref Req, msg: string) : ref Msg
{
m := Msg.newmsg();
- m.prefixline = sys->sprint("ERROR %s %s", r.reqid, msg);
+ m.prefixline = sys->sprint("ERROR %s %s\n", r.reqid, msg);
m.bodylen = 0;
return m;
}
@@ -136,7 +140,7 @@ okprefix(r: ref Req, mrep: ref Msg)
(nil, cloc) := mrep.fieldval("content-location");
if(cloc == "")
cloc = "unknown";
- mrep.prefixline = "OK " + string mrep.bodylen + " " + r.reqid + " " + sctype + " " + cloc;
+ mrep.prefixline = "OK " + string mrep.bodylen + " " + r.reqid + " " + sctype + " " + cloc +"\n";
}
canon_mtype(s: string) : string
diff --git a/appl/svc/webget/wgutils.m b/appl/svc/webget/wgutils.m
index 5b2458fe..8efb14c1 100644
--- a/appl/svc/webget/wgutils.m
+++ b/appl/svc/webget/wgutils.m
@@ -41,7 +41,7 @@ WebgetUtils: module
ImageJpeg, ImageGif, ImageIef, ImageTiff,
ImageXCompressed, ImageXCompressed2, ImageXXBitmap,
AudioBasic,
- VideoMpeg, VideoQuicktime: con iota;
+ VideoMpeg, VideoQuicktime, Soap, TextXml: con iota;
init : fn(m: Message, s: String, b: Bufio, u: Url, logfd: ref Sys->FD);
usererr: fn(r: ref Req, msg: string) : ref Message->Msg;
diff --git a/appl/wm/sh.b b/appl/wm/sh.b
index 159ce6bc..8f634329 100644
--- a/appl/wm/sh.b
+++ b/appl/wm/sh.b
@@ -92,6 +92,7 @@ shwin_cfg := array[] of {
rdreq: list of Rdreq;
menuindex := "0";
holding := 0;
+haskbdfocus := 0;
plumbed := 0;
rawon := 0;
rawinput := "";
@@ -260,16 +261,22 @@ main(ctxt: ref Draw->Context, argv: list of string)
c := <-wm.ctl or
c = <-t.wreq or
c = <-titlectl =>
+ (nil, flds) := sys->tokenize(c, " \t");
+ if(flds != nil && hd flds == "haskbdfocus" && tl flds != nil){
+ haskbdfocus = int hd tl flds;
+ setcols(t);
+ }
tkclient->wmctl(t, c);
ecmd := <-edit =>
editor(t, ecmd);
sendinput(t);
c := <-keys =>
- cut(t, 1);
char := c[1];
if(char == '\\')
char = c[2];
+ if(char != ESC)
+ cut(t, 1);
if(rawon){
if(int cmd(t, ".ft.t compare insert >= outpoint")){
rawinput[len rawinput] = char;
@@ -488,14 +495,30 @@ setholding(t: ref Tk->Toplevel, hold: int)
if(hold == holding)
return;
holding = hold;
- color := "blue";
if(!holding){
- color = "black";
tkclient->settitle(t, winname);
sendinput(t);
}else
tkclient->settitle(t, winname+" (holding)");
- cmd(t, ".ft.t configure -foreground "+color);
+ setcols(t);
+}
+
+setcols(t: ref Tk->Toplevel)
+{
+ fgcol := "black";
+ if(holding){
+ if(haskbdfocus)
+ fgcol = "#000099FF"; # DMedblue
+ else
+ fgcol = "#005DBBFF"; # DGreyblue
+ }else{
+ if(haskbdfocus)
+ fgcol = "black";
+ else
+ fgcol = "#666666FF"; # dark grey
+ }
+ cmd(t, ".ft.t configure -foreground "+fgcol+" -selectforeground "+fgcol);
+ cmd(t, ".ft.t tag configure sel -foreground "+fgcol);
}
tkunquote(s: string): string
diff --git a/appl/wm/unibrowse.b b/appl/wm/unibrowse.b
index 50eefb40..e7a55426 100644
--- a/appl/wm/unibrowse.b
+++ b/appl/wm/unibrowse.b
@@ -205,17 +205,17 @@ init(drawctxt: ref Draw->Context, nil: list of string)
keywordsearch(c);
}
- c := <-elements[BYNUMBER].cmd =>
+ <-elements[BYNUMBER].cmd =>
txt := cmd(top, ".numfield.f get");
(n, nil) := str->toint(txt, 16);
pop(BYNUMBER);
push(TABLE);
- setchar(n);
+ setchar(0, n);
currpos = filltable(n);
update(top);
- c := <-elements[BYCATEGORY].cmd =>
+ <-elements[BYCATEGORY].cmd =>
sel := cmd(top, ".cat.menu curselection");
(currpos, nil) = str->toint(cmd(top, ".cat.menu get "+sel), 16);
pop(BYCATEGORY);
@@ -231,23 +231,23 @@ init(drawctxt: ref Draw->Context, nil: list of string)
"backw" => currpos = filltable(currpos - Tablerows * Tablecols);
update(top);
- * => # must be set <col> <row>
+ * => # must be set <col> <row> <raise>
(nil, args) := sys->tokenize(c, " ");
- setchar(currpos + int hd tl args
+ setchar(int hd tl tl tl args, currpos + int hd tl args
+ int hd tl tl args * Tablecols);
}
- c := <-elements[BYSEARCH].cmd =>
+ <-elements[BYSEARCH].cmd =>
sel := cmd(top, ".srch.menu curselection");
(n, nil) := str->toint(cmd(top, ".srch.menu get "+sel), 16);
pop(BYSEARCH);
push(TABLE);
- setchar(n);
+ setchar(0, n);
currpos = filltable(n);
update(top);
- c := <-elements[BYFONT].cmd =>
+ <-elements[BYFONT].cmd =>
sel := cmd(top, ".font.menu curselection");
(currpos, nil) = str->toint(cmd(top, ".font.menu get "+sel), 16);
pop(BYFONT);
@@ -264,9 +264,11 @@ sendentry(t: ref Tk->Toplevel, msg: string, where: chan of string)
exit;
}
-setchar(c: int)
+setchar(raisei: int, c: int)
{
s := ""; s[0] = c;
+ if(raisei)
+ inspchan <-= "raise";
inspchan <-= s;
}
@@ -370,6 +372,8 @@ inspector(ctxt: ref Draw->Context, cmdch: chan of string)
inspector_setchar(t: ref Tk->Toplevel, c: int)
{
+ if(t == nil)
+ return;
line := look(unidata, ';', sys->sprint("%4.4X", c));
labelset(t, ".chdata.ch", sys->sprint("%c", c));
labelset(t, ".chdata.val", sys->sprint("%4.4X", c));
@@ -560,7 +564,9 @@ inittable()
cmd(top, tkexpand("$label unicode "+cname
+" -borderwidth 1 -relief raised"));
cmd(top, "bind "+cname+" <ButtonRelease-1>"
- +" {send tblcmd set "+string j +" "+string i+"}");
+ +" {send tblcmd set "+string j+" "+string i+" 0}");
+ cmd(top, "bind "+cname+" <Double-Button-1>"
+ +" {send tblcmd set "+string j+" "+string i+" 1}");
cmd(top, "grid "+cname+" -row "+string i+" -column "+string (j+1) +
" -sticky ews");
}
diff --git a/asm/asm.y b/asm/asm.y
index 8a94c99b..c167a053 100644
--- a/asm/asm.y
+++ b/asm/asm.y
@@ -155,10 +155,10 @@ data : TOKDB expr ',' elist
| TOKDF expr ',' TID
{
if(strcmp($4->name, "Inf") == 0 || strcmp($4->name, "Infinity") == 0) {
- u.l = 0x7ff0000000000000;
+ u.l = (uvlong)0x7ff00000<<32;
data(DEFF, $2, newi(dtocanon(u.d), nil));
} else if(strcmp($4->name, "NaN") == 0) {
- u.l = 0x7fffffffffffffff;
+ u.l = ((uvlong)0x7fffffff<<32) | (uvlong)0xffffffffUL;
data(DEFF, $2, newi(dtocanon(u.d), nil));
} else
diag("bad value for real: %s", $4->name);
@@ -174,7 +174,7 @@ data : TOKDB expr ',' elist
| TOKDF expr ',' '-' TID
{
if(strcmp($5->name, "Inf") == 0 || strcmp($5->name, "Infinity") == 0) {
- u.l = 0xfff0000000000000;
+ u.l = (uvlong)0xfff00000<<32;
data(DEFF, $2, newi(dtocanon(u.d), nil));
} else
diag("bad value for real: %s", $5->name);
diff --git a/dis/ar.dis b/dis/ar.dis
new file mode 100644
index 00000000..0c8193b5
--- /dev/null
+++ b/dis/ar.dis
Binary files differ
diff --git a/dis/cddb.dis b/dis/cddb.dis
new file mode 100644
index 00000000..7227eebb
--- /dev/null
+++ b/dis/cddb.dis
Binary files differ
diff --git a/dis/charon/build.dis b/dis/charon/build.dis
index 1b737ddb..d879669a 100644
--- a/dis/charon/build.dis
+++ b/dis/charon/build.dis
Binary files differ
diff --git a/dis/charon/http.dis b/dis/charon/http.dis
index f7853ac0..28acaba0 100644
--- a/dis/charon/http.dis
+++ b/dis/charon/http.dis
Binary files differ
diff --git a/dis/charon/layout.dis b/dis/charon/layout.dis
index 0c6bcd52..72b8fafa 100644
--- a/dis/charon/layout.dis
+++ b/dis/charon/layout.dis
Binary files differ
diff --git a/dis/ebook/ebook.dis b/dis/ebook/ebook.dis
index ca57ff65..746eb09c 100644
--- a/dis/ebook/ebook.dis
+++ b/dis/ebook/ebook.dis
Binary files differ
diff --git a/dis/ebook/oebpackage.dis b/dis/ebook/oebpackage.dis
index 341dd0c8..cd69a00b 100644
--- a/dis/ebook/oebpackage.dis
+++ b/dis/ebook/oebpackage.dis
Binary files differ
diff --git a/dis/fortune.dis b/dis/fortune.dis
index 44461de7..968d83f6 100644
--- a/dis/fortune.dis
+++ b/dis/fortune.dis
Binary files differ
diff --git a/dis/lib/chanfill.dis b/dis/lib/chanfill.dis
index d2b814ec..6bfb586a 100644
--- a/dis/lib/chanfill.dis
+++ b/dis/lib/chanfill.dis
Binary files differ
diff --git a/dis/lib/csv.dis b/dis/lib/csv.dis
new file mode 100644
index 00000000..36b75f72
--- /dev/null
+++ b/dis/lib/csv.dis
Binary files differ
diff --git a/dis/lib/dis.dis b/dis/lib/dis.dis
index 2386e80c..6c3ebf7f 100644
--- a/dis/lib/dis.dis
+++ b/dis/lib/dis.dis
Binary files differ
diff --git a/dis/lib/newns.dis b/dis/lib/newns.dis
index c0527526..9d9a03cb 100644
--- a/dis/lib/newns.dis
+++ b/dis/lib/newns.dis
Binary files differ
diff --git a/dis/lib/pop3.dis b/dis/lib/pop3.dis
index 96035d7d..879ba962 100644
--- a/dis/lib/pop3.dis
+++ b/dis/lib/pop3.dis
Binary files differ
diff --git a/dis/lib/rfc822.dis b/dis/lib/rfc822.dis
new file mode 100644
index 00000000..74f6f6c8
--- /dev/null
+++ b/dis/lib/rfc822.dis
Binary files differ
diff --git a/dis/lib/sets.dis b/dis/lib/sets.dis
index 9a3e18c2..a5b6ced8 100644
--- a/dis/lib/sets.dis
+++ b/dis/lib/sets.dis
Binary files differ
diff --git a/dis/lib/sets32.dis b/dis/lib/sets32.dis
index 5f57f210..d69aae8d 100644
--- a/dis/lib/sets32.dis
+++ b/dis/lib/sets32.dis
Binary files differ
diff --git a/dis/lib/w3c/uris.dis b/dis/lib/w3c/uris.dis
new file mode 100644
index 00000000..8c4f250d
--- /dev/null
+++ b/dis/lib/w3c/uris.dis
Binary files differ
diff --git a/dis/lib/xml.dis b/dis/lib/xml.dis
index 7e2c4c14..d7821ec8 100644
--- a/dis/lib/xml.dis
+++ b/dis/lib/xml.dis
Binary files differ
diff --git a/dis/limbo.dis b/dis/limbo.dis
index a1874755..5fbee7d1 100644
--- a/dis/limbo.dis
+++ b/dis/limbo.dis
Binary files differ
diff --git a/dis/lookman b/dis/lookman
new file mode 100644
index 00000000..edf8972b
--- /dev/null
+++ b/dis/lookman
@@ -0,0 +1,18 @@
+#!/dis/sh
+load std
+
+fn cmdform {
+ sed 's;/man/;;
+ s;(.*)/(.*);man \1 \2 # \2(\1);'
+}
+post=cmdform
+
+x=$*
+~ $1 -f && {
+ post=cat
+ x=${tl $x}
+}
+x=`{echo $x|tr A-Z a-z|tr -dc 'a-z0-9_ \012'} # fold case, delete funny chars
+~ $#x 0 && {echo Usage: lookman key ... >[1=2]; exit usage}
+
+look $x /man/index | sed 's/^.* //' |sort |uniq | $post
diff --git a/dis/lookman.dis b/dis/lookman.dis
deleted file mode 100644
index e09d33eb..00000000
--- a/dis/lookman.dis
+++ /dev/null
Binary files differ
diff --git a/dis/man2html.dis b/dis/man2html.dis
new file mode 100644
index 00000000..24a71104
--- /dev/null
+++ b/dis/man2html.dis
Binary files differ
diff --git a/dis/mk.dis b/dis/mk.dis
index 147a6b33..c88bd48b 100644
--- a/dis/mk.dis
+++ b/dis/mk.dis
Binary files differ
diff --git a/dis/os.dis b/dis/os.dis
index 5c2cbf8b..7cdd64f3 100644
--- a/dis/os.dis
+++ b/dis/os.dis
Binary files differ
diff --git a/dis/shutdown b/dis/shutdown
new file mode 100644
index 00000000..1f1f33a3
--- /dev/null
+++ b/dis/shutdown
@@ -0,0 +1,18 @@
+#!/dis/sh
+load std
+x=$*
+{~ $#x 1 && ~ ${hd $x} -h -r} || {echo usage: shutdown -h or shutdown -r >[1=2]; exit usage}
+# the following is a bit pointless until kfs has halt
+#ftest -f /dis/disk/kfscmd.dis && {
+# for(a in /chan/kfs.*.cmd){
+# b=${hd ${tl ${split '.' $a}}}
+# ~ $b '*' || disk/kfscmd -n $b halt
+# }
+#}
+if {~ $1 -r} {
+ echo reboot >/dev/sysctl
+} {~ $1 -h} {
+ echo halt >/dev/sysctl
+} {}
+echo shutdown: failed: $status >[1=2]
+exit failed
diff --git a/dis/shutdown.dis b/dis/shutdown.dis
deleted file mode 100644
index 22ce821e..00000000
--- a/dis/shutdown.dis
+++ /dev/null
Binary files differ
diff --git a/dis/svc/webget/http.dis b/dis/svc/webget/http.dis
index 43d20acc..337fd7e3 100644
--- a/dis/svc/webget/http.dis
+++ b/dis/svc/webget/http.dis
Binary files differ
diff --git a/dis/svc/webget/webget.dis b/dis/svc/webget/webget.dis
index c029eaf4..b2fd22fc 100644
--- a/dis/svc/webget/webget.dis
+++ b/dis/svc/webget/webget.dis
Binary files differ
diff --git a/dis/svc/webget/wgutils.dis b/dis/svc/webget/wgutils.dis
index 40682361..926059d7 100644
--- a/dis/svc/webget/wgutils.dis
+++ b/dis/svc/webget/wgutils.dis
Binary files differ
diff --git a/dis/test.dis b/dis/test.dis
index bc1a3b3f..91a959da 100644
--- a/dis/test.dis
+++ b/dis/test.dis
Binary files differ
diff --git a/dis/wm/dmwm.dis b/dis/wm/dmwm.dis
index 73cc81ce..bb694fa0 100644
--- a/dis/wm/dmwm.dis
+++ b/dis/wm/dmwm.dis
Binary files differ
diff --git a/dis/wm/sh.dis b/dis/wm/sh.dis
index 5cbca989..8ccbe8dd 100644
--- a/dis/wm/sh.dis
+++ b/dis/wm/sh.dis
Binary files differ
diff --git a/dis/wm/unibrowse.dis b/dis/wm/unibrowse.dis
index c6dba7df..4bdb41dc 100644
--- a/dis/wm/unibrowse.dis
+++ b/dis/wm/unibrowse.dis
Binary files differ
diff --git a/doc/install.ms b/doc/install.ms
index cdec392b..9fe8c4f9 100644
--- a/doc/install.ms
+++ b/doc/install.ms
@@ -1153,7 +1153,7 @@ for these IP based services, and the remote addresses are not filled in
because they all represent listening services that are in the
.CW Announced
state.
-In this example the fourth line shows a TCP service listening on port 6673.
+In this example the third line shows a TCP service listening on port 6675.
Examining
.CW /lib/ndb/inferno
with
diff --git a/emu/FreeBSD/asm-386.S b/emu/FreeBSD/asm-386.S
index 2d11c6da..35269c8f 100644
--- a/emu/FreeBSD/asm-386.S
+++ b/emu/FreeBSD/asm-386.S
@@ -95,10 +95,7 @@ FPrestore:
.type getcallerpc,@function
.global getcallerpc
getcallerpc:
- pushl %ebp
- movl %esp, %ebp
movl 4(%ebp), %eax
- popl %ebp
ret
.type _tas,@function
diff --git a/emu/FreeBSD/cmd.c b/emu/FreeBSD/cmd.c
index 55ead029..ed4cabab 100644
--- a/emu/FreeBSD/cmd.c
+++ b/emu/FreeBSD/cmd.c
@@ -21,7 +21,7 @@ enum
typedef struct Targ Targ;
struct Targ
{
- int fd[2]; /* fd[0] is standard input, fd[1] is standard output */
+ int fd[3]; /* fd[0] is standard input, fd[1] is standard output, fd[2] is standard error */
char** args;
char* dir;
int pid;
@@ -43,15 +43,17 @@ childproc(Targ *t)
nfd = getdtablesize();
for(i = 0; i < nfd; i++)
- if(i != t->fd[0] && i != t->fd[1] && i != t->wfd)
+ if(i != t->fd[0] && i != t->fd[1] && i != t->fd[2] && i != t->wfd)
close(i);
dup2(t->fd[0], 0);
dup2(t->fd[1], 1);
- dup2(t->fd[1], 2);
+ dup2(t->fd[2], 2);
close(t->fd[0]);
close(t->fd[1]);
+ close(t->fd[2]);
+ /* should have an auth file to do host-specific authorisation? */
if(t->gid != -1){
if(setgid(t->gid) < 0 && getegid() == 0){
fprint(t->wfd, "can't set gid %d: %s", t->gid, strerror(errno));
@@ -82,10 +84,10 @@ childproc(Targ *t)
}
void*
-oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
+oscmd(char **args, int nice, char *dir, int *fd)
{
Targ *t;
- int r, fd0[2], fd1[2], wfd[2], n, pid;
+ int r, fd0[2], fd1[2], fd2[2], wfd[2], n, pid;
t = mallocz(sizeof(*t), 1);
if(t == nil)
@@ -93,14 +95,16 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
fd0[0] = fd0[1] = -1;
fd1[0] = fd1[1] = -1;
+ fd2[0] = fd2[1] = -1;
wfd[0] = wfd[1] = -1;
- if(pipe(fd0) < 0 || pipe(fd1) < 0 || pipe(wfd) < 0)
+ if(pipe(fd0) < 0 || pipe(fd1) < 0 || pipe(fd2) < 0 || pipe(wfd) < 0)
goto Error;
if(fcntl(wfd[1], F_SETFD, FD_CLOEXEC) < 0) /* close on exec to give end of file on success */
goto Error;
t->fd[0] = fd0[0];
t->fd[1] = fd1[1];
+ t->fd[2] = fd2[1];
t->wfd = wfd[1];
t->args = args;
t->dir = dir;
@@ -130,6 +134,7 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
close(fd0[0]);
close(fd1[1]);
+ close(fd2[1]);
close(wfd[1]);
n = read(wfd[0], up->genbuf, sizeof(up->genbuf)-1);
@@ -137,6 +142,7 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
if(n > 0){
close(fd0[1]);
close(fd1[0]);
+ close(fd2[0]);
free(t);
up->genbuf[n] = 0;
if(Debug)
@@ -145,8 +151,9 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
return nil;
}
- *sfd = fd0[1];
- *rfd = fd1[0];
+ fd[0] = fd0[1];
+ fd[1] = fd1[0];
+ fd[2] = fd2[0];
return t;
Error:
@@ -157,6 +164,8 @@ Error:
close(fd0[1]);
close(fd1[0]);
close(fd1[1]);
+ close(fd2[0]);
+ close(fd2[1]);
close(wfd[0]);
close(wfd[1]);
error(strerror(r));
diff --git a/emu/FreeBSD/ipif.c b/emu/FreeBSD/ipif.c
index 491eff15..07065714 100644
--- a/emu/FreeBSD/ipif.c
+++ b/emu/FreeBSD/ipif.c
@@ -273,7 +273,8 @@ int
so_gethostbyname(char *host, char**hostv, int n)
{
int i;
- unsigned char buf[32], *p;
+ char buf[32];
+ uchar *p;
struct hostent *hp;
hp = gethostbyname(host);
@@ -282,7 +283,7 @@ so_gethostbyname(char *host, char**hostv, int n)
for(i = 0; hp->h_addr_list[i] && i < n; i++) {
p = hp->h_addr_list[i];
- sprint(buf, "%ud.%ud.%ud.%ud", p[0], p[1], p[2], p[3]);
+ snprint(buf, sizeof(buf), "%ud.%ud.%ud.%ud", p[0], p[1], p[2], p[3]);
hostv[i] = strdup(buf);
if(hostv[i] == 0)
break;
diff --git a/emu/Hp/cmd.c b/emu/Hp/cmd.c
index 97e303ac..bff1f03b 100644
--- a/emu/Hp/cmd.c
+++ b/emu/Hp/cmd.c
@@ -21,7 +21,7 @@ enum
typedef struct Targ Targ;
struct Targ
{
- int fd[2]; /* fd[0] is standard input, fd[1] is standard output */
+ int fd[3]; /* fd[0] is standard input, fd[1] is standard output, fd[2] is standard error */
char** args;
char* dir;
int pid;
@@ -43,15 +43,17 @@ childproc(Targ *t)
nfd = getdtablesize();
for(i = 0; i < nfd; i++)
- if(i != t->fd[0] && i != t->fd[1] && i != t->wfd)
+ if(i != t->fd[0] && i != t->fd[1] && i != t->fd[2] && i != t->wfd)
close(i);
dup2(t->fd[0], 0);
dup2(t->fd[1], 1);
- dup2(t->fd[1], 2);
+ dup2(t->fd[2], 2);
close(t->fd[0]);
close(t->fd[1]);
+ close(t->fd[2]);
+ /* should have an auth file to do host-specific authorisation? */
if(t->gid != -1){
if(setgid(t->gid) < 0 && getegid() == 0){
fprint(t->wfd, "can't set gid %d: %s", t->gid, strerror(errno));
@@ -82,11 +84,10 @@ childproc(Targ *t)
}
void*
-oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
+oscmd(char **args, int nice, char *dir, int *fd)
{
- Dir *d;
Targ *t;
- int r, fd0[2], fd1[2], wfd[2], n, pid;
+ int r, fd0[2], fd1[2], fd2[2], wfd[2], n, pid;
t = mallocz(sizeof(*t), 1);
if(t == nil)
@@ -94,14 +95,16 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
fd0[0] = fd0[1] = -1;
fd1[0] = fd1[1] = -1;
+ fd2[0] = fd2[1] = -1;
wfd[0] = wfd[1] = -1;
- if(pipe(fd0) < 0 || pipe(fd1) < 0 || pipe(wfd) < 0)
+ if(pipe(fd0) < 0 || pipe(fd1) < 0 || pipe(fd2) < 0 || pipe(wfd) < 0)
goto Error;
if(fcntl(wfd[1], F_SETFD, FD_CLOEXEC) < 0) /* close on exec to give end of file on success */
goto Error;
t->fd[0] = fd0[0];
t->fd[1] = fd1[1];
+ t->fd[2] = fd2[1];
t->wfd = wfd[1];
t->args = args;
t->dir = dir;
@@ -131,6 +134,7 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
close(fd0[0]);
close(fd1[1]);
+ close(fd2[1]);
close(wfd[1]);
n = read(wfd[0], up->genbuf, sizeof(up->genbuf)-1);
@@ -138,6 +142,7 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
if(n > 0){
close(fd0[1]);
close(fd1[0]);
+ close(fd2[0]);
free(t);
up->genbuf[n] = 0;
if(Debug)
@@ -146,8 +151,9 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
return nil;
}
- *sfd = fd0[1];
- *rfd = fd1[0];
+ fd[0] = fd0[1];
+ fd[1] = fd1[0];
+ fd[2] = fd2[0];
return t;
Error:
@@ -158,6 +164,8 @@ Error:
close(fd0[1]);
close(fd1[0]);
close(fd1[1]);
+ close(fd2[0]);
+ close(fd2[1]);
close(wfd[0]);
close(wfd[1]);
error(strerror(r));
diff --git a/emu/Irix/cmd.c b/emu/Irix/cmd.c
index 97e303ac..bff1f03b 100644
--- a/emu/Irix/cmd.c
+++ b/emu/Irix/cmd.c
@@ -21,7 +21,7 @@ enum
typedef struct Targ Targ;
struct Targ
{
- int fd[2]; /* fd[0] is standard input, fd[1] is standard output */
+ int fd[3]; /* fd[0] is standard input, fd[1] is standard output, fd[2] is standard error */
char** args;
char* dir;
int pid;
@@ -43,15 +43,17 @@ childproc(Targ *t)
nfd = getdtablesize();
for(i = 0; i < nfd; i++)
- if(i != t->fd[0] && i != t->fd[1] && i != t->wfd)
+ if(i != t->fd[0] && i != t->fd[1] && i != t->fd[2] && i != t->wfd)
close(i);
dup2(t->fd[0], 0);
dup2(t->fd[1], 1);
- dup2(t->fd[1], 2);
+ dup2(t->fd[2], 2);
close(t->fd[0]);
close(t->fd[1]);
+ close(t->fd[2]);
+ /* should have an auth file to do host-specific authorisation? */
if(t->gid != -1){
if(setgid(t->gid) < 0 && getegid() == 0){
fprint(t->wfd, "can't set gid %d: %s", t->gid, strerror(errno));
@@ -82,11 +84,10 @@ childproc(Targ *t)
}
void*
-oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
+oscmd(char **args, int nice, char *dir, int *fd)
{
- Dir *d;
Targ *t;
- int r, fd0[2], fd1[2], wfd[2], n, pid;
+ int r, fd0[2], fd1[2], fd2[2], wfd[2], n, pid;
t = mallocz(sizeof(*t), 1);
if(t == nil)
@@ -94,14 +95,16 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
fd0[0] = fd0[1] = -1;
fd1[0] = fd1[1] = -1;
+ fd2[0] = fd2[1] = -1;
wfd[0] = wfd[1] = -1;
- if(pipe(fd0) < 0 || pipe(fd1) < 0 || pipe(wfd) < 0)
+ if(pipe(fd0) < 0 || pipe(fd1) < 0 || pipe(fd2) < 0 || pipe(wfd) < 0)
goto Error;
if(fcntl(wfd[1], F_SETFD, FD_CLOEXEC) < 0) /* close on exec to give end of file on success */
goto Error;
t->fd[0] = fd0[0];
t->fd[1] = fd1[1];
+ t->fd[2] = fd2[1];
t->wfd = wfd[1];
t->args = args;
t->dir = dir;
@@ -131,6 +134,7 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
close(fd0[0]);
close(fd1[1]);
+ close(fd2[1]);
close(wfd[1]);
n = read(wfd[0], up->genbuf, sizeof(up->genbuf)-1);
@@ -138,6 +142,7 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
if(n > 0){
close(fd0[1]);
close(fd1[0]);
+ close(fd2[0]);
free(t);
up->genbuf[n] = 0;
if(Debug)
@@ -146,8 +151,9 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
return nil;
}
- *sfd = fd0[1];
- *rfd = fd1[0];
+ fd[0] = fd0[1];
+ fd[1] = fd1[0];
+ fd[2] = fd2[0];
return t;
Error:
@@ -158,6 +164,8 @@ Error:
close(fd0[1]);
close(fd1[0]);
close(fd1[1]);
+ close(fd2[0]);
+ close(fd2[1]);
close(wfd[0]);
close(wfd[1]);
error(strerror(r));
diff --git a/emu/Linux/asm-386.S b/emu/Linux/asm-386.S
index caa1f79a..31946335 100644
--- a/emu/Linux/asm-386.S
+++ b/emu/Linux/asm-386.S
@@ -94,12 +94,6 @@ FPrestore:
popl %ebp
ret
- .type getcallerpc,@function
- .global getcallerpc
-getcallerpc:
- movl 4(%ebp), %eax
- ret
-
.type _tas,@function
.globl _tas
_tas:
diff --git a/emu/Linux/asm-arm.S b/emu/Linux/asm-arm.S
new file mode 100644
index 00000000..1cdac444
--- /dev/null
+++ b/emu/Linux/asm-arm.S
@@ -0,0 +1,131 @@
+ .file "asm-Linux-arm.S"
+#include "syscall.h"
+ .text
+
+/*
+ * void executeonnewstack(void *tos, void (*tramp)(void *arg), void *arg)
+ */
+
+ .align 2
+ .global executeonnewstack
+ .type executeonnewstack, %function
+executeonnewstack:
+ @ args = 0, pretend = 0, frame = 12
+ @ frame_needed = 1, uses_anonymous_args = 0
+ mov ip, sp
+ stmfd sp!, {fp, ip, lr, pc}
+ sub fp, ip, #4
+ sub sp, sp, #12
+ str r0, [fp, #-16] /* store tos */
+ str r1, [fp, #-20] /* store tramp */
+ str r2, [fp, #-24] /* store arg */
+ ldr r0, [fp, #-24] /* get arg */
+ ldr r2, [fp, #-16] /* get tos */
+ mov sp, r2 /* set new stack */
+ mov lr, pc
+ blx r1 /* call tramp*/
+
+ /* if we return here, tramp didn't do it's job */
+ swi SYS_exit
+ ldmea fp, {fp, sp, pc}
+ .size executeonnewstack, .-executeonnewstack
+
+/*
+ * void unlockandexit(int *key)
+ *
+ * NB: the return status may be garbaged if the stack is reused
+ * between the unlock and the system call, but this should
+ * not matter since no task is waiting for the result
+ */
+
+ .align 2
+ .global unlockandexit
+ .type unlockandexit, %function
+unlockandexit:
+ @ args = 0, pretend = 0, frame = 4
+ @ frame_needed = 1, uses_anonymous_args = 0
+ mov ip, sp
+ stmfd sp!, {fp, ip, lr, pc}
+ sub fp, ip, #4
+ sub sp, sp, #4
+ mov r1, #0
+ str r1, [r0]
+ swi SYS_exit
+ ldmea fp, {fp, sp, pc}
+ .size unlockandexit, .-unlockandexit
+
+/*
+ * ulong umult(ulong m1, ulong m2, ulong *hi)
+ */
+
+ .align 2
+ .global umult
+ .type umult, %function
+umult:
+ @ args = 0, pretend = 0, frame = 12
+ @ frame_needed = 1, uses_anonymous_args = 0
+ mov ip, sp
+ stmfd sp!, {fp, ip, lr, pc}
+ sub fp, ip, #4
+ sub sp, sp, #12
+ str r0, [fp, #-16]
+ str r1, [fp, #-20]
+ str r2, [fp, #-24]
+ ldr r1, [fp, #-16]
+ ldr r2, [fp, #-20]
+ umull r0, r3, r1, r2
+ ldr r1, [fp, #-24]
+ str r3, [r1]
+ ldmea fp, {fp, sp, pc}
+ .size umult, .-umult
+
+/*
+ * void FPsave(void*);
+ */
+
+ .align 2
+ .global FPsave
+ .type FPsave, %function
+FPsave:
+ @ args = 0, pretend = 0, frame = 4
+ @ frame_needed = 1, uses_anonymous_args = 0
+ mov ip, sp
+ stmfd sp!, {fp, ip, lr, pc}
+ sub fp, ip, #4
+ sub sp, sp, #4
+ str r0, [fp, #-16]
+ ldmea fp, {fp, sp, pc}
+ .size FPsave, .-FPsave
+
+/*
+ * void FPrestore(void*);
+ */
+ .align 2
+ .global FPrestore
+ .type FPrestore, %function
+FPrestore:
+ @ args = 0, pretend = 0, frame = 4
+ @ frame_needed = 1, uses_anonymous_args = 0
+ mov ip, sp
+ stmfd sp!, {fp, ip, lr, pc}
+ sub fp, ip, #4
+ sub sp, sp, #4
+ str r0, [fp, #-16]
+ ldmea fp, {fp, sp, pc}
+ .size FPrestore, .-FPrestore
+
+/*
+ * ulong _tas(ulong*);
+ */
+ .align 2
+ .global _tas
+ .type _tas, %function
+_tas:
+ @ args = 0, pretend = 0, frame = 0
+ @ frame_needed = 0, uses_anonymous_args = 0
+ @ link register save eliminated.
+ @ lr needed for prologue
+ mov r3, #1
+ swp r0, r3, [r0]
+ mov pc, lr
+ .size _tas, .-_tas
diff --git a/emu/Linux/asm-power.S b/emu/Linux/asm-power.S
new file mode 100644
index 00000000..ff5f97cd
--- /dev/null
+++ b/emu/Linux/asm-power.S
@@ -0,0 +1,72 @@
+#include <asm-ppc/reg.h>
+
+ .file "asm-power.S"
+ .section ".text"
+ .align 2
+ .globl FPsave
+ .type FPsave, @function
+FPsave:
+ .set _framesize,0
+ mffs f0
+ stfd f0,0(r3)
+ blr
+ .size FPsave,.-FPsave
+
+ .align 2
+ .globl FPrestore
+FPrestore:
+ lfd f0,0(r3)
+ mtfsf 0xff,f0
+ blr
+ .size FPrestore, .-FPrestore
+
+ .align 2
+ .globl _tas
+_tas:
+ sync
+ mr r4,r3
+ addi r5,0,0x1
+1:
+ lwarx r3,0,r4
+ cmpwi r3,0x0
+ bne- 2f
+ stwcx. r5,0,r4
+ bne- 1b /* Lost reservation, try again */
+2:
+ sync
+ blr
+ .size _tas,.-_tas
+
+/*
+ * void executeonnewstack(void *tos, void (*tramp)(void *arg), void *arg)
+ */
+ .align 2
+ .globl executeonnewstack:
+executeonnewstack:
+ mr r1,r3 /* change stacks */
+ stwu 1,-16(r1) /* save lr to aid the traceback */
+ li r0,0
+ stw r0,20(r1)
+ mr r3,r5
+ mtctr r4
+ bctrl /* tramp(arg) */
+ br . /* failed */
+ .size executeonnewstack,.-executeonnewstack
+
+/*
+ * void unlockandexit(int *key)
+ *
+ * NB: the return status may be garbaged if the stack is reused
+ * between the unlock and the system call, but this should
+ * not matter since no task is waiting for the result
+ */
+ .align 2
+ .globl unlockandexit
+unlockandexit:
+ li r0,0x0
+ stw r0,0(r3) /* unlock */
+ li r0,1 /* sys exit; 234 is exit group */
+ li r3,0 /* exit status */
+ sc
+ br . /* not reached */
+ .size unlockandexit,.-unlockandexit
diff --git a/emu/Linux/cmd.c b/emu/Linux/cmd.c
index 2f55c427..0b8c960b 100644
--- a/emu/Linux/cmd.c
+++ b/emu/Linux/cmd.c
@@ -21,7 +21,7 @@ enum
typedef struct Targ Targ;
struct Targ
{
- int fd[2]; /* fd[0] is standard input, fd[1] is standard output */
+ int fd[3]; /* fd[0] is standard input, fd[1] is standard output, fd[2] is standard error */
char** args;
char* dir;
int pid;
@@ -43,15 +43,17 @@ childproc(Targ *t)
nfd = getdtablesize();
for(i = 0; i < nfd; i++)
- if(i != t->fd[0] && i != t->fd[1] && i != t->wfd)
+ if(i != t->fd[0] && i != t->fd[1] && i != t->fd[2] && i != t->wfd)
close(i);
dup2(t->fd[0], 0);
dup2(t->fd[1], 1);
- dup2(t->fd[1], 2);
+ dup2(t->fd[2], 2);
close(t->fd[0]);
close(t->fd[1]);
+ close(t->fd[2]);
+ /* should have an auth file to do host-specific authorisation? */
if(t->gid != -1){
if(setgid(t->gid) < 0 && getegid() == 0){
fprint(t->wfd, "can't set gid %d: %s", t->gid, strerror(errno));
@@ -82,10 +84,10 @@ childproc(Targ *t)
}
void*
-oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
+oscmd(char **args, int nice, char *dir, int *fd)
{
Targ *t;
- int r, fd0[2], fd1[2], wfd[2], n, pid;
+ int r, fd0[2], fd1[2], fd2[2], wfd[2], n, pid;
t = mallocz(sizeof(*t), 1);
if(t == nil)
@@ -93,14 +95,16 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
fd0[0] = fd0[1] = -1;
fd1[0] = fd1[1] = -1;
+ fd2[0] = fd2[1] = -1;
wfd[0] = wfd[1] = -1;
- if(pipe(fd0) < 0 || pipe(fd1) < 0 || pipe(wfd) < 0)
+ if(pipe(fd0) < 0 || pipe(fd1) < 0 || pipe(fd2) < 0 || pipe(wfd) < 0)
goto Error;
if(fcntl(wfd[1], F_SETFD, FD_CLOEXEC) < 0) /* close on exec to give end of file on success */
goto Error;
t->fd[0] = fd0[0];
t->fd[1] = fd1[1];
+ t->fd[2] = fd2[1];
t->wfd = wfd[1];
t->args = args;
t->dir = dir;
@@ -130,6 +134,7 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
close(fd0[0]);
close(fd1[1]);
+ close(fd2[1]);
close(wfd[1]);
n = read(wfd[0], up->genbuf, sizeof(up->genbuf)-1);
@@ -137,6 +142,7 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
if(n > 0){
close(fd0[1]);
close(fd1[0]);
+ close(fd2[0]);
free(t);
up->genbuf[n] = 0;
if(Debug)
@@ -145,19 +151,21 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
return nil;
}
- *sfd = fd0[1];
- *rfd = fd1[0];
+ fd[0] = fd0[1];
+ fd[1] = fd1[0];
+ fd[2] = fd2[0];
return t;
Error:
r = errno;
- free(t);
if(Debug)
print("oscmd: %q\n",strerror(r));
close(fd0[0]);
close(fd0[1]);
close(fd1[0]);
close(fd1[1]);
+ close(fd2[0]);
+ close(fd2[1]);
close(wfd[0]);
close(wfd[1]);
error(strerror(r));
diff --git a/emu/Linux/emu-g b/emu/Linux/emu-g
new file mode 100644
index 00000000..8892d7a9
--- /dev/null
+++ b/emu/Linux/emu-g
@@ -0,0 +1,96 @@
+dev
+ root
+ cons
+ env
+ mnt
+ pipe
+ prog
+ prof
+ srv
+ dup
+ ssl
+ cap
+ fs
+ cmd cmd
+ indir
+
+ ip ipif-posix ipaux
+ eia
+# audio audio
+ mem
+
+lib
+ interp
+ math
+ keyring
+ sec
+ mp
+
+ 9
+
+link
+
+mod
+ sys
+ math
+ srv srv
+ keyring
+ loader
+
+port
+ alloc
+ cache
+ chan
+ dev
+ dial
+ dis
+ discall
+ env
+ error
+ errstr
+ exception
+ exportfs
+ inferno
+ latin1
+ main
+ parse
+ pgrp
+ print
+ proc
+ qio
+ random
+ sysfile
+ uqid
+
+code
+ int dontcompile = 1;
+ int macjit = 1;
+ void setpointer(int x, int y){USED(x); USED(y);}
+ ulong strtochan(char *s){USED(s); return ~0;}
+
+init
+ emuinit
+
+root
+ /dev /
+ /fd /
+ /prog /
+ /net /
+ /net.alt /
+ /chan /
+ /nvfs /
+ /env /
+# /chan
+# /dev
+# /dis
+# /env
+# /n
+# /net
+# /nvfs /
+# /prog
+# /icons
+# /osinit.dis
+# /dis/emuinit.dis
+# /dis/lib/auth.dis
+# /dis/lib/ssl.dis
+# /n/local /
diff --git a/emu/Linux/mkfile b/emu/Linux/mkfile
index fd6e89e7..ee2152d0 100644
--- a/emu/Linux/mkfile
+++ b/emu/Linux/mkfile
@@ -1,8 +1,6 @@
SYSTARG=Linux
-OBJTYPE=386
<../../mkconfig
SYSTARG=Linux
-OBJTYPE=386
#Configurable parameters
diff --git a/emu/Linux/os.c b/emu/Linux/os.c
index f541311f..336d0443 100644
--- a/emu/Linux/os.c
+++ b/emu/Linux/os.c
@@ -521,3 +521,15 @@ stackalloc(Proc *p, void **tos)
*(Proc **)rv = p;
return rv;
}
+
+#ifdef LINUX_ARM
+#define SYS_cacheflush __ARM_NR_cacheflush
+
+int
+segflush(void *a, ulong n)
+{
+ if(n)
+ syscall(SYS_cacheflush, a, (char*)a+n-1, 1);
+ return 0;
+}
+#endif
diff --git a/emu/Linux/segflush-power.c b/emu/Linux/segflush-power.c
new file mode 100644
index 00000000..07f9a3cb
--- /dev/null
+++ b/emu/Linux/segflush-power.c
@@ -0,0 +1,27 @@
+/*
+ * from geoff collyer's port
+ * invalidate instruction cache and write back data cache from a to a+n-1,
+ * at least.
+ */
+void
+segflush(void *a, ulong n)
+{
+ ulong *p;
+
+ // cache blocks are often eight words (32 bytes) long, sometimes 16 bytes.
+ // need to determine it dynamically?
+ for (p = (ulong *)((ulong)a & ~3UL); (char *)p < (char *)a + n; p++)
+ __asm__("dcbst 0,%0\n\t" // not dcbf, which writes back, then invalidates
+ "icbi 0,%0\n\t"
+ : // no output
+ : "ar" (p)
+ );
+ __asm__("sync\n\t"
+ : // no output
+ :
+ );
+ __asm__("isync\n\t"
+ : // no output
+ :
+ );
+}
diff --git a/emu/MacOSX/NOTICE b/emu/MacOSX/NOTICE
index cf4f254f..a14c52c9 100644
--- a/emu/MacOSX/NOTICE
+++ b/emu/MacOSX/NOTICE
@@ -1,2 +1,3 @@
MacOSX port Copyright © 2001-2003 Corpus Callosum Corporation,
with portions Copyright © 2001-2003 Geoff Collyer
+MacOSX-x86 Copyright © 2006 Corpus Callosum Corporation
diff --git a/emu/MacOSX/asm-386.s b/emu/MacOSX/asm-386.s
new file mode 100644
index 00000000..fc903bcb
--- /dev/null
+++ b/emu/MacOSX/asm-386.s
@@ -0,0 +1,28 @@
+/*
+ * these are the same as on the PC (eg, Linux)
+*/
+
+ .globl _FPsave
+_FPsave:
+ pushl %ebp
+ movl %esp, %ebp
+ movl 8(%ebp), %eax
+ fstenv (%eax)
+ popl %ebp
+ ret
+
+ .globl _FPrestore
+_FPrestore:
+ pushl %ebp
+ movl %esp, %ebp
+ movl 8(%ebp), %eax
+ fldenv (%eax)
+ popl %ebp
+ ret
+
+ .globl __tas
+__tas:
+ movl $1, %eax
+ movl 4(%esp), %ecx
+ xchgl %eax, 0(%ecx)
+ ret
diff --git a/emu/MacOSX/cmd.c b/emu/MacOSX/cmd.c
index 49825f3c..58f6dba7 100644
--- a/emu/MacOSX/cmd.c
+++ b/emu/MacOSX/cmd.c
@@ -22,7 +22,7 @@ enum
typedef struct Targ Targ;
struct Targ
{
- int fd[2]; /* fd[0] is standard input, fd[1] is standard output */
+ int fd[3]; /* fd[0] is standard input, fd[1] is standard output, fd[2] is standard error */
char** args;
char* dir;
int pid;
@@ -44,15 +44,17 @@ childproc(Targ *t)
nfd = getdtablesize();
for(i = 0; i < nfd; i++)
- if(i != t->fd[0] && i != t->fd[1] && i != t->wfd)
+ if(i != t->fd[0] && i != t->fd[1] && i != t->fd[2] && i != t->wfd)
close(i);
dup2(t->fd[0], 0);
dup2(t->fd[1], 1);
- dup2(t->fd[1], 2);
+ dup2(t->fd[2], 2);
close(t->fd[0]);
close(t->fd[1]);
+ close(t->fd[2]);
+ /* should have an auth file to do host-specific authorisation? */
if(t->gid != -1){
if(setgid(t->gid) < 0 && getegid() == 0){
fprint(t->wfd, "can't set gid %d: %s", t->gid, strerror(errno));
@@ -83,10 +85,10 @@ childproc(Targ *t)
}
void*
-oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
+oscmd(char **args, int nice, char *dir, int *fd)
{
Targ *t;
- int r, fd0[2], fd1[2], wfd[2], n, pid;
+ int r, fd0[2], fd1[2], fd2[2], wfd[2], n, pid;
t = mallocz(sizeof(*t), 1);
if(t == nil)
@@ -94,14 +96,16 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
fd0[0] = fd0[1] = -1;
fd1[0] = fd1[1] = -1;
+ fd2[0] = fd2[1] = -1;
wfd[0] = wfd[1] = -1;
- if(pipe(fd0) < 0 || pipe(fd1) < 0 || pipe(wfd) < 0)
+ if(pipe(fd0) < 0 || pipe(fd1) < 0 || pipe(fd2) < 0 || pipe(wfd) < 0)
goto Error;
if(fcntl(wfd[1], F_SETFD, FD_CLOEXEC) < 0) /* close on exec to give end of file on success */
goto Error;
t->fd[0] = fd0[0];
t->fd[1] = fd1[1];
+ t->fd[2] = fd2[1];
t->wfd = wfd[1];
t->args = args;
t->dir = dir;
@@ -131,6 +135,7 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
close(fd0[0]);
close(fd1[1]);
+ close(fd2[1]);
close(wfd[1]);
n = read(wfd[0], up->genbuf, sizeof(up->genbuf)-1);
@@ -138,6 +143,7 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
if(n > 0){
close(fd0[1]);
close(fd1[0]);
+ close(fd2[0]);
free(t);
up->genbuf[n] = 0;
if(Debug)
@@ -146,8 +152,9 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
return nil;
}
- *sfd = fd0[1];
- *rfd = fd1[0];
+ fd[0] = fd0[1];
+ fd[1] = fd1[0];
+ fd[2] = fd2[0];
return t;
Error:
@@ -158,6 +165,8 @@ Error:
close(fd0[1]);
close(fd1[0]);
close(fd1[1]);
+ close(fd2[0]);
+ close(fd2[1]);
close(wfd[0]);
close(wfd[1]);
error(strerror(r));
diff --git a/emu/MacOSX/mkfile b/emu/MacOSX/mkfile
index 693eaf33..25fb99c6 100644
--- a/emu/MacOSX/mkfile
+++ b/emu/MacOSX/mkfile
@@ -1,8 +1,8 @@
SYSTARG=MacOSX
-OBJTYPE=power
+#OBJTYPE=power
<../../mkconfig
SYSTARG=MacOSX
-OBJTYPE=power
+#OBJTYPE=power
#Configurable parameters
@@ -30,6 +30,7 @@ OBJ=\
HFILES=\
CFLAGS='-DROOT="'$ROOT'"'\
+ '-DOBJTYPE="'$OBJTYPE'"'\
-DEMU -I. -I../port\
-I$ROOT/$SYSTARG/$OBJTYPE/include\
-I$ROOT/include -I$ROOT/libinterp\
diff --git a/emu/MacOSX/os.c b/emu/MacOSX/os.c
index e246f625..3363b5ad 100644
--- a/emu/MacOSX/os.c
+++ b/emu/MacOSX/os.c
@@ -42,7 +42,7 @@ enum
DELETE = 0x7F
};
char *hosttype = "MacOSX";
-char *cputype = "power";
+char *cputype = OBJTYPE;
static pthread_key_t prdakey;
diff --git a/emu/NOTICE b/emu/NOTICE
index 39682bb2..b071f58e 100644
--- a/emu/NOTICE
+++ b/emu/NOTICE
@@ -10,6 +10,7 @@ file such as NOTICE, LICENCE or COPYING.
Portions Copyright © 1997-1999 Vita Nuova Limited
Portions Copyright © 2000-2006 Vita Nuova Holdings Limited (www.vitanuova.com)
Revisions Copyright © 2000-2006 Lucent Technologies Inc. and others
+ Portions Copyright © 2005 Russ Cox, MIT
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/emu/Nt/cmd.c b/emu/Nt/cmd.c
index a03b949b..764d328b 100644
--- a/emu/Nt/cmd.c
+++ b/emu/Nt/cmd.c
@@ -104,11 +104,11 @@ exporthandle(HANDLE h, int close)
/* TO DO: check that oserrstr will have the right text on error */
void*
-oscmd(char **args, int nice, char *dir, int *rpfd, int *wpfd)
+oscmd(char **args, int nice, char *dir, int *fd)
{
STARTUPINFO si;
SECURITY_ATTRIBUTES sec;
- HANDLE rh, wh, srh, swh;
+ HANDLE rh, wh, eh, srh, swh, seh;
PROCESS_INFORMATION pinfo;
char *cmd;
wchar_t *wcmd, *wdir;
@@ -126,35 +126,22 @@ oscmd(char **args, int nice, char *dir, int *rpfd, int *wpfd)
sec.nLength = sizeof(sec);
sec.lpSecurityDescriptor = 0;
sec.bInheritHandle = 0;
- if(!CreatePipe(&rh, &swh, &sec, 0)) {
- print("can't create pipe\n");
- free(cmd);
- free(wcmd);
- free(wdir);
- return nil;
- }
- if(!CreatePipe(&srh, &wh, &sec, 0)) {
- print("can't create pipe\n");
- CloseHandle(rh);
- CloseHandle(swh);
- free(cmd);
- free(wcmd);
- free(wdir);
- return nil;
- }
+ rh = wh = eh = srh = swh = seh = nil;
+ if(!CreatePipe(&rh, &swh, &sec, 0))
+ goto Error;
+ if(!CreatePipe(&srh, &wh, &sec, 0))
+ goto Error;
+ if(!CreatePipe(&seh, &eh, &sec, 0))
+ goto Error;
rh = exporthandle(rh, 1);
+ if(rh == nil)
+ goto Error;
wh = exporthandle(wh, 1);
- if (rh == nil || wh == nil) {
- print("can't dup pipes\n");
- CloseHandle(rh);
- CloseHandle(swh);
- CloseHandle(wh);
- CloseHandle(srh);
- free(cmd);
- free(wcmd);
- free(wdir);
- return nil;
- }
+ if(wh == nil)
+ goto Error;
+ eh = exporthandle(eh, 1);
+ if(eh == nil)
+ goto Error;
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
@@ -162,7 +149,7 @@ oscmd(char **args, int nice, char *dir, int *rpfd, int *wpfd)
si.wShowWindow = SW_SHOW;
si.hStdInput = rh;
si.hStdOutput = wh;
- si.hStdError = exporthandle(wh, 0);
+ si.hStdError = eh;
prio = 0;
if(nice){
@@ -175,21 +162,14 @@ oscmd(char **args, int nice, char *dir, int *rpfd, int *wpfd)
if(!CreateProcess(nil/*wpath*/, wcmd, 0, 0, 1,
CREATE_NEW_PROCESS_GROUP|CREATE_DEFAULT_ERROR_MODE|prio,
0 /*env*/, wdir, &si, &pinfo)){
- print("can't create process '%Q' %d\n", wcmd, GetLastError());
- CloseHandle(si.hStdInput);
- CloseHandle(swh);
- CloseHandle(si.hStdOutput);
- CloseHandle(si.hStdError);
- CloseHandle(srh);
- free(cmd);
- free(wcmd);
- free(wdir);
- return nil;
+ //print("can't create process '%Q' %d\n", wcmd, GetLastError());
+ goto Error;
}
- *rpfd = nth2fd(srh);
- *wpfd = nth2fd(swh);
- if(*wpfd == 1 || *wpfd == 2)
+ fd[0] = nth2fd(swh);
+ fd[1] = nth2fd(srh);
+ fd[2] = nth2fd(seh);
+ if(fd[1] == 1 || fd[2] == 2)
panic("invalid mapping of handle to fd");
CloseHandle(si.hStdInput);
CloseHandle(si.hStdOutput);
@@ -209,6 +189,24 @@ oscmd(char **args, int nice, char *dir, int *rpfd, int *wpfd)
free(wcmd);
free(wdir);
return pinfo.hProcess;
+
+Error:
+ if(rh)
+ CloseHandle(rh);
+ if(wh)
+ CloseHandle(wh);
+ if(eh)
+ CloseHandle(eh);
+ if(srh)
+ CloseHandle(srh);
+ if(swh)
+ CloseHandle(swh);
+ if(seh)
+ CloseHandle(seh);
+ free(cmd);
+ free(wcmd);
+ free(wdir);
+ return nil;
}
int
diff --git a/emu/Nt/os.c b/emu/Nt/os.c
index 023d47c3..3f7156d9 100644
--- a/emu/Nt/os.c
+++ b/emu/Nt/os.c
@@ -64,24 +64,24 @@ pfree(Proc *p)
}
free(e->user);
free(p->prog);
+ CloseHandle((HANDLE)p->os);
free(p);
}
-static ulong erendezvous(void*, ulong);
-
void
osblock(void)
{
- erendezvous(up, 0);
+ if(WaitForSingleObject((HANDLE)up->os, INFINITE) != WAIT_OBJECT_0)
+ panic("osblock failed");
}
void
osready(Proc *p)
{
- erendezvous(p, 0);
+ if(SetEvent((HANDLE)p->os) == FALSE)
+ panic("osready failed");
}
-
void
pexit(char *msg, int t)
{
@@ -118,11 +118,9 @@ tramp(LPVOID p)
up = p;
up->func(up->arg);
pexit("", 0);
- // should never get here but tidy up anyway
- _asm {
- mov fs:[0],-1
- add esp, 8
- }
+ /* not reached */
+ for(;;)
+ panic("tramp");
return 0;
}
@@ -140,6 +138,12 @@ kproc(char *name, void (*func)(void*), void *arg, int flags)
print("out of kernel processes\n");
return -1;
}
+ p->os = CreateEvent(NULL, FALSE, FALSE, NULL);
+ if(p->os == NULL){
+ pfree(p);
+ print("can't allocate os event\n");
+ return -1;
+ }
if(flags & KPDUPPG) {
pg = up->env->pgrp;
@@ -429,7 +433,7 @@ libinit(char *imod)
lasterror = GetLastError();
if(PlatformId == VER_PLATFORM_WIN32_NT || lasterror != ERROR_NOT_LOGGED_ON)
print("cannot GetUserName: %d\n", lasterror);
- } else {
+ }else{
uns = narrowen(wuname);
snprint(uname, sizeof(uname), "%s", uns);
free(uns);
@@ -439,85 +443,6 @@ libinit(char *imod)
emuinit(imod);
}
-enum
-{
- NHLOG = 7,
- NHASH = (1<<NHLOG)
-};
-
-typedef struct Tag Tag;
-struct Tag
-{
- void* tag;
- ulong val;
- HANDLE pid;
- Tag* next;
-};
-
-static Tag* ht[NHASH];
-static Tag* ft;
-static Lock hlock;
-static int nsema;
-
-static ulong
-erendezvous(void *tag, ulong value)
-{
- int h;
- ulong rval;
- Tag *t, **l, *f;
-
-
- h = (ulong)tag & (NHASH-1);
-
- lock(&hlock);
- l = &ht[h];
- for(t = ht[h]; t; t = t->next) {
- if(t->tag == tag) {
- rval = t->val;
- t->val = value;
- t->tag = 0;
- unlock(&hlock);
- if(SetEvent(t->pid) == FALSE)
- panic("Release failed\n");
- return rval;
- }
- }
-
- t = ft;
- if(t == 0) {
- t = malloc(sizeof(Tag));
- if(t == nil)
- panic("rendezvous: no memory");
- t->pid = CreateEvent(0, 0, 0, 0);
- }
- else
- ft = t->next;
-
- t->tag = tag;
- t->val = value;
- t->next = *l;
- *l = t;
- unlock(&hlock);
-
- if(WaitForSingleObject(t->pid, INFINITE) != WAIT_OBJECT_0)
- panic("WaitForSingleObject failed\n");
-
- lock(&hlock);
- rval = t->val;
- for(f = *l; f; f = f->next) {
- if(f == t) {
- *l = f->next;
- break;
- }
- l = &f->next;
- }
- t->next = ft;
- ft = t;
- unlock(&hlock);
-
- return rval;
-}
-
void
FPsave(void *fptr)
{
diff --git a/emu/Nt/win.c b/emu/Nt/win.c
index f9a6aa7d..2e984642 100644
--- a/emu/Nt/win.c
+++ b/emu/Nt/win.c
@@ -1,74 +1,42 @@
-#define Unknown win_Unknown
+#define Unknown WUnknown
+#define Colormap WColormap
+#define Cursor WCursor
+#define Display WDisplay
+#define Drawable WDrawable
+#define Font WFont
+#define GC WGC
+#define Point WPoint
+#define Rectangle WRectangle
+#define Screen WScreen
+#define Visual WVisual
+#define Window WWindow
+
#include <windows.h>
+
+#undef Colormap
+#undef Cursor
+#undef Display
+#undef XDrawable
+#undef Font
+#undef GC
+#undef Point
+#undef Rectangle
+#undef Screen
+#undef Visual
+#undef Window
#undef Unknown
+
#include "dat.h"
#include "fns.h"
#include "error.h"
-
+#include <draw.h>
#include "keyboard.h"
#include "cursor.h"
-/*
- * image channel descriptors - copied from draw.h as it clashes with windows.h on many things
- */
-enum {
- CRed = 0,
- CGreen,
- CBlue,
- CGrey,
- CAlpha,
- CMap,
- CIgnore,
- NChan,
-};
-
-#define __DC(type, nbits) ((((type)&15)<<4)|((nbits)&15))
-#define CHAN1(a,b) __DC(a,b)
-#define CHAN2(a,b,c,d) (CHAN1((a),(b))<<8|__DC((c),(d)))
-#define CHAN3(a,b,c,d,e,f) (CHAN2((a),(b),(c),(d))<<8|__DC((e),(f)))
-#define CHAN4(a,b,c,d,e,f,g,h) (CHAN3((a),(b),(c),(d),(e),(f))<<8|__DC((g),(h)))
-
-#define NBITS(c) ((c)&15)
-#define TYPE(c) (((c)>>4)&15)
-
-enum {
- GREY1 = CHAN1(CGrey, 1),
- GREY2 = CHAN1(CGrey, 2),
- GREY4 = CHAN1(CGrey, 4),
- GREY8 = CHAN1(CGrey, 8),
- CMAP8 = CHAN1(CMap, 8),
- RGB15 = CHAN4(CIgnore, 1, CRed, 5, CGreen, 5, CBlue, 5),
- RGB16 = CHAN3(CRed, 5, CGreen, 6, CBlue, 5),
- RGB24 = CHAN3(CRed, 8, CGreen, 8, CBlue, 8),
- RGBA32 = CHAN4(CRed, 8, CGreen, 8, CBlue, 8, CAlpha, 8),
- ARGB32 = CHAN4(CAlpha, 8, CRed, 8, CGreen, 8, CBlue, 8), /* stupid VGAs */
- XRGB32 = CHAN4(CIgnore, 8, CRed, 8, CGreen, 8, CBlue, 8),
-};
-
extern ulong displaychan;
-extern void drawend(void);
-
-/*
- * defs for image types to overcome name conflicts
- */
-typedef struct IPoint IPoint;
-typedef struct IRectangle IRectangle;
-
-struct IPoint
-{
- LONG x;
- LONG y;
-};
-
-struct IRectangle
-{
- IPoint min;
- IPoint max;
-};
-
extern char* runestoutf(char*, Rune*, int);
-extern int bytesperline(IRectangle, int);
+extern int bytesperline(Rectangle, int);
extern int main(int argc, char **argv);
static void dprint(char*, ...);
static DWORD WINAPI winproc(LPVOID);
@@ -105,7 +73,7 @@ WinMain(HINSTANCE winst, HINSTANCE wprevinst, LPSTR cmdline, int wcmdshow)
return 0;
}
-void
+static void
dprint(char *fmt, ...)
{
va_list arg;
@@ -118,17 +86,6 @@ dprint(char *fmt, ...)
OutputDebugString(buf);
}
-int
-col(int v, int n)
-{
- int i, c;
-
- c = 0;
- for(i = 0; i < 8; i += n)
- c |= v << (16-(n+i));
- return c >> 8;
-}
-
static void
graphicscmap(PALETTEENTRY *pal)
{
@@ -190,11 +147,13 @@ autochan(void)
return CMAP8;
if (bpp < 24)
return RGB15;
- return RGB24;
+ if (bpp < 32)
+ return RGB24;
+ return XRGB32;
}
uchar*
-attachscreen(IRectangle *r, ulong *chan, int *d, int *width, int *softscreen)
+attachscreen(Rectangle *r, ulong *chan, int *d, int *width, int *softscreen)
{
int i, k;
ulong c;
@@ -314,7 +273,7 @@ attachscreen(IRectangle *r, ulong *chan, int *d, int *width, int *softscreen)
}
void
-flushmemscreen(IRectangle r)
+flushmemscreen(Rectangle r)
{
RECT wr;
@@ -385,11 +344,12 @@ WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
b |= 1;
if(wparam & MK_MBUTTON)
b |= 2;
- if(wparam & MK_RBUTTON)
+ if(wparam & MK_RBUTTON) {
if(wparam & MK_CONTROL)
b |= 2; //simulate middle button
else
b |= 4; //right button
+ }
mousetrack(b, x, y, 0);
break;
case WM_SYSKEYDOWN:
@@ -590,8 +550,7 @@ winproc(LPVOID x)
if(AdjustWindowRect(&size, ws, 0)) {
maxxsize = size.right - size.left;
maxysize = size.bottom - size.top;
- }
- else {
+ }else{
maxxsize = Xsize + 40;
maxysize = Ysize + 40;
}
@@ -611,8 +570,7 @@ winproc(LPVOID x)
inst, /* program handle */
NULL /* create parms */
);
- }
- else {
+ }else{
window = CreateWindowExA(
0, /* extended style */
"inferno", /* class */
@@ -644,15 +602,13 @@ winproc(LPVOID x)
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
- }
- else {
+ }else{
while(GetMessageA(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessageA(&msg);
}
}
attached = 0;
- /* drawend(); */
ExitThread(msg.wParam);
return 0;
}
@@ -663,7 +619,7 @@ setpointer(int x, int y)
POINT pt;
pt.x = x; pt.y = y;
- ClientToScreen(window, (LPPOINT)&pt);
+ ClientToScreen(window, &pt);
SetCursorPos(pt.x, pt.y);
}
@@ -671,7 +627,7 @@ void
drawcursor(Drawcursor* c)
{
HCURSOR nh, oh;
- IRectangle ir;
+ Rectangle ir;
int i, h, j, bpl, ch, cw;
uchar *bs, *bc, *and, *xor, *cand, *cxor;
@@ -690,7 +646,6 @@ drawcursor(Drawcursor* c)
ir.min.y = c->miny;
ir.max.x = c->maxx;
ir.max.y = c->maxy;
- /* passing IRectangle to Rectangle is safe */
bpl = bytesperline(ir, 1);
h = (c->maxy-c->miny)/2;
@@ -728,8 +683,7 @@ drawcursor(Drawcursor* c)
SendMessage(window, WM_SETCURSOR, (int)window, 0);
if(oh != NULL)
DestroyCursor(oh);
- }
- else {
+ }else{
print("CreateCursor error %d\n", GetLastError());
print("CXCURSOR=%d\n", GetSystemMetrics(SM_CXCURSOR));
print("CYCURSOR=%d\n", GetSystemMetrics(SM_CYCURSOR));
diff --git a/emu/Plan9/cmd.c b/emu/Plan9/cmd.c
index d3822f50..8d311f2a 100644
--- a/emu/Plan9/cmd.c
+++ b/emu/Plan9/cmd.c
@@ -12,7 +12,7 @@ extern void vstack(void*);
typedef struct Targ Targ;
struct Targ
{
- int fd[2];
+ int fd[3]; /* standard input, output and error */
int wfd;
int* spin;
char** args;
@@ -41,18 +41,21 @@ exectramp(Targ *t)
nfd = MAXNFD; /* TO DO: should read from /fd */
for(i = 0; i < nfd; i++)
- if(i != fd[0] && i != fd[1] && i != t->wfd)
+ if(i != fd[0] && i != fd[1] && i != fd[2] && i != t->wfd)
close(i);
if(fd[0] != 0){
dup(fd[0], 0);
close(fd[0]);
}
- if(fd[0] != 1){
+ if(fd[1] != 1){
dup(fd[1], 1);
close(fd[1]);
}
- dup(1, 2);
+ if(fd[2] != 2){
+ dup(fd[2], 2);
+ close(fd[2]);
+ }
if(t->dir != nil && chdir(t->dir) < 0){
if(t->wfd > 0)
@@ -79,10 +82,10 @@ exectramp(Targ *t)
}
void*
-oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
+oscmd(char **args, int nice, char *dir, int *fd)
{
Targ *t;
- int spin, *spinptr, fd0[2], fd1[2], wfd[2], n;
+ int spin, *spinptr, fd0[2], fd1[2], fd2[2], wfd[2], n;
Dir *d;
up->genbuf[0] = 0;
@@ -94,6 +97,7 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
t->nice = nice;
fd0[0] = fd0[1] = -1;
fd1[0] = fd1[1] = -1;
+ fd2[0] = fd2[1] = -1;
wfd[0] = wfd[1] = -1;
if(dir != nil){
d = dirstat(dir);
@@ -101,7 +105,7 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
goto Error;
free(d);
}
- if(pipe(fd0) < 0 || pipe(fd1) < 0 || pipe(wfd) < 0)
+ if(pipe(fd0) < 0 || pipe(fd1) < 0 || pipe(fd2) < 0 || pipe(wfd) < 0)
goto Error;
spinptr = &spin;
@@ -109,6 +113,7 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
t->fd[0] = fd0[0];
t->fd[1] = fd1[1];
+ t->fd[2] = fd2[1];
t->wfd = wfd[1];
t->spin = spinptr;
switch(rfork(RFPROC|RFMEM|RFREND|RFNOTEG|RFFDG|RFNAMEG|RFENVG)) {
@@ -128,20 +133,24 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
close(fd0[0]);
close(fd1[1]);
+ close(fd2[1]);
close(wfd[1]);
+
n = read(wfd[0], up->genbuf, sizeof(up->genbuf)-1);
close(wfd[0]);
if(n > 0){
close(fd0[1]);
close(fd1[0]);
+ close(fd2[0]);
up->genbuf[n] = 0;
errstr(up->genbuf, sizeof(up->genbuf));
free(t);
return nil;
}
- *sfd = fd0[1];
- *rfd = fd1[0];
+ fd[0] = fd0[1];
+ fd[1] = fd1[0];
+ fd[2] = fd2[0];
return t;
Error:
@@ -150,6 +159,8 @@ Error:
close(fd0[1]);
close(fd1[0]);
close(fd1[1]);
+ close(fd2[0]);
+ close(fd2[1]);
close(wfd[0]);
close(wfd[1]);
free(t);
diff --git a/emu/Plan9/win.c b/emu/Plan9/win.c
index d86eea15..2f280853 100644
--- a/emu/Plan9/win.c
+++ b/emu/Plan9/win.c
@@ -16,14 +16,14 @@ enum
extern Memimage *screenimage;
-ulong* attachwindow(Rectangle*, ulong*, int*, int*);
+static ulong* attachwindow(Rectangle*, ulong*, int*, int*);
static void plan9readmouse(void*);
static void plan9readkeybd(void*);
static int mapspecials(char *s1, char *s2, int *n);
-int pixels = 1;
int usenewwin = 1;
+int kbdiscons;
static int truedepth;
static int datafd;
@@ -84,31 +84,35 @@ attachscreen(Rectangle *r, ulong *chan, int *d, int *width, int *softscreen)
fprint(2, "attachscreen: can't mount window manager: %r\n");
return nil;
}
+ if(bind("/mnt/wsys", "/dev", MBEFORE) < 0){
+ fprint(2, "attachscreen: can't bind /mnt/wsys before /dev: %r\n");
+ return nil;
+ }
}
- cursfd = open("/mnt/wsys/cursor", OWRITE);
+ cursfd = open("/dev/cursor", OWRITE);
if(cursfd < 0) {
fprint(2, "attachscreen: open cursor: %r\n");
return nil;
}
/* Set up graphics window console (chars->gkbdq) */
- keybdfd = open("/mnt/wsys/cons", OREAD);
+ keybdfd = open("/dev/cons", OREAD);
if(keybdfd < 0) {
fprint(2, "attachscreen: open keyboard: %r\n");
return nil;
}
- mousefd = open("/mnt/wsys/mouse", ORDWR);
+ mousefd = open("/dev/mouse", ORDWR);
if(mousefd < 0){
fprint(2, "attachscreen: can't open mouse: %r\n");
return nil;
}
- if(usenewwin){
- fd = open("/mnt/wsys/consctl", OWRITE);
+ if(usenewwin || 1){
+ fd = open("/dev/consctl", OWRITE);
if(fd < 0)
- fprint(2, "attachscreen: open /mnt/wsys/consctl: %r\n");
+ fprint(2, "attachscreen: open /dev/consctl: %r\n");
if(write(fd, "rawon", 5) != 5)
- fprint(2, "attachscreen: write /mnt/wsys/consctl: %r\n");
+ fprint(2, "attachscreen: write /dev/consctl: %r\n");
}
/* Set up graphics files */
@@ -148,11 +152,11 @@ attachscreen(Rectangle *r, ulong *chan, int *d, int *width, int *softscreen)
mousepid = kproc("readmouse", plan9readmouse, nil, 0);
keybdpid = kproc("readkbd", plan9readkeybd, nil, 0);
- bind("/mnt/wsys", "/dev", MBEFORE);
fd = open("/dev/label", OWRITE);
- if (fd >= 0) {
- write(fd, "inferno", 7);
+ if(fd >= 0){
+ snprint(buf, sizeof(buf), "inferno %d", getpid());
+ write(fd, buf, strlen(buf));
close(fd);
}
@@ -160,35 +164,7 @@ attachscreen(Rectangle *r, ulong *chan, int *d, int *width, int *softscreen)
return (uchar*)data;
}
-static int
-depthof(char *s)
-{
- char *es;
- int n, c, d;
-
- es = s+12;
- while(s<es && *s==' ')
- s++;
- if(s == es)
- return -1;
- if('0'<=*s && *s<='9'){
- truedepth = 1<<atoi(s);
- return truedepth;
- }
-
- d = 0;
- while(s<es && *s!=' '){
- c = *s++; /* skip letter */
- n = strtoul(s, &s, 10);
- d += n;
- if(c != 'r' && c != 'g' && c != 'b' && c != 'k' && c != 'm')
- return -1;
- }
- truedepth = d;
- return d;
-}
-
-ulong*
+static ulong*
attachwindow(Rectangle *r, ulong *chan, int *d, int *width)
{
int n, fd, nb;
@@ -231,7 +207,8 @@ attachwindow(Rectangle *r, ulong *chan, int *d, int *width)
return nil;
}
imagechan = strtochan(buf+2*12);
- if(depthof(buf+2*12) < 0){
+ truedepth = chantodepth(imagechan);
+ if(truedepth == 0){
fprint(2, "attachwindow: cannot handle window depth specifier %.12s\n", buf+2*12);
return nil;
}
@@ -272,7 +249,7 @@ attachwindow(Rectangle *r, ulong *chan, int *d, int *width)
return data;
}
-int
+static int
plan9loadimage(Rectangle r, uchar *data, int ndata)
{
long dy;
@@ -396,7 +373,7 @@ drawcursor(Drawcursor *c)
write(cursfd, curs, sizeof curs);
}
-int
+static int
checkmouse(char *buf, int n)
{
int x, y, tick, b;
@@ -453,12 +430,12 @@ plan9readmouse(void *v)
}
static void
-plan9readkeybd(void *v)
+plan9readkeybd(void*)
{
int n, partial;
char buf[32];
char dbuf[32 * 3]; /* overestimate but safe */
- USED(v);
+
partial = 0;
for(;;){
n = read(keybdfd, buf + partial, sizeof(buf) - partial);
diff --git a/emu/Solaris/cmd.c b/emu/Solaris/cmd.c
index 897490c7..bff1f03b 100644
--- a/emu/Solaris/cmd.c
+++ b/emu/Solaris/cmd.c
@@ -21,7 +21,7 @@ enum
typedef struct Targ Targ;
struct Targ
{
- int fd[2]; /* fd[0] is standard input, fd[1] is standard output */
+ int fd[3]; /* fd[0] is standard input, fd[1] is standard output, fd[2] is standard error */
char** args;
char* dir;
int pid;
@@ -43,15 +43,17 @@ childproc(Targ *t)
nfd = getdtablesize();
for(i = 0; i < nfd; i++)
- if(i != t->fd[0] && i != t->fd[1] && i != t->wfd)
+ if(i != t->fd[0] && i != t->fd[1] && i != t->fd[2] && i != t->wfd)
close(i);
dup2(t->fd[0], 0);
dup2(t->fd[1], 1);
- dup2(t->fd[1], 2);
+ dup2(t->fd[2], 2);
close(t->fd[0]);
close(t->fd[1]);
+ close(t->fd[2]);
+ /* should have an auth file to do host-specific authorisation? */
if(t->gid != -1){
if(setgid(t->gid) < 0 && getegid() == 0){
fprint(t->wfd, "can't set gid %d: %s", t->gid, strerror(errno));
@@ -82,11 +84,10 @@ childproc(Targ *t)
}
void*
-oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
+oscmd(char **args, int nice, char *dir, int *fd)
{
- Dir *d;
Targ *t;
- int r, fd0[2], fd1[2], wfd[2], n, pid;
+ int r, fd0[2], fd1[2], fd2[2], wfd[2], n, pid;
t = mallocz(sizeof(*t), 1);
if(t == nil)
@@ -94,14 +95,16 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
fd0[0] = fd0[1] = -1;
fd1[0] = fd1[1] = -1;
+ fd2[0] = fd2[1] = -1;
wfd[0] = wfd[1] = -1;
- if(pipe(fd0) < 0 || pipe(fd1) < 0 || pipe(wfd) < 0)
+ if(pipe(fd0) < 0 || pipe(fd1) < 0 || pipe(fd2) < 0 || pipe(wfd) < 0)
goto Error;
if(fcntl(wfd[1], F_SETFD, FD_CLOEXEC) < 0) /* close on exec to give end of file on success */
goto Error;
t->fd[0] = fd0[0];
t->fd[1] = fd1[1];
+ t->fd[2] = fd2[1];
t->wfd = wfd[1];
t->args = args;
t->dir = dir;
@@ -113,7 +116,7 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
t->uid = uidnobody;
signal(SIGCHLD, SIG_DFL);
- switch(pid = fork1()) {
+ switch(pid = fork()) {
case -1:
goto Error;
case 0:
@@ -131,6 +134,7 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
close(fd0[0]);
close(fd1[1]);
+ close(fd2[1]);
close(wfd[1]);
n = read(wfd[0], up->genbuf, sizeof(up->genbuf)-1);
@@ -138,6 +142,7 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
if(n > 0){
close(fd0[1]);
close(fd1[0]);
+ close(fd2[0]);
free(t);
up->genbuf[n] = 0;
if(Debug)
@@ -146,8 +151,9 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
return nil;
}
- *sfd = fd0[1];
- *rfd = fd1[0];
+ fd[0] = fd0[1];
+ fd[1] = fd1[0];
+ fd[2] = fd2[0];
return t;
Error:
@@ -158,6 +164,8 @@ Error:
close(fd0[1]);
close(fd1[0]);
close(fd1[1]);
+ close(fd2[0]);
+ close(fd2[1]);
close(wfd[0]);
close(wfd[1]);
error(strerror(r));
diff --git a/emu/Unixware/cmd.c b/emu/Unixware/cmd.c
index 897490c7..bff1f03b 100644
--- a/emu/Unixware/cmd.c
+++ b/emu/Unixware/cmd.c
@@ -21,7 +21,7 @@ enum
typedef struct Targ Targ;
struct Targ
{
- int fd[2]; /* fd[0] is standard input, fd[1] is standard output */
+ int fd[3]; /* fd[0] is standard input, fd[1] is standard output, fd[2] is standard error */
char** args;
char* dir;
int pid;
@@ -43,15 +43,17 @@ childproc(Targ *t)
nfd = getdtablesize();
for(i = 0; i < nfd; i++)
- if(i != t->fd[0] && i != t->fd[1] && i != t->wfd)
+ if(i != t->fd[0] && i != t->fd[1] && i != t->fd[2] && i != t->wfd)
close(i);
dup2(t->fd[0], 0);
dup2(t->fd[1], 1);
- dup2(t->fd[1], 2);
+ dup2(t->fd[2], 2);
close(t->fd[0]);
close(t->fd[1]);
+ close(t->fd[2]);
+ /* should have an auth file to do host-specific authorisation? */
if(t->gid != -1){
if(setgid(t->gid) < 0 && getegid() == 0){
fprint(t->wfd, "can't set gid %d: %s", t->gid, strerror(errno));
@@ -82,11 +84,10 @@ childproc(Targ *t)
}
void*
-oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
+oscmd(char **args, int nice, char *dir, int *fd)
{
- Dir *d;
Targ *t;
- int r, fd0[2], fd1[2], wfd[2], n, pid;
+ int r, fd0[2], fd1[2], fd2[2], wfd[2], n, pid;
t = mallocz(sizeof(*t), 1);
if(t == nil)
@@ -94,14 +95,16 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
fd0[0] = fd0[1] = -1;
fd1[0] = fd1[1] = -1;
+ fd2[0] = fd2[1] = -1;
wfd[0] = wfd[1] = -1;
- if(pipe(fd0) < 0 || pipe(fd1) < 0 || pipe(wfd) < 0)
+ if(pipe(fd0) < 0 || pipe(fd1) < 0 || pipe(fd2) < 0 || pipe(wfd) < 0)
goto Error;
if(fcntl(wfd[1], F_SETFD, FD_CLOEXEC) < 0) /* close on exec to give end of file on success */
goto Error;
t->fd[0] = fd0[0];
t->fd[1] = fd1[1];
+ t->fd[2] = fd2[1];
t->wfd = wfd[1];
t->args = args;
t->dir = dir;
@@ -113,7 +116,7 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
t->uid = uidnobody;
signal(SIGCHLD, SIG_DFL);
- switch(pid = fork1()) {
+ switch(pid = fork()) {
case -1:
goto Error;
case 0:
@@ -131,6 +134,7 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
close(fd0[0]);
close(fd1[1]);
+ close(fd2[1]);
close(wfd[1]);
n = read(wfd[0], up->genbuf, sizeof(up->genbuf)-1);
@@ -138,6 +142,7 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
if(n > 0){
close(fd0[1]);
close(fd1[0]);
+ close(fd2[0]);
free(t);
up->genbuf[n] = 0;
if(Debug)
@@ -146,8 +151,9 @@ oscmd(char **args, int nice, char *dir, int *rfd, int *sfd)
return nil;
}
- *sfd = fd0[1];
- *rfd = fd1[0];
+ fd[0] = fd0[1];
+ fd[1] = fd1[0];
+ fd[2] = fd2[0];
return t;
Error:
@@ -158,6 +164,8 @@ Error:
close(fd0[1]);
close(fd1[0]);
close(fd1[1]);
+ close(fd2[0]);
+ close(fd2[1]);
close(wfd[0]);
close(wfd[1]);
error(strerror(r));
diff --git a/emu/mkfile b/emu/mkfile
index 72da0cc1..779e5f16 100644
--- a/emu/mkfile
+++ b/emu/mkfile
@@ -8,7 +8,7 @@ nuke:V: nuke-$HOSTMODEL
&-Posix:QV:
echo "(cd $SYSTARG; mk $MKFLAGS $stem)"
- (cd $SYSTARG; mk $MKFLAGS $stem)
+ (cd $SYSTARG; mk $MKFLAGS $stem) || exit 1
&-Nt:QV:
echo '@{builtin cd' $SYSTARG '; mk $MKFLAGS $stem}'
diff --git a/emu/port/chan.c b/emu/port/chan.c
index 697d92c4..997cb876 100644
--- a/emu/port/chan.c
+++ b/emu/port/chan.c
@@ -1297,7 +1297,6 @@ if(c->umh != nil){
omode |= OTRUNC;
goto Open;
}
- panic("namec: not reached");
default:
panic("unknown namec access %d\n", amode);
diff --git a/emu/port/dev.c b/emu/port/dev.c
index 8bd1da5f..5df62ecc 100644
--- a/emu/port/dev.c
+++ b/emu/port/dev.c
@@ -249,8 +249,6 @@ devstat(Chan *c, uchar *db, int n, Dirtab *tab, int ntab, Devgen *gen)
}
break;
}
- error(Egreg); /* not reached? */
- return -1;
}
long
diff --git a/emu/port/devcmd.c b/emu/port/devcmd.c
index 4822c49a..f6cccf39 100644
--- a/emu/port/devcmd.c
+++ b/emu/port/devcmd.c
@@ -10,6 +10,7 @@ enum
Qconvdir,
Qconvbase,
Qdata = Qconvbase,
+ Qstderr,
Qctl,
Qstatus,
Qwait,
@@ -25,10 +26,8 @@ struct Conv
{
int x;
int inuse;
- int wcount;
- int rcount;
- int rfd;
- int wfd;
+ int fd[3]; /* stdin, stdout, and stderr */
+ int count[3]; /* number of readers on stdin/stdout/stderr */
int perm;
char* owner;
char* state;
@@ -69,6 +68,10 @@ cmd3gen(Chan *c, int i, Dir *dp)
mkqid(&q, QID(CONV(c->qid), Qdata), 0, QTFILE);
devdir(c, q, "data", 0, cv->owner, cv->perm, dp);
return 1;
+ case Qstderr:
+ mkqid(&q, QID(CONV(c->qid), Qstderr), 0, QTFILE);
+ devdir(c, q, "stderr", 0, cv->owner, 0444, dp);
+ return 1;
case Qctl:
mkqid(&q, QID(CONV(c->qid), Qctl), 0, QTFILE);
devdir(c, q, "ctl", 0, cv->owner, cv->perm, dp);
@@ -143,6 +146,7 @@ cmdgen(Chan *c, char *name, Dirtab *d, int nd, int s, Dir *dp)
case Qconvdir:
return cmd3gen(c, Qconvbase+s, dp);
case Qdata:
+ case Qstderr:
case Qctl:
case Qstatus:
case Qwait:
@@ -154,7 +158,7 @@ cmdgen(Chan *c, char *name, Dirtab *d, int nd, int s, Dir *dp)
static void
cmdinit(void)
{
- cmd.maxconv = 100;
+ cmd.maxconv = 1000;
cmd.conv = mallocz(sizeof(Conv*)*(cmd.maxconv+1), 1);
/* cmd.conv is checked by cmdattach, below */
}
@@ -228,6 +232,7 @@ cmdopen(Chan *c, int omode)
mkqid(&c->qid, QID(cv->x, Qctl), 0, QTFILE);
break;
case Qdata:
+ case Qstderr:
case Qctl:
case Qwait:
qlock(&cmd.l);
@@ -247,10 +252,14 @@ cmdopen(Chan *c, int omode)
switch(TYPE(c->qid)){
case Qdata:
if(omode == OWRITE || omode == ORDWR)
- cv->wcount++;
+ cv->count[0]++;
if(omode == OREAD || omode == ORDWR)
- cv->rcount++;
- c->mode = omode;
+ cv->count[1]++;
+ break;
+ case Qstderr:
+ if(omode != OREAD)
+ error(Eperm);
+ cv->count[2]++;
break;
case Qwait:
if(cv->waitq == nil)
@@ -269,7 +278,7 @@ cmdopen(Chan *c, int omode)
qunlock(&cmd.l);
break;
}
- c->mode = openmode(omode);
+ c->mode = omode;
c->flag |= COPEN;
c->offset = 0;
return c;
@@ -296,6 +305,15 @@ closeconv(Conv *c)
}
static void
+cmdfdclose(Conv *c, int fd)
+{
+ if(--c->count[fd] == 0 && c->fd[fd] != -1){
+ close(c->fd[fd]);
+ c->fd[fd] = -1;
+ }
+}
+
+static void
cmdclose(Chan *c)
{
Conv *cc;
@@ -307,23 +325,17 @@ cmdclose(Chan *c)
switch(TYPE(c->qid)) {
case Qctl:
case Qdata:
+ case Qstderr:
case Qwait:
cc = cmd.conv[CONV(c->qid)];
qlock(&cc->l);
if(TYPE(c->qid) == Qdata){
- if(c->mode == OWRITE || c->mode == ORDWR){
- if(--cc->wcount == 0 && cc->wfd != -1){
- close(cc->wfd);
- cc->wfd = -1;
- }
- }
- if(c->mode == OREAD || c->mode == ORDWR){
- if(--cc->rcount == 0 && cc->rfd != -1){
- close(cc->rfd);
- cc->rfd = -1;
- }
- }
- }
+ if(c->mode == OWRITE || c->mode == ORDWR)
+ cmdfdclose(cc, 0);
+ if(c->mode == OREAD || c->mode == ORDWR)
+ cmdfdclose(cc, 1);
+ }else if(TYPE(c->qid) == Qstderr)
+ cmdfdclose(cc, 2);
r = --cc->inuse;
if(cc->child != nil){
@@ -345,6 +357,7 @@ cmdread(Chan *ch, void *a, long n, vlong offset)
{
Conv *c;
char *p, *cmds;
+ int fd;
USED(offset);
@@ -368,15 +381,19 @@ cmdread(Chan *ch, void *a, long n, vlong offset)
c->x, c->inuse, c->state, c->dir, cmds);
return readstr(offset, p, n, up->genbuf);
case Qdata:
+ case Qstderr:
+ fd = 1;
+ if(TYPE(ch->qid) == Qstderr)
+ fd = 2;
c = cmd.conv[CONV(ch->qid)];
qlock(&c->l);
- if(c->rfd == -1){
+ if(c->fd[fd] == -1){
qunlock(&c->l);
return 0;
}
qunlock(&c->l);
osenter();
- n = read(c->rfd, a, n);
+ n = read(c->fd[fd], a, n);
osleave();
if(n < 0)
oserror();
@@ -393,7 +410,7 @@ cmdstarted(void *a)
Conv *c;
c = a;
- return c->child != nil || c->error != nil;
+ return c->child != nil || c->error != nil || strcmp(c->state, "Execute") != 0;
}
enum
@@ -417,7 +434,7 @@ Cmdtab cmdtab[] = {
static long
cmdwrite(Chan *ch, void *a, long n, vlong offset)
{
- int r;
+ int i, r;
Conv *c;
Cmdbuf *cb;
Cmdtab *ct;
@@ -447,8 +464,11 @@ cmdwrite(Chan *ch, void *a, long n, vlong offset)
free(cb);
nexterror();
}
- if(c->child != nil || c->cmd != nil || c->wfd != -1 || c->rfd != -1)
+ if(c->child != nil || c->cmd != nil)
error(Einuse);
+ for(i = 0; i < nelem(c->fd); i++)
+ if(c->fd[i] != -1)
+ error(Einuse);
if(cb->nf < 1)
error(Etoosmall);
kproc("cmdproc", cmdproc, c, 0); /* cmdproc held back until unlock below */
@@ -490,13 +510,13 @@ cmdwrite(Chan *ch, void *a, long n, vlong offset)
case Qdata:
c = cmd.conv[CONV(ch->qid)];
qlock(&c->l);
- if(c->wfd == -1){
+ if(c->fd[0] == -1){
qunlock(&c->l);
error(Ehungup);
}
qunlock(&c->l);
osenter();
- r = write(c->wfd, a, n);
+ r = write(c->fd[0], a, n);
osleave();
if(r == 0)
error(Ehungup);
@@ -520,6 +540,7 @@ cmdwstat(Chan *c, uchar *dp, int n)
error(Eperm);
case Qctl:
case Qdata:
+ case Qstderr:
d = malloc(sizeof(*d)+n);
if(d == nil)
error(Enomem);
@@ -548,6 +569,7 @@ static Conv*
cmdclone(char *user)
{
Conv *c, **pp, **ep;
+ int i;
c = nil;
ep = &cmd.conv[cmd.maxconv];
@@ -578,8 +600,8 @@ cmdclone(char *user)
kstrdup(&c->dir, rootdir);
c->perm = 0660;
c->state = "Closed";
- c->rfd = -1;
- c->wfd = -1;
+ for(i=0; i<nelem(c->fd); i++)
+ c->fd[i] = -1;
qunlock(&c->l);
return c;
@@ -606,7 +628,7 @@ cmdproc(void *a)
Wakeup(&c->startr);
pexit("cmdproc", 0);
}
- t = oscmd(c->cmd->f+1, c->nice, c->dir, &c->rfd, &c->wfd);
+ t = oscmd(c->cmd->f+1, c->nice, c->dir, c->fd);
if(t == nil)
oserror();
c->child = t; /* to allow oscmdkill */
@@ -629,7 +651,7 @@ cmdproc(void *a)
oscmdfree(t);
if(Debug){
status[n]=0;
- print("done %d %d: %q\n", c->rfd, c->wfd, status);
+ print("done %d %d %d: %q\n", c->fd[0], c->fd[1], c->fd[2], status);
}
if(c->inuse > 0){
c->state = "Done";
diff --git a/emu/port/devcons.c b/emu/port/devcons.c
index efe49838..8e823839 100644
--- a/emu/port/devcons.c
+++ b/emu/port/devcons.c
@@ -107,11 +107,19 @@ kbdslave(void *a)
USED(a);
for(;;) {
b = readkbd();
- if(kbd.raw == 0)
- write(1, &b, 1);
+ if(kbd.raw == 0){
+ switch(b){
+ case 0x15:
+ write(1, "^U\n", 3);
+ break;
+ default:
+ write(1, &b, 1);
+ break;
+ }
+ }
qproduce(kbdq, &b, 1);
}
- pexit("kbdslave", 0);
+ /* pexit("kbdslave", 0); */ /* not reached */
}
void
@@ -152,13 +160,13 @@ gkbdputc(Queue *q, int ch)
void
consinit(void)
{
- kbdq = qopen(512, 0, 0, 0);
+ kbdq = qopen(512, 0, nil, nil);
if(kbdq == 0)
panic("no memory");
- lineq = qopen(512, 0, 0, 0);
+ lineq = qopen(2*1024, 0, nil, nil);
if(lineq == 0)
panic("no memory");
- gkbdq = qopen(512, 0, 0, 0);
+ gkbdq = qopen(512, 0, nil, nil);
if(gkbdq == 0)
panic("no memory");
randominit();
@@ -178,9 +186,9 @@ consattach(char *spec)
{
static int kp;
- if (kp == 0 && !dflag) {
- kproc("kbd", kbdslave, 0, 0);
+ if(kp == 0 && !dflag) {
kp = 1;
+ kproc("kbd", kbdslave, 0, 0);
}
return devattach('c', spec);
}
@@ -205,34 +213,37 @@ consopen(Chan *c, int omode)
case Qconsctl:
incref(&kbd.ctl);
break;
+
case Qscancode:
qlock(&kbd.gq);
- if(gkscanq || !gkscanid) {
+ if(gkscanq != nil || gkscanid == nil) {
qunlock(&kbd.q);
c->flag &= ~COPEN;
if(gkscanq)
error(Einuse);
else
- error(Ebadarg);
+ error("not supported");
}
gkscanq = qopen(256, 0, nil, nil);
qunlock(&kbd.gq);
break;
+
case Qkprint:
wlock(&kprintq.l);
- if(kprintq.q != nil){
+ if(waserror()){
wunlock(&kprintq.l);
c->flag &= ~COPEN;
- error(Einuse);
+ nexterror();
}
- kprintq.q = qopen(32*1024, 0, 0, 0);
- if(kprintq.q == nil){
- wunlock(&kprintq.l);
- c->flag &= ~COPEN;
+ if(kprintq.q != nil)
+ error(Einuse);
+ kprintq.q = qopen(32*1024, Qcoalesce, nil, nil);
+ if(kprintq.q == nil)
error(Enomem);
- }
qnoblock(kprintq.q, 1);
+ poperror();
wunlock(&kprintq.l);
+ c->iounit = qiomaxatomic;
break;
}
return c;
@@ -246,17 +257,20 @@ consclose(Chan *c)
switch((ulong)c->qid.path) {
case Qconsctl:
+ /* last close of control file turns off raw */
if(decref(&kbd.ctl) == 0)
kbd.raw = 0;
break;
+
case Qscancode:
qlock(&kbd.gq);
if(gkscanq) {
qfree(gkscanq);
- gkscanq = 0;
+ gkscanq = nil;
}
qunlock(&kbd.gq);
break;
+
case Qkprint:
wlock(&kprintq.l);
qfree(kprintq.q);
@@ -267,62 +281,82 @@ consclose(Chan *c)
}
static long
-consread(Chan *c, void *va, long count, vlong offset)
+consread(Chan *c, void *va, long n, vlong offset)
{
- int i, n, ch, eol;
- char *p, buf[64];
+ ulong l;
+ int i, send;
+ char *p, buf[64], ch;
if(c->qid.type & QTDIR)
- return devdirread(c, va, count, contab, nelem(contab), devgen);
+ return devdirread(c, va, n, contab, nelem(contab), devgen);
switch((ulong)c->qid.path) {
default:
error(Egreg);
+
case Qsysctl:
- return readstr(offset, va, count, VERSION);
+ return readstr(offset, va, n, VERSION);
+
case Qsysname:
if(ossysname == nil)
return 0;
- return readstr(offset, va, count, ossysname);
+ return readstr(offset, va, n, ossysname);
+
case Qrandom:
- return randomread(va, count);
+ return randomread(va, n);
+
case Qnotquiterandom:
- genrandom(va, count);
- return count;
+ genrandom(va, n);
+ return n;
+
case Qpin:
p = "pin set";
if(up->env->pgrp->pin == Nopin)
p = "no pin";
- return readstr(offset, va, count, p);
+ return readstr(offset, va, n, p);
+
case Qhostowner:
- return readstr(offset, va, count, eve);
+ return readstr(offset, va, n, eve);
+
case Qhoststdin:
- return read(0, va, count); /* should be pread */
+ return read(0, va, n); /* should be pread */
+
case Quser:
- return readstr(offset, va, count, up->env->user);
+ return readstr(offset, va, n, up->env->user);
+
case Qjit:
snprint(buf, sizeof(buf), "%d", cflag);
- return readstr(offset, va, count, buf);
+ return readstr(offset, va, n, buf);
+
case Qtime:
snprint(buf, sizeof(buf), "%.lld", timeoffset + osusectime());
- return readstr(offset, va, count, buf);
+ return readstr(offset, va, n, buf);
+
case Qdrivers:
p = malloc(READSTR);
if(p == nil)
error(Enomem);
- n = 0;
+ l = 0;
for(i = 0; devtab[i] != nil; i++)
- n += snprint(p+n, READSTR-n, "#%C %s\n", devtab[i]->dc, devtab[i]->name);
- n = readstr(offset, va, count, p);
+ l += snprint(p+l, READSTR-l, "#%C %s\n", devtab[i]->dc, devtab[i]->name);
+ if(waserror()){
+ free(p);
+ nexterror();
+ }
+ n = readstr(offset, va, n, p);
+ poperror();
free(p);
return n;
+
case Qmemory:
- return poolread(va, count, offset);
+ return poolread(va, n, offset);
case Qnull:
return 0;
+
case Qmsec:
- return readnum(offset, va, count, osmillisec(), NUMSIZE);
+ return readnum(offset, va, n, osmillisec(), NUMSIZE);
+
case Qcons:
qlock(&kbd.q);
if(waserror()){
@@ -334,53 +368,60 @@ consread(Chan *c, void *va, long count, vlong offset)
error(Enonexist);
while(!qcanread(lineq)) {
- qread(kbdq, &kbd.line[kbd.x], 1);
- ch = kbd.line[kbd.x];
- if(kbd.raw){
- qiwrite(lineq, &kbd.line[kbd.x], 1);
+ if(qread(kbdq, &ch, 1) == 0)
continue;
- }
- eol = 0;
- switch(ch) {
- case '\b':
- if(kbd.x)
- kbd.x--;
- break;
- case 0x15:
- kbd.x = 0;
- break;
- case '\n':
- case 0x04:
- eol = 1;
- default:
+ send = 0;
+ if(ch == 0){
+ /* flush output on rawoff -> rawon */
+ if(kbd.x > 0)
+ send = !qcanread(kbdq);
+ }else if(kbd.raw){
kbd.line[kbd.x++] = ch;
- break;
+ send = !qcanread(kbdq);
+ }else{
+ switch(ch){
+ case '\b':
+ if(kbd.x)
+ kbd.x--;
+ break;
+ case 0x15:
+ kbd.x = 0;
+ break;
+ case 0x04:
+ send = 1;
+ break;
+ case '\n':
+ send = 1;
+ default:
+ kbd.line[kbd.x++] = ch;
+ break;
+ }
}
- if(kbd.x == sizeof(kbd.line) || eol){
- if(ch == 0x04)
- kbd.x--;
+ if(send || kbd.x == sizeof kbd.line){
qwrite(lineq, kbd.line, kbd.x);
kbd.x = 0;
}
}
- n = qread(lineq, va, count);
+ n = qread(lineq, va, n);
qunlock(&kbd.q);
poperror();
return n;
+
case Qscancode:
if(offset == 0)
- return readstr(0, va, count, gkscanid);
- else
- return qread(gkscanq, va, count);
+ return readstr(0, va, n, gkscanid);
+ return qread(gkscanq, va, n);
+
case Qkeyboard:
- return qread(gkbdq, va, count);
+ return qread(gkbdq, va, n);
+
case Qkprint:
rlock(&kprintq.l);
if(waserror()){
runlock(&kprintq.l);
nexterror();
}
- n = qread(kprintq.q, va, count);
+ n = qread(kprintq.q, va, n);
poperror();
runlock(&kprintq.l);
return n;
@@ -388,19 +429,18 @@ consread(Chan *c, void *va, long count, vlong offset)
}
static long
-conswrite(Chan *c, void *va, long count, vlong offset)
+conswrite(Chan *c, void *va, long n, vlong offset)
{
- char buf[128];
+ char buf[128], *a, ch;
int x;
- USED(offset);
-
if(c->qid.type & QTDIR)
error(Eperm);
switch((ulong)c->qid.path) {
default:
error(Egreg);
+
case Qcons:
if(canrlock(&kprintq.l)){
if(kprintq.q != nil){
@@ -408,105 +448,129 @@ conswrite(Chan *c, void *va, long count, vlong offset)
runlock(&kprintq.l);
nexterror();
}
- qwrite(kprintq.q, va, count);
+ qwrite(kprintq.q, va, n);
poperror();
runlock(&kprintq.l);
- return count;
+ return n;
}
runlock(&kprintq.l);
}
- return write(1, va, count);
+ return write(1, va, n);
+
case Qsysctl:
- return sysconwrite(va, count);
+ return sysconwrite(va, n);
+
case Qconsctl:
- if(count >= sizeof(buf))
- count = sizeof(buf)-1;
- strncpy(buf, va, count);
- buf[count] = 0;
- if(strncmp(buf, "rawon", 5) == 0) {
- kbd.raw = 1;
- return count;
- }
- else
- if(strncmp(buf, "rawoff", 6) == 0) {
- kbd.raw = 0;
- return count;
+ if(n >= sizeof(buf))
+ n = sizeof(buf)-1;
+ strncpy(buf, va, n);
+ buf[n] = 0;
+ for(a = buf; a;){
+ if(strncmp(a, "rawon", 5) == 0){
+ kbd.raw = 1;
+ /* clumsy hack - wake up reader */
+ ch = 0;
+ qwrite(kbdq, &ch, 1);
+ } else if(strncmp(buf, "rawoff", 6) == 0){
+ kbd.raw = 0;
+ }
+ if((a = strchr(a, ' ')) != nil)
+ a++;
}
- error(Ebadctl);
+ break;
+
case Qkeyboard:
- for(x=0; x<count; ) {
+ for(x=0; x<n; ) {
Rune r;
x += chartorune(&r, &((char*)va)[x]);
gkbdputc(gkbdq, r);
}
- return count;
+ break;
+
case Qnull:
- return count;
+ break;
+
case Qpin:
if(up->env->pgrp->pin != Nopin)
error("pin already set");
- if(count >= sizeof(buf))
- count = sizeof(buf)-1;
- strncpy(buf, va, count);
- buf[count] = '\0';
+ if(n >= sizeof(buf))
+ n = sizeof(buf)-1;
+ strncpy(buf, va, n);
+ buf[n] = '\0';
up->env->pgrp->pin = atoi(buf);
- return count;
+ break;
+
case Qtime:
- if(count >= sizeof(buf))
- count = sizeof(buf)-1;
- strncpy(buf, va, count);
- buf[count] = '\0';
+ if(n >= sizeof(buf))
+ n = sizeof(buf)-1;
+ strncpy(buf, va, n);
+ buf[n] = '\0';
timeoffset = strtoll(buf, 0, 0)-osusectime();
- return count;
- case Quser:
- if(count >= sizeof(buf))
+ break;
+
+ case Qhostowner:
+ if(!iseve())
+ error(Eperm);
+ if(offset != 0 || n >= sizeof(buf))
error(Ebadarg);
- strncpy(buf, va, count);
- buf[count] = '\0';
- if(count > 0 && buf[count-1] == '\n')
- buf[--count] = '\0';
- if(count == 0)
+ memmove(buf, va, n);
+ buf[n] = '\0';
+ if(n > 0 && buf[n-1] == '\n')
+ buf[--n] = '\0';
+ if(n == 0)
error(Ebadarg);
- if(strcmp(up->env->user, eve) != 0)
+ /* renameuser(eve, buf); */
+ /* renameproguser(eve, buf); */
+ kstrdup(&eve, buf);
+ kstrdup(&up->env->user, buf);
+ break;
+
+ case Quser:
+ if(!iseve())
error(Eperm);
- setid(buf, 0);
- return count;
- case Qhostowner:
- if(count >= sizeof(buf))
+ if(offset != 0)
error(Ebadarg);
- strncpy(buf, va, count);
- buf[count] = '\0';
- if(count > 0 && buf[count-1] == '\n')
- buf[--count] = '\0';
- if(count == 0)
+ if(n <= 0 || n >= sizeof(buf))
error(Ebadarg);
- if(strcmp(up->env->user, eve) != 0)
- error(Eperm);
- kstrdup(&eve, buf);
- return count;
+ strncpy(buf, va, n);
+ buf[n] = '\0';
+ if(n > 0 && buf[n-1] == '\n')
+ buf[--n] = '\0';
+ if(n == 0)
+ error(Ebadarg);
+ setid(buf, 0);
+ break;
+
case Qhoststdout:
- return write(1, va, count);
+ return write(1, va, n);
+
case Qhoststderr:
- return write(2, va, count);
+ return write(2, va, n);
+
case Qjit:
- if(count >= sizeof(buf))
- count = sizeof(buf)-1;
- strncpy(buf, va, count);
- buf[count] = '\0';
+ if(n >= sizeof(buf))
+ n = sizeof(buf)-1;
+ strncpy(buf, va, n);
+ buf[n] = '\0';
x = atoi(buf);
- if (x < 0 || x > 9)
+ if(x < 0 || x > 9)
error(Ebadarg);
cflag = x;
- return count;
+ break;
+
case Qsysname:
- if(count >= sizeof(buf))
- count = sizeof(buf)-1;
- strncpy(buf, va, count);
- buf[count] = '\0';
+ if(offset != 0)
+ error(Ebadarg);
+ if(n < 0 || n >= sizeof(buf))
+ error(Ebadarg);
+ strncpy(buf, va, n);
+ buf[n] = '\0';
+ if(buf[n-1] == '\n')
+ buf[n-1] = 0;
kstrdup(&ossysname, buf);
- return count;
+ break;
}
- return 0;
+ return n;
}
static int
diff --git a/emu/port/devmem.c b/emu/port/devmem.c
index 6c09aaad..78f772c6 100644
--- a/emu/port/devmem.c
+++ b/emu/port/devmem.c
@@ -438,7 +438,6 @@ memread(Chan *c, void *va, long count, vlong offset)
free(s);
return count;
}
- return 0;
}
static long
diff --git a/emu/port/devprof.c b/emu/port/devprof.c
index f3a768c3..86d6d962 100644
--- a/emu/port/devprof.c
+++ b/emu/port/devprof.c
@@ -666,8 +666,6 @@ enum{
Mialloc,
};
-#ifdef HEAP_ALIGN
-
static void
memprof(int c, void *v, ulong n)
{
@@ -703,7 +701,7 @@ memprof(int c, void *v, ulong n)
i = p-r->base;
k = (r->id<<24) | i;
if(c == Mhalloc){
- h->pad = k;
+ h->hprof = k;
j = hmsize(h)-sizeof(Heap);
}
else if(c == Mmalloc){
@@ -721,7 +719,7 @@ memprof(int c, void *v, ulong n)
else if(c == Mifree)
k = ((ulong*)v)[1];
else
- k = h->pad;
+ k = h->hprof;
if((r = getrec(k>>24)) == nil){
unlock(&profile.l);
return;
@@ -766,18 +764,6 @@ memprof(int c, void *v, ulong n)
unlock(&profile.l);
}
-#else
-
-static void
-memprof(int c, void *v, ulong n)
-{
- USED(c);
- USED(v);
- USED(n);
-}
-
-#endif
-
/* main and image memory */
static void
memprofmi(int c, ulong pc, ulong v, ulong n)
diff --git a/emu/port/error.h b/emu/port/error.h
index b1911397..e6d61d9d 100644
--- a/emu/port/error.h
+++ b/emu/port/error.h
@@ -32,9 +32,6 @@ extern char Ehungup[]; /* i/o on hungup channel */
extern char Ebadctl[]; /* bad process or channel control request */
extern char Enodev[]; /* no free devices */
extern char Enoenv[]; /* no free environment resources */
-extern char Emuxshutdown[]; /* mux server shut down */
-extern char Emuxbusy[]; /* all mux channels busy */
-extern char Emuxmsg[]; /* bad mux message format or mismatch */
extern char Ethread[]; /* thread exited */
extern char Enochild[]; /* no living children */
extern char Eioload[]; /* i/o error in demand load */
diff --git a/emu/port/exportfs.c b/emu/port/exportfs.c
index e88c5ad3..1feae7ae 100644
--- a/emu/port/exportfs.c
+++ b/emu/port/exportfs.c
@@ -610,8 +610,6 @@ exslave(void *a)
notkilled();
exfreeq(q);
}
- print("exslave %ld shut down", up->pid); /* not reached */
- pexit("exslave shut down", 0);
}
static void
diff --git a/emu/port/fns.h b/emu/port/fns.h
index 393a5c35..effdbe33 100644
--- a/emu/port/fns.h
+++ b/emu/port/fns.h
@@ -118,7 +118,7 @@ void nexterror(void);
void notkilled(void);
int openmode(ulong);
void osblock(void);
-void* oscmd(char**, int, char*, int*, int*);
+void* oscmd(char**, int, char*, int*);
int oscmdwait(void*, char*, int);
int oscmdkill(void*);
void oscmdfree(void*);
diff --git a/emu/port/inferno.c b/emu/port/inferno.c
index 736644be..1149d623 100644
--- a/emu/port/inferno.c
+++ b/emu/port/inferno.c
@@ -585,6 +585,7 @@ Sys_dial(void *fp)
return;
f->ret->t1.dfd = mkfd(f->ret->t0);
+ f->ret->t0 = 0;
f->ret->t1.cfd = mkfd(cfd);
retstr(dir, &f->ret->t1.dir);
}
@@ -608,6 +609,7 @@ Sys_announce(void *fp)
return;
f->ret->t1.cfd = mkfd(f->ret->t0);
+ f->ret->t0 = 0;
retstr(dir, &f->ret->t1.dir);
}
@@ -631,6 +633,7 @@ Sys_listen(void *fp)
return;
f->ret->t1.cfd = mkfd(f->ret->t0);
+ f->ret->t0 = 0;
retstr(dir, &f->ret->t1.dir);
}
diff --git a/fonts/LICENCE b/fonts/LICENCE
new file mode 100644
index 00000000..78c22912
--- /dev/null
+++ b/fonts/LICENCE
@@ -0,0 +1,73 @@
+FONT LICENCE
+
+This applies only to those fonts that are copyright Bigelow & Holmes.
+
+You MAY NOT:
+
+- make an ADAPTATION of files that are copyright Bigelow & Holmes found in the directory
+``/font'' and its various subdirectories (``FONT SOFTWARE'').
+- distribute FONT SOFTWARE except as part of a larger software distribution
+incorporating the Inferno system software (and any adaptations of it YOU may make)
+provided that the distribution includes minimum sub-licence terms as specified below.
+
+The FONT SOFTWARE includes Fonts and Typefaces that are licensed from
+Bigelow & Holmes Inc ("B&H"). YOU must include the following licence
+terms when distributing the Fonts or Typefaces to any sublicensee and
+impose the same restrictions on them in respect of any sublicence that
+they may grant.
+
+1. Licence and Title
+This FONT LICENCE conveys a limited right to use, reproduce and
+distribute the Fonts and Typefaces in accordance with the terms and
+conditions in this FONT LICENCE and the Inferno Binary and Limited
+Source Licence Agreement but does not convey title or any other
+licences or rights which are not expressly provided relating to the
+Typefaces or Fonts to YOU, sublicensees or any other end users. YOU
+acknowledge and agree that B&H owns all proprietary rights including
+without limitation all intellectual property rights in the Typefaces
+and Fonts and derivative works.
+
+2. B&H Trade Mark Ownership
+YOU acknowledge that B&H owns the entire right, title and interest in
+the trade marks "Lucida and Bigelow & Holmes".
+
+3. Notices
+3.1 YOU agree that all advertising, promotion, marketing and
+distribution in connection with this FONT LICENCE shall acknowledge
+and use the trade marks of B&H in such a way as to protect such trade
+marks. 3.2 YOU may not identify the Typefaces and Fonts by any trade
+mark or trade name other than "Lucida". If YOU make any reference to
+any of the Typefaces or Fonts in sales literature, advertising,
+manuals and documentation, on equipment, visual displays, printed
+output and image carrier labels and outer containers, such references
+shall include the "Lucida" trade marks together with (i) the symbol ®
+and (ii) the phrase
+
+"Lucida is a registered trade mark of Bigelow & Holmes Inc". 3.3 YOU
+shall publish notices of B&H copyright and/or design patent rights on
+the Image Carrier labels and diskette, tape or cartridge containers in
+which the Typefaces and Fonts are packaged separately from the
+LICENSED SOFTWARE, and in the header of files containing Typefaces or
+Fonts. Such notices shall be inthe following form; "Lucida and
+Pellucida are registered trademarks of Bigelow & Holmes Inc. Lucida®
+digital fonts copyright © 1985, 1986 by Bigelow & Holmes Inc".
+
+4. B&H Rights in the Typeface Designs
+4.1 YOU shall produce machine readable Raster Fonts only from Fonts provided by B&H.
+4.2 YOU may not modify the Fonts or Typefaces represented by the Fonts
+in Style (ie. the combination of typographic design characteristics
+that distinguish one typeface from another), design features or in any
+other respect, nor add additional characters without the prior written
+consent of B&H.
+4.3 YOU may permit the LICENSED SOFTWARE to make automatic
+modifications of any Typeface or Font including scaling, rotating,
+condensation, extension, obliquing, reversal, tinting, shadowing,
+outlining, or other transformations which LICENSED SOFTWARE can
+perform automatically.
+
+5. Protection Against Unauthorised Reproduction
+5.1 YOU shall use due care in protecting the Typeface and Font digital
+data YOU received against unauthorised use or reproduction.
+5.2 YOU shall notify VITA NUOVA promptly in writing of any known or
+suspected unauthorised reproduction, use or distribution of the Fonts
+or Typefaces by Sublicensees, end users or others.
diff --git a/fonts/README.FONTS b/fonts/README.FONTS
deleted file mode 100644
index 5da5d979..00000000
--- a/fonts/README.FONTS
+++ /dev/null
@@ -1,2 +0,0 @@
-Most of the fonts must be obtained initially from the primary Inferno
-distribution, because they are distributed under licence and are not Free.
diff --git a/include/interp.h b/include/interp.h
index e0571de1..ab417ae5 100644
--- a/include/interp.h
+++ b/include/interp.h
@@ -300,12 +300,13 @@ struct Modlink
Modl links[1];
};
+/* must be a multiple of 8 bytes */
struct Heap
{
int color; /* Allocation color */
ulong ref;
Type* t;
- ulong pad; /* ensure double alignment; also used for heap profiling */
+ ulong hprof; /* heap profiling */
};
struct Atidle
diff --git a/include/version.h b/include/version.h
index fe74f0b0..6c9695ad 100644
--- a/include/version.h
+++ b/include/version.h
@@ -1 +1 @@
-#define VERSION "Fourth Edition (20060303)"
+#define VERSION "Fourth Edition (20061219)"
diff --git a/lib/games/fortunes b/lib/games/fortunes
index e69de29b..9b41dac0 100644
--- a/lib/games/fortunes
+++ b/lib/games/fortunes
@@ -0,0 +1,8 @@
+We are all interested in the future, for that is where you and I are going to spend the rest of our lives. --Criswell, Plan 9 from Outer Space
+And remember my friend, future events such as these will affect you in the future. --Criswell, Plan 9 from Outer Space
+We should all be concerned about the future because we will have to spend the rest of our lives there. --Charles F Kettering
+For I dipped into the future far as human eye could see. Saw the vision of the world and all the wonder that would be. --Locksley Hall, Alfred, Lord Tennyson
+Excess on occasion is exhilarating. It prevents moderation from acquiring the deadening effect of a habit. -- W Somerset Maugham
+The instruction at "0x77fcae88" referenced memory at "0x63610073". The memory could not be "read".
+A company formed ``for carrying on an undertaking of great advantage, but nobody to know what it is.'' --Charles Mackay, ``Memoirs of Extraordinary Popular Delusions and the Madness of Crowds''
+You should be glad that bridge fell down — I was planning to build 13 more to the same design. -- Remark attributed to I K Brunel, addressing the Directors of the Great Western Railway.
diff --git a/lib/games/fortunes.index b/lib/games/fortunes.index
index e69de29b..e54e0af8 100644
--- a/lib/games/fortunes.index
+++ b/lib/games/fortunes.index
Binary files differ
diff --git a/lib/proto/FreeBSD b/lib/proto/FreeBSD
index 4bc67beb..8fb07d0e 100644
--- a/lib/proto/FreeBSD
+++ b/lib/proto/FreeBSD
@@ -1,7 +1,7 @@
FreeBSD
386
bin
- emu.new 0775 inferno inf /FreeBSD/386/bin/emu
+ emu.new 0775 inferno inferno /FreeBSD/386/bin/emu
asm
iar
data2c
@@ -11,6 +11,7 @@ FreeBSD
limbo
mk
+ mkext
ndate
inm
yacc
diff --git a/lib/proto/Hp b/lib/proto/Hp
index 4b328a3c..27e6560a 100644
--- a/lib/proto/Hp
+++ b/lib/proto/Hp
@@ -1,7 +1,7 @@
Hp
s800
bin
- emu.new 0775 inferno inf /Linux/386/bin/emu
+ emu.new 0775 inferno inferno /Linux/386/bin/emu
0a
0c
0l
diff --git a/lib/proto/Irix b/lib/proto/Irix
index 074c3b08..4f991c48 100644
--- a/lib/proto/Irix
+++ b/lib/proto/Irix
@@ -1,7 +1,7 @@
Irix
mips
bin
- emu.new 0775 inferno inf /Irix/mips/bin/emu
+ emu.new 0775 inferno inferno /Irix/mips/bin/emu
0a
0c
0l
diff --git a/lib/proto/Linux b/lib/proto/Linux
index a6ac4b8b..c2344974 100644
--- a/lib/proto/Linux
+++ b/lib/proto/Linux
@@ -1,7 +1,7 @@
Linux
386
bin
- emu.new 0775 inferno inf /Linux/386/bin/emu
+ emu.new 0775 inferno inferno /Linux/386/bin/emu
asm
iar
data2c
@@ -11,8 +11,14 @@ Linux
limbo
mk
+ mkext
ndate
yacc
include
+
lib
+ arm
+ bin
+ include
+ +
+ lib
diff --git a/lib/proto/MacOSX b/lib/proto/MacOSX
index 920deb23..5162298d 100644
--- a/lib/proto/MacOSX
+++ b/lib/proto/MacOSX
@@ -2,7 +2,7 @@ MacOSX
README
power
bin
- emu.new 0775 inferno inf /MacOSX/power/bin/emu
+ emu.new 0775 inferno inferno /MacOSX/power/bin/emu
asm
iar
data2c
@@ -12,6 +12,7 @@ MacOSX
limbo
mk
+ mkext
ms2
ndate
inm
@@ -22,3 +23,25 @@ MacOSX
+
lib
tcshrc
+ 386
+ bin
+ emu.new 0775 inferno inferno /MacOSX/386/bin/emu
+ asm
+ iar
+ data2c
+ data2s
+ ksize
+ kstrip
+
+ limbo
+ mk
+ mkext
+ ms2
+ ndate
+ inm
+ sqz
+ srclist
+ yacc
+ include
+ +
+ lib
diff --git a/lib/proto/Nt b/lib/proto/Nt
index 03097920..03a7b101 100644
--- a/lib/proto/Nt
+++ b/lib/proto/Nt
@@ -1,7 +1,7 @@
Nt
386
bin
- emu.new 0775 inferno inf /Nt/386/bin/emu.exe
+ emu.new 0775 inferno inferno /Nt/386/bin/emu.exe
ie.exe
0a.exe
0c.exe
diff --git a/lib/proto/Plan9 b/lib/proto/Plan9
index fb421bb9..7fd8ae74 100644
--- a/lib/proto/Plan9
+++ b/lib/proto/Plan9
@@ -1,7 +1,7 @@
Plan9
386
bin
- emu.new 775 inferno inf /Plan9/386/bin/emu
+ emu.new 775 inferno inferno /Plan9/386/bin/emu
5a
5c
5l
diff --git a/lib/proto/Solaris b/lib/proto/Solaris
index 3d7a14ed..24d0f8ba 100644
--- a/lib/proto/Solaris
+++ b/lib/proto/Solaris
@@ -1,7 +1,7 @@
Solaris
sparc
bin
- emu.new 0775 inferno inf /Solaris/sparc/bin/emu
+ emu.new 0775 inferno inferno /Solaris/sparc/bin/emu
0a
0c
0l
diff --git a/lib/proto/inferno b/lib/proto/inferno
index e11dfd0b..2dff9d00 100644
--- a/lib/proto/inferno
+++ b/lib/proto/inferno
@@ -339,6 +339,7 @@ appl
9export.b
9srvfs.b
B.b
+ ar.b
archfs.b
auplay.b
auth
@@ -390,6 +391,7 @@ appl
cal.b
cat.b
cd.b
+ cddb.b
chgrp.b
chmod.b
cleanname.b
@@ -593,10 +595,10 @@ appl
lockfs.b
logfile.b
look.b
- lookman.b
ls.b
lstar.b
man.b
+ man2html.b
man2txt.b
manufacture.b
mash
@@ -708,7 +710,6 @@ appl
test.b
tk.b
sha1sum.b
- shutdown.b
sleep.b
sort.b
spki
@@ -894,6 +895,7 @@ appl
ssl3.b
sslsession.b
x509.b
+ csv.b
daytime.b
db.b
dbm.b
@@ -993,6 +995,7 @@ appl
regex.b
regexutils.b
registries.b
+ rfc822.b
riff.b
secstore.b
scoretable.b
@@ -1062,6 +1065,7 @@ appl
w3c
css.b
mkfile
+ uris.b
xpointers.b
wait.b
watchvars.b
@@ -1387,6 +1391,7 @@ dis
9export.dis
9srvfs.dis
9win.dis
+ ar.dis
archfs.dis
B.dis
acme
@@ -1408,6 +1413,7 @@ dis
cal.dis
cat.dis
cd.dis
+ cddb.dis
charon
+
charon.dis
@@ -1497,6 +1503,7 @@ dis
crc.dis
crypt
+
+ csv.dis
daytime.dis
db.dis
dbm.dis
@@ -1578,6 +1585,7 @@ dis
regex.dis
regexutils.dis
registries.dis
+ rfc822.dis
riff.dis
secstore.dis
scoretable.dis
@@ -1647,10 +1655,11 @@ dis
lockfs.dis
logfile.dis
look.dis
- lookman.dis
+ lookman
ls.dis
lstar.dis
man.dis
+ man2html.dis
man2txt.dis
mash.dis
math
@@ -1708,7 +1717,7 @@ dis
+
sh.dis
sha1sum.dis
- shutdown.dis
+ shutdown
sleep.dis
sort.dis
spki
@@ -1881,6 +1890,9 @@ lib
lego
*
mashinit
+ mimetype
+ mk
+ *
ndb
common
dns 664 inferno inferno /lib/ndb/dns.dist
@@ -2050,6 +2062,7 @@ module
convcs.m
crc.m
css.m
+ csv.m
cvsimages.m
daytime.m
db.m
@@ -2094,6 +2107,7 @@ module
srvbrowse.m
hash.m
html.m
+ ida.m
imagefile.m
inflate.m
ip.m
@@ -2135,6 +2149,7 @@ module
regex.m
regexutils.m
registries.m
+ rfc822.m
riff.m
runt.m
scoretable.m
@@ -2173,6 +2188,7 @@ module
translate.m
ubfa.m
unbundle.m
+ uris.m
url.m
usb.m
venti.m
diff --git a/lib/proto/utils b/lib/proto/utils
index 380464a0..9decb6b6 100644
--- a/lib/proto/utils
+++ b/lib/proto/utils
@@ -39,7 +39,9 @@ lib9
getcallerpc-Hp-s800.s
getcallerpc-Irix-mips.s
getcallerpc-Linux-386.S
+ getcallerpc-Linux-arm.S
getcallerpc-MacOSX-power.s
+ getcallerpc-MacOSX-386.s
getcallerpc-Solaris-386.s
getcallerpc-Solaris-sparc.s
getcallerpc-Unixware-386.s
@@ -399,6 +401,9 @@ utils
cp
cp.c
mkfile
+ cvbit
+ cvbit.c
+ mkfile
data2c
data2c.c
mkfile
diff --git a/lib9/getcallerpc-Linux-386.S b/lib9/getcallerpc-Linux-386.S
index 71b58781..ae817758 100644
--- a/lib9/getcallerpc-Linux-386.S
+++ b/lib9/getcallerpc-Linux-386.S
@@ -1,5 +1,4 @@
.file "getcallerpc-Linux-386.S"
- .text
.type getcallerpc,@function
.global getcallerpc
getcallerpc:
diff --git a/lib9/utfecpy.c b/lib9/utfecpy.c
index 8ccb841c..3a5e6b4c 100644
--- a/lib9/utfecpy.c
+++ b/lib9/utfecpy.c
@@ -9,7 +9,7 @@ utfecpy(char *to, char *e, char *from)
return to;
end = memccpy(to, from, '\0', e - to);
if(end == nil){
- end = e-1;
+ end = e;
while(end>to && (*--end&0xC0)==0x80)
;
*end = '\0';
diff --git a/libinterp/ipint.c b/libinterp/ipint.c
index 61c577fa..b7cb8af2 100644
--- a/libinterp/ipint.c
+++ b/libinterp/ipint.c
@@ -490,6 +490,163 @@ IPint_shr(void *fp)
*f->ret = newIPint(ret);
}
+static void
+mpand(mpint *b, mpint *m, mpint *res)
+{
+ int i;
+
+ res->sign = b->sign;
+ if(b->top == 0 || m->top == 0){
+ res->top = 0;
+ return;
+ }
+ mpbits(res, b->top*Dbits);
+ res->top = b->top;
+ for(i = b->top; --i >= 0;){
+ if(i < m->top)
+ res->p[i] = b->p[i] & m->p[i];
+ else
+ res->p[i] = 0;
+ }
+ mpnorm(res);
+}
+
+static void
+mpor(mpint *b1, mpint *b2, mpint *res)
+{
+ mpint *t;
+ int i;
+
+ if(b2->top > b1->top){
+ t = b1;
+ b1 = b2;
+ b2 = t;
+ }
+ if(b1->top == 0){
+ mpassign(b2, res);
+ return;
+ }
+ if(b2->top == 0){
+ mpassign(b1, res);
+ return;
+ }
+ mpassign(b1, res);
+ for(i = b2->top; --i >= 0;)
+ res->p[i] |= b2->p[i];
+ mpnorm(res);
+}
+
+static void
+mpxor(mpint *b1, mpint *b2, mpint *res)
+{
+ mpint *t;
+ int i;
+
+ if(b2->top > b1->top){
+ t = b1;
+ b1 = b2;
+ b2 = t;
+ }
+ if(b1->top == 0){
+ mpassign(b2, res);
+ return;
+ }
+ if(b2->top == 0){
+ mpassign(b1, res);
+ return;
+ }
+ mpassign(b1, res);
+ for(i = b2->top; --i >= 0;)
+ res->p[i] ^= b2->p[i];
+ mpnorm(res);
+}
+
+static void
+mpnot(mpint *b1, mpint *res)
+{
+ int i;
+
+ mpbits(res, Dbits*b1->top);
+ res->sign = 1;
+ res->top = b1->top;
+ for(i = res->top; --i >= 0;)
+ res->p[i] = ~b1->p[i];
+ mpnorm(res);
+}
+
+/* bits */
+void
+IPint_and(void *fp)
+{
+ F_IPint_and *f;
+ BigInt ret;
+
+ f = fp;
+ destroy(*f->ret);
+ *f->ret = H;
+
+ if(f->i1 == H || f->i2 == H)
+ error(exNilref);
+ ret = mpnew(0);
+ if(ret != nil)
+ mpand(MP(f->i1), MP(f->i2), ret);
+ *f->ret = newIPint(ret);
+}
+
+void
+IPint_ori(void *fp)
+{
+ F_IPint_ori *f;
+ BigInt ret;
+
+ f = fp;
+ destroy(*f->ret);
+ *f->ret = H;
+
+ if(f->i1 == H || f->i2 == H)
+ error(exNilref);
+ ret = mpnew(0);
+ if(ret != nil)
+ mpor(MP(f->i1), MP(f->i2), ret);
+ *f->ret = newIPint(ret);
+}
+
+void
+IPint_xor(void *fp)
+{
+ F_IPint_xor *f;
+ BigInt ret;
+
+ f = fp;
+ destroy(*f->ret);
+ *f->ret = H;
+
+ if(f->i1 == H || f->i2 == H)
+ error(exNilref);
+ ret = mpnew(0);
+ if(ret != nil)
+ mpxor(MP(f->i1), MP(f->i2), ret);
+ *f->ret = newIPint(ret);
+}
+
+void
+IPint_not(void *fp)
+{
+ F_IPint_not *f;
+ BigInt ret;
+
+ f = fp;
+ destroy(*f->ret);
+ *f->ret = H;
+
+ if(f->i1 == H)
+ error(exNilref);
+ ret = mpnew(0);
+ if(ret != nil)
+ mpnot(MP(f->i1), ret);
+ *f->ret = newIPint(ret);
+}
+
/*
* return a random number between a and b
*/
diff --git a/libinterp/keyring.h b/libinterp/keyring.h
index f62ac800..0bea5171 100644
--- a/libinterp/keyring.h
+++ b/libinterp/keyring.h
@@ -3,6 +3,7 @@ Runtab Keyringmodtab[]={
"IPint.add",0xa47c1b24,IPint_add,40,2,{0x0,0xc0,},
"aescbc",0xac616ba,Keyring_aescbc,48,2,{0x0,0xc0,},
"aessetup",0x44452583,Keyring_aessetup,40,2,{0x0,0xc0,},
+ "IPint.and",0xa47c1b24,IPint_and,40,2,{0x0,0xc0,},
"auth",0x9c576bb,Keyring_auth,48,2,{0x0,0xc0,},
"IPint.b64toip",0xa803ee03,IPint_b64toip,40,2,{0x0,0x80,},
"IPint.bebytestoip",0x6fa90725,IPint_bebytestoip,40,2,{0x0,0x80,},
@@ -41,6 +42,8 @@ Runtab Keyringmodtab[]={
"md5",0x7656377,Keyring_md5,48,2,{0x0,0xb0,},
"IPint.mul",0xa47c1b24,IPint_mul,40,2,{0x0,0xc0,},
"IPint.neg",0x491fbd11,IPint_neg,40,2,{0x0,0x80,},
+ "IPint.not",0x491fbd11,IPint_not,40,2,{0x0,0x80,},
+ "IPint.ori",0xa47c1b24,IPint_ori,40,2,{0x0,0xc0,},
"pktoattr",0xfb4e61ba,Keyring_pktoattr,40,2,{0x0,0x80,},
"pktostr",0xfb4e61ba,Keyring_pktostr,40,2,{0x0,0x80,},
"putbytearray",0x7cfef557,Keyring_putbytearray,48,2,{0x0,0xc0,},
@@ -70,6 +73,7 @@ Runtab Keyringmodtab[]={
"verify",0x8b5b9f76,Keyring_verify,48,2,{0x0,0xe0,},
"verifym",0x8b5b9f76,Keyring_verifym,48,2,{0x0,0xe0,},
"writeauthinfo",0x5ba03002,Keyring_writeauthinfo,40,2,{0x0,0xc0,},
+ "IPint.xor",0xa47c1b24,IPint_xor,40,2,{0x0,0xc0,},
0
};
-#define Keyringmodlen 70
+#define Keyringmodlen 74
diff --git a/libinterp/runt.h b/libinterp/runt.h
index f7577f6a..e6e30924 100644
--- a/libinterp/runt.h
+++ b/libinterp/runt.h
@@ -3076,6 +3076,16 @@ struct F_Keyring_aessetup
Array* key;
Array* ivec;
};
+void IPint_and(void*);
+typedef struct F_IPint_and F_IPint_and;
+struct F_IPint_and
+{
+ WORD regs[NREG-1];
+ Keyring_IPint** ret;
+ uchar temps[12];
+ Keyring_IPint* i1;
+ Keyring_IPint* i2;
+};
void Keyring_auth(void*);
typedef struct F_Keyring_auth F_Keyring_auth;
struct F_Keyring_auth
@@ -3459,6 +3469,25 @@ struct F_IPint_neg
uchar temps[12];
Keyring_IPint* i;
};
+void IPint_not(void*);
+typedef struct F_IPint_not F_IPint_not;
+struct F_IPint_not
+{
+ WORD regs[NREG-1];
+ Keyring_IPint** ret;
+ uchar temps[12];
+ Keyring_IPint* i1;
+};
+void IPint_ori(void*);
+typedef struct F_IPint_ori F_IPint_ori;
+struct F_IPint_ori
+{
+ WORD regs[NREG-1];
+ Keyring_IPint** ret;
+ uchar temps[12];
+ Keyring_IPint* i1;
+ Keyring_IPint* i2;
+};
void Keyring_pktoattr(void*);
typedef struct F_Keyring_pktoattr F_Keyring_pktoattr;
struct F_Keyring_pktoattr
@@ -3749,6 +3778,16 @@ struct F_Keyring_writeauthinfo
String* filename;
Keyring_Authinfo* info;
};
+void IPint_xor(void*);
+typedef struct F_IPint_xor F_IPint_xor;
+struct F_IPint_xor
+{
+ WORD regs[NREG-1];
+ Keyring_IPint** ret;
+ uchar temps[12];
+ Keyring_IPint* i1;
+ Keyring_IPint* i2;
+};
#define Keyring_PATH "$Keyring"
#define Keyring_Encrypt 0
#define Keyring_Decrypt 1
diff --git a/libkern/utfecpy.c b/libkern/utfecpy.c
index 8ccb841c..3a5e6b4c 100644
--- a/libkern/utfecpy.c
+++ b/libkern/utfecpy.c
@@ -9,7 +9,7 @@ utfecpy(char *to, char *e, char *from)
return to;
end = memccpy(to, from, '\0', e - to);
if(end == nil){
- end = e-1;
+ end = e;
while(end>to && (*--end&0xC0)==0x80)
;
*end = '\0';
diff --git a/liblogfs/NOTICE b/liblogfs/NOTICE
index 3fbc79b8..022b8246 100644
--- a/liblogfs/NOTICE
+++ b/liblogfs/NOTICE
@@ -1,25 +1,5 @@
-This copyright NOTICE applies to all files in this directory and
-subdirectories, unless another copyright notice appears in a given
-file or subdirectory. If you take substantial code from this software to use in
-other programs, you must somehow include with it an appropriate
-copyright notice that includes the copyright notice and the other
-notices below. It is fine (and often tidier) to do that in a separate
-file such as NOTICE, LICENCE or COPYING.
+Developed 2002, 2003 by Vita Nuova Holdings Limited.
+Copyright © 2002, 2003 Vita Nuova Holdings Limited.
-Copyright © 1995-1999 Lucent Technologies Inc.
-Portions Copyright © 1997-2000 Vita Nuova Limited
-Portions Copyright © 2000-2005 Vita Nuova Holdings Limited
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+The source and binary code for liblogfs may be used only as part of Inferno,
+unless otherwise agreed with Vita Nuova.
diff --git a/libmath/FPcontrol-MacOSX.c b/libmath/FPcontrol-MacOSX.c
index e36a5e5b..9647ac18 100644
--- a/libmath/FPcontrol-MacOSX.c
+++ b/libmath/FPcontrol-MacOSX.c
@@ -2,21 +2,7 @@
#include "fpuctl.h"
#include "mathi.h"
-#include<stdio.h>
-
-void PPC_PrintFPSCR()
-{
- ppc_fp_scr_t fpscr;
-
- fpscr = get_fp_scr();
- fprintf(stderr, "FPSCR = 0x%08x : 0x%08x\n",
- ((unsigned int *)&fpscr)[0],
- ((unsigned int *)&fpscr)[1]);
- fprintf(stderr, "FPSCR[ve] = %d\n", fpscr.ve);
- fprintf(stderr, "FPSCR[ze] = %d\n", fpscr.ze);
- fprintf(stderr, "FPSCR[ue] = %d\n", fpscr.ue);
- fprintf(stderr, "FPSCR[oe] = %d\n", fpscr.oe);
-}
+#include <stdio.h>
void
FPinit(void)
diff --git a/libmemdraw/draw.c b/libmemdraw/draw.c
index f70d4537..8fe88bce 100644
--- a/libmemdraw/draw.c
+++ b/libmemdraw/draw.c
@@ -2390,7 +2390,7 @@ DBG print("bsh %d\n", bsh);
bx = -bsh-1;
ex = -bsh-1-dx;
- SET(bits);
+ bits = 0;
v = par->sdval;
/* make little endian */
diff --git a/libmp/port/mptouv.c b/libmp/port/mptouv.c
index 1efdff95..cc04b029 100644
--- a/libmp/port/mptouv.c
+++ b/libmp/port/mptouv.c
@@ -43,7 +43,7 @@ mptouv(mpint *b)
v = 0;
for(s = 0; s < b->top; s++)
- v |= b->p[s]<<(s*sizeof(mpdigit)*8);
+ v |= (uvlong)b->p[s]<<(s*sizeof(mpdigit)*8);
return v;
}
diff --git a/libtk/textu.c b/libtk/textu.c
index 854dc8d5..28642130 100644
--- a/libtk/textu.c
+++ b/libtk/textu.c
@@ -618,7 +618,7 @@ tktbbox(Tk *tk, TkTindex *ix)
r.min.x = 0;
r.min.y = 0;
r.max.x = 0;
- r.max.x = 0;
+ r.max.y = 0;
return r;
}
diff --git a/libtk/textw.c b/libtk/textw.c
index bf560d9f..f17c9edb 100644
--- a/libtk/textw.c
+++ b/libtk/textw.c
@@ -113,10 +113,10 @@ static TkEbind tktbinds[] = {
{TkKey|CNTL('p'), "%W tkTextSetCursor {insert-1l}"},
{TkKey|Up, "%W tkTextSetCursor {insert-1l}"},
{TkKey|CNTL('u'), "%W tkTextDelIns -l"},
- {TkKey|CNTL('v'), "%W yview scroll 1 page"},
- {TkKey|Pgdown, "%W yview scroll 1 page"},
+ {TkKey|CNTL('v'), "%W yview scroll 0.75 page"},
+ {TkKey|Pgdown, "%W yview scroll 0.75 page"},
{TkKey|CNTL('w'), "%W tkTextDelIns -w"},
- {TkKey|Pgup, "%W yview scroll -1 page"},
+ {TkKey|Pgup, "%W yview scroll -0.75 page"},
{TkFocusout, "%W tkTextCursor delete"},
{TkKey|APP|'\t', ""},
{TkKey|BackTab, ""},
@@ -1799,8 +1799,9 @@ tktview(Tk *tk, char *arg, char **val, int nl, int *posn, int max, int orient)
}
else
if(strcmp(buf, "scroll") == 0) {
- arg = tkword(tk->env->top, arg, buf, buf+sizeof(buf), nil);
- amount = atoi(buf);
+ e = tkfracword(tk->env->top, &arg, &amount, nil);
+ if(e != nil)
+ return e;
arg = tkskip(arg, " \t");
if(*arg == 'p') /* Pages */
amount *= nl;
@@ -1811,6 +1812,7 @@ tktview(Tk *tk, char *arg, char **val, int nl, int *posn, int max, int orient)
}
else
amount *= tk->env->wzero;
+ amount = TKF2I(amount);
n = *posn + amount;
if(n < 0)
n = 0;
diff --git a/libtk/tindx.c b/libtk/tindx.c
index 8eeffc69..dd0807bf 100644
--- a/libtk/tindx.c
+++ b/libtk/tindx.c
@@ -517,7 +517,8 @@ tktindcompare(TkText *tkt, TkTindex *i1, int op, TkTindex *i2)
ans = !eq && tktindbefore(i2, i1);
break;
default:
- SET(ans);
+ ans = 0; /* not reached */
+ break;
};
return ans;
diff --git a/libtk/utils.c b/libtk/utils.c
index 4e86e40c..635bef9a 100644
--- a/libtk/utils.c
+++ b/libtk/utils.c
@@ -310,6 +310,7 @@ tkrgbashade(ulong rgba, int shade)
return rgba;
tkrgbavals(rgba, &R, &G, &B, &A);
+ h = s = v = 0;
rgb2hsv(R, G, B, &h, &s, &v);
if (v < MINDELTA) {
diff --git a/libtk/windw.c b/libtk/windw.c
index 4c9e608c..6f9fd78d 100644
--- a/libtk/windw.c
+++ b/libtk/windw.c
@@ -137,6 +137,7 @@ tkinwindow(Tk *tk, Point p, int descend)
if (descend && tkmethod[tk->type]->inwindow != nil)
f = tkmethod[tk->type]->inwindow(tk, &p);
else {
+ q = p;
for (f = tk->slave; f; f = f->next) {
q.x = p.x - (f->act.x + f->borderwidth);
q.y = p.y - (f->act.y + f->borderwidth);
diff --git a/limbo/com.c b/limbo/com.c
index d10f3775..1bc070a4 100644
--- a/limbo/com.c
+++ b/limbo/com.c
@@ -1211,7 +1211,7 @@ rewritecomm(Node *n, Node *comm, Node *tmp, Node *slot)
}
}
if(n->right == comm && n->op == Oas && comm->op == Orcv
- && sumark(n->left)->addable < Rcant)
+ && sumark(n->left)->addable < Rcant && (n->left->op != Oname || n->left->decl != nildecl))
adr = n->left;
if(adr != nil){
p = genrawop(&comm->left->src, ILEA, adr, nil, slot);
diff --git a/limbo/decls.c b/limbo/decls.c
index 4edab461..222a1301 100644
--- a/limbo/decls.c
+++ b/limbo/decls.c
@@ -933,7 +933,7 @@ declconv(Fmt *f)
d = va_arg(f->args, Decl*);
if(d->sym == nil)
- s = "<???>";
+ s = "<nil>";
else
s = d->sym->name;
seprint(buf, buf+sizeof(buf), "%s %s", storename[d->store], s);
diff --git a/limbo/ecom.c b/limbo/ecom.c
index e19b51c0..2dfa2f68 100644
--- a/limbo/ecom.c
+++ b/limbo/ecom.c
@@ -657,7 +657,7 @@ sumark(Node *n)
if(n->flags & FNPTR){
if(n->flags == FNPTR2)
n->addable = Roff;
- else if(n->flags == FNPTR2|FNPTRN)
+ else if(n->flags == (FNPTR2|FNPTRN))
n->addable = Rnoff;
}
else
@@ -1793,7 +1793,7 @@ arraycom(Node *a, Node *elems)
{
Node tindex, fake, tmp, ri, *e, *n, *q, *body, *wild;
Inst *top, *out;
- Case *c;
+ /* Case *c; */
if(debug['A'])
print("arraycom: %n %n\n", a, elems);
diff --git a/limbo/lex.c b/limbo/lex.c
index bbd6cb69..749f2a7a 100644
--- a/limbo/lex.c
+++ b/limbo/lex.c
@@ -61,6 +61,7 @@ static Keywd keywords[] =
"continue", Lcont,
"cyclic", Lcyclic,
"do", Ldo,
+ "dynamic", Ldynamic,
"else", Lelse,
"exception", Lexcept,
"exit", Lexit,
diff --git a/limbo/limbo.y b/limbo/limbo.y
index 7098cd5d..8ccea1ef 100644
--- a/limbo/limbo.y
+++ b/limbo/limbo.y
@@ -68,6 +68,7 @@
Ldo Lwhile Lfor Lbreak
Lalt Lcase Lpick Lcont
Lreturn Lexit Lspawn Lraise Lfix
+ Ldynamic
%%
prog : Limplement ids ';'
{
diff --git a/limbo/optim.c b/limbo/optim.c
index a3ccdec3..c74f1432 100644
--- a/limbo/optim.c
+++ b/limbo/optim.c
@@ -699,7 +699,7 @@ static char*
decname(Decl *d)
{
if(d->sym == nil)
- return "<??>";
+ return "<nil>";
return d->sym->name;
}
diff --git a/limbo/sbl.c b/limbo/sbl.c
index fff80392..0a0bf52c 100644
--- a/limbo/sbl.c
+++ b/limbo/sbl.c
@@ -163,6 +163,7 @@ sblinst(Inst *inst, long ninst)
sblblocks = allocmem(nblocks * sizeof *sblblocks);
for(i = 0; i < nblocks; i++)
sblblocks[i] = -1;
+ src = nosrc;
for(in = inst; in != nil; in = in->next){
if(in->op == INOOP)
continue;
diff --git a/limbo/typecheck.c b/limbo/typecheck.c
index 827aa1e1..0fcfbf4b 100644
--- a/limbo/typecheck.c
+++ b/limbo/typecheck.c
@@ -2406,7 +2406,7 @@ argcompat(Node *n, Decl *f, Node *a)
/*
* fn is Odot(adt, methid)
* pass adt implicitly if needed
- * if not, any side effect of adt will be ingored
+ * if not, any side effect of adt will be ignored
*/
Node*
passimplicit(Node *fn, Node *args)
@@ -2415,12 +2415,12 @@ passimplicit(Node *fn, Node *args)
Type *t;
t = fn->ty;
+ n = fn->left;
if(t->ids == nil || !t->ids->implicit){
- if(hasside(fn->left, 1))
- nwarn(fn, "result of expression %V ignored", fn->left);
+ if(!isfnrefty(t) && hasside(n, 1))
+ nwarn(fn, "result of expression %V ignored", n);
return args;
}
- n = fn->left;
if(n->op == Oname && n->decl->store == Dtype){
nerror(n, "%V is a type and cannot be a self argument", n);
n = mkn(Onothing, nil, nil);
diff --git a/limbo/types.c b/limbo/types.c
index 449b53d7..04115207 100644
--- a/limbo/types.c
+++ b/limbo/types.c
@@ -4403,10 +4403,10 @@ ispow2(double x)
}
static int
-round(double x, int n, int *m)
+fround(double x, int n, int *m)
{
if(n != 31)
- fatal("not 31 in round");
+ fatal("not 31 in fround");
return nf(x, m);
}
@@ -4418,7 +4418,7 @@ fixmul2(double sx, double sy, double sr, int *rp, int *ra)
alpha = (sx*sy)/sr;
n = 31;
- k = round(1/alpha, n, &a);
+ k = fround(1/alpha, n, &a);
*rp = 1-k;
*ra = 0;
return IMULX;
@@ -4432,7 +4432,7 @@ fixdiv2(double sx, double sy, double sr, int *rp, int *ra)
beta = sx/(sy*sr);
n = 31;
- k = round(beta, n, &b);
+ k = fround(beta, n, &b);
*rp = k-1;
*ra = 0;
return IDIVX;
@@ -4449,7 +4449,7 @@ fixmul(double sx, double sy, double sr, int *rp, int *ra)
if(ispow2(alpha))
return fixmul2(sx, sy, sr, rp, ra);
n = 31;
- k = round(1/alpha, n, &a);
+ k = fround(1/alpha, n, &a);
m = n-k;
if(m < -n-1)
return IMOVW; /* result is zero whatever the values */
@@ -4480,7 +4480,7 @@ fixdiv(double sx, double sy, double sr, int *rp, int *ra)
if(ispow2(beta))
return fixdiv2(sx, sy, sr, rp, ra);
n = 31;
- k = round(beta, n, &b);
+ k = fround(beta, n, &b);
m = k-n;
if(m <= -2*n)
return IMOVW; /* result is zero whatever the values */
diff --git a/man/1/INDEX b/man/1/INDEX
index 3c7c3d90..58815344 100644
--- a/man/1/INDEX
+++ b/man/1/INDEX
@@ -10,6 +10,7 @@ alphabet-grid alphabet-grid
grid alphabet-grid
alphabet-main alphabet-main
main alphabet-main
+ar ar
asm asm
disdump asm
auhdr auplay
@@ -103,6 +104,7 @@ look look
ls ls
lookman man
man man
+man2html man
man2txt man
wm/man man
mash mash
diff --git a/man/1/ar b/man/1/ar
new file mode 100644
index 00000000..fcd68f98
--- /dev/null
+++ b/man/1/ar
@@ -0,0 +1,163 @@
+.TH AR 1
+.SH NAME
+ar \- archive maintainer
+.SH SYNOPSIS
+.B ar
+.I key
+[
+.I posname
+]
+.I afile
+[
+.I file ...
+]
+.SH DESCRIPTION
+.I Ar
+maintains groups of files
+combined into a single archive file,
+.IR afile .
+The main use of
+.I ar
+is to produce and manipulate UNIX archive files, for instance to create
+program packages for Debian Linux.
+Note that only
+.IR iar (10.1)
+can manage archives used as object file libraries by the Inferno and Plan 9 loaders.
+.PP
+.I Key
+is one character from the set
+.BR drqtpmx ,
+optionally concatenated with
+one or more of
+.BR vuaibclo .
+The
+.I files
+are constituents of the archive
+.IR afile .
+The meanings of the
+.I key
+characters are:
+.TP
+.B d
+Delete
+.I files
+from the archive file.
+.TP
+.B r
+Replace
+.I files
+in the archive file, or add them if missing.
+Optional modifiers are
+.RS
+.PD0
+.TP
+.B u
+Replace only files with
+modified dates later than that of
+the archive.
+.TP
+.B a
+Place new files after
+.I posname
+in the archive rather than at the end.
+.TP
+.BR b " or " i
+Place new files before
+.I posname
+in the archive.
+.RE
+.PD
+.TP
+.B q
+Quick. Append
+.I files
+to the end of the archive without checking for duplicates.
+Avoids quadratic behavior in
+.LR "for (i in *.v) ar r lib.a $i" .
+.TP
+.B t
+List a table of contents of the archive.
+If names are given, only those files are listed.
+.TP
+.B p
+Print the named files in the archive.
+.TP
+.B m
+Move the named files to the end or elsewhere,
+specified as with
+.LR r .
+.TP
+.B o
+Preserve the access and modification times of files
+extracted with the
+.B x
+command.
+.TP
+.B x
+Extract the named files.
+If no names are given, all files in the archive are
+extracted.
+In neither case does
+.B x
+alter the archive file.
+.TP
+.B v
+Verbose.
+Give a file-by-file
+description of the making of a
+new archive file from the old archive and the constituent files.
+With
+.BR p ,
+precede each file with a name.
+With
+.BR t ,
+give a long listing of all information about the files,
+somewhat like a listing by
+.IR ls (1),
+showing
+.br
+.ns
+.IP
+.B
+ mode uid/gid size date name
+.TP
+.B c
+Create.
+Normally
+.I ar
+will create a new archive when
+.I afile
+does not exist, and give a warning.
+Option
+.B c
+discards any old contents and suppresses the warning.
+.SH EXAMPLE
+.TP
+.L
+ar cr arch.a manifest *.tar.gz
+Replace the contents of
+.L arch.a
+with the
+.B manifest
+file and all the
+.IR gzip (1)'d
+.I tar
+files in the current directory.
+.SH FILES
+.TF /tmp/art.*.*
+.TP
+.B /tmp/art.*.*
+temporaries
+.SH SOURCE
+.B /appl/cmd/ar.b
+.SH "SEE ALSO"
+.IR 2l (10.1),
+.IR iar (10.1),
+.IR ar (10.6)
+.SH BUGS
+If the same file is mentioned twice in an argument list,
+it may be put in the archive twice.
+.br
+The file format used by this command is taken from UNIX, and
+makes some invalid assumptions,
+for instance that user IDs are numeric.
diff --git a/man/1/man b/man/1/man
index abf4d50e..f9138900 100644
--- a/man/1/man
+++ b/man/1/man
@@ -1,6 +1,6 @@
.TH MAN 1
.SH NAME
-man, wm/man, man2txt, lookman \-
+man, wm/man, man2html, man2txt, lookman \-
print or find manual pages
.SH SYNOPSIS
.B man
@@ -21,6 +21,12 @@ print or find manual pages
.B wm/man -f
.I file ...
.br
+.B man2html
+.I file
+[
+.I section
+]
+.br
.B man2txt
[
.B -p
@@ -31,6 +37,9 @@ print or find manual pages
]
.br
.B lookman
+[
+.B -f
+]
.I keyword ...
.SH DESCRIPTION
Both
@@ -72,9 +81,20 @@ some detail is lost in conversion to plain text.
displays the pages in a graphical Wm window, providing a more faithful
reproduction of the intended layout.
.PP
+.I Man2html
+converts
+.B "troff -man"
+macro markup to an approximation in HTML on standard output.
+Only one file is processed at a time.
+It is assumed the input
+.I file
+is a manual page, in the given
+.I section
+(default: 1).
+.PP
.I Man2txt
converts
-.I "troff -man"
+.B "troff -man"
macro markup
to plain text.
Each file is processed separately.
@@ -87,10 +107,27 @@ option to
specifies the page width in characters.
.PP
.I Lookman
-prints the file names of manual pages, from any section, that
+finds the manual pages, in any section, that
contain all of the
.I keywords
-given as arguments.
+given as arguments, and prints
+.I man
+commands and manual references for them, one per line.
+In a
+.IR wm-sh (1)
+window,
+any of the
+.I man
+commands can be selected with mouse button 2 and
+sent
+as a command; a manual reference can simply be
+.IR plumb (1)'d
+using mouse button 3.
+The
+.B -f
+option causes
+.I lookman
+just to list the file names.
.SH FILES
.TF /man/1/INDEX
.TP
@@ -118,7 +155,9 @@ index.
.br
.B /appl/cmd/man2txt.b
.br
-.B /appl/cmd/lookman.b
+.B /dis/lookman
+.IR sh (1)
+script
.br
.B /appl/lib/parseman.b
.SH "SEE ALSO"
diff --git a/man/1/os b/man/1/os
index 7b7f8996..38e8a8ba 100644
--- a/man/1/os
+++ b/man/1/os
@@ -6,6 +6,8 @@ os \- interface to host OS commands (hosted Inferno only)
.br
.B os
[
+.B -b
+] [
.B -m
.I mountpoint
] [
@@ -43,7 +45,10 @@ option causes the command to run in directory
an error results and the command will not run if
.I dir
does not exist or is inaccessible.
-The standard output and standard error of the command are merged on the standard output.
+The standard output and standard error of the command appear on the standard output
+and standard error streams of the
+.I os
+command itself.
.I Os
copies the standard input to the remote command's standard input; redirect
.IR os 's
@@ -56,6 +61,17 @@ terminates when
does, and its exit status reflects the status of
.I cmd
(if available).
+.PP
+If the
+.I os
+command is killed or exits (eg, for lack of input and output),
+the host's own process control operations are used to (attempt to) kill
+.IR cmd ,
+if it is still running.
+The
+.B -b
+(background) option suppresses that behaviour.
+.PP
The
.B -n
option causes
diff --git a/man/1/sh b/man/1/sh
index 951f168a..4dd30d14 100644
--- a/man/1/sh
+++ b/man/1/sh
@@ -588,6 +588,18 @@ for the module.
If a load fails, a
.B bad module
exception is raised.
+The environment variable
+.B $autoload
+can be set to a list of Shell modules that
+each instance of
+.I sh
+should load automatically during its initialisation.
+(More precisely, the modules are loaded
+when a new
+.B Sh->Context
+is created: see
+.IR sh (2)
+for details.)
.HP
.BI unload " path..."
.br
diff --git a/man/1/sh-expr b/man/1/sh-expr
index b640e339..976e6c04 100644
--- a/man/1/sh-expr
+++ b/man/1/sh-expr
@@ -18,23 +18,26 @@ expr, ntest \- shell module for simple arithmetic.
.I num
.br
.SH DESCRIPTION
-.B Expr
+.I Expr
is a loadable module for
.IR sh (1)
that provides support for simple integer arithmetic.
It provides one command,
-.BR ntest ,
+.IR ntest ,
which performs a simple boolean test
on its integer argument, and the
substitution operator
-.BR expr ,
+.IR expr ,
which takes an expression in Reverse Polish
notation, and yields its result.
-.B Ntest
+.PP
+.I Ntest
returns true if its argument
.I num
-is non-zero.
-.B Expr
+is non-zero,
+and false otherwise.
+.PP
+.I Expr
evaluates each
.I arg
in turn; if it is an integer it gets pushed onto
@@ -50,7 +53,7 @@ yields 1, not -1.
Alternative names are given for some operators;
this is to avoid the necessity of quoting operators
that contain
-.I sh
+.IR sh (1)
metacharacters. All operations use 64-bit signed
integers; integers are given in the same form acceptable
to Limbo. The relational operators yield either
@@ -59,10 +62,10 @@ to Limbo. The relational operators yield either
option is given,
.I radix
specifies an output base for numbers yielded by
-.BR expr .
+.IR expr .
Numbers are printed in a form suitable for re-interpretation
by
-.BR expr .
+.IR expr .
.PP
When all its arguments have been evaluated,
.B expr
diff --git a/man/1/sh-std b/man/1/sh-std
index efb650cc..87ed676b 100644
--- a/man/1/sh-std
+++ b/man/1/sh-std
@@ -76,13 +76,6 @@ std, if, while, ~, no, !, apply, getlines, status, pctl, fn, and, or, raise, res
.B subfn
.I name command
.br
-.B if
-[
-.I condition action
-]... [
-.I elseaction
-]
-.br
.B while
.I condition command
.br
diff --git a/man/1/sh-tk b/man/1/sh-tk
index 8777dac7..e45bd9a6 100644
--- a/man/1/sh-tk
+++ b/man/1/sh-tk
@@ -41,6 +41,13 @@ tk, chan, send, recv, alt \- loadable tk module for sh.
]
.B }
.br
+.B ${tk onscreen
+.I winid
+[
+.I how
+]
+.B }
+.br
.B ${tk
.I winid tkcmd
.B }
@@ -128,6 +135,22 @@ the window manager arrive on this channel, and
should be responded to appropriately using
.BR "tk winctl" .
.TP
+.B tk onscreen
+.B Tk onscreen
+must be called to make window
+.I winid
+visible for the first time, the same as
+.I onscreen
+in
+.IR tkclient (2).
+.I How
+is the same as for that call - if given, it must be one of
+.BR place ,
+.BR onscreen
+or
+.BR exact .
+.BR
+.TP
.B tk winctl
.B Tk winctl
is used to communicate requests to the window manager.
@@ -241,6 +264,7 @@ sh
load std tk
pctl newpgrp
wid=${tk window 'My window'}
+tk onscreen $wid
tk $wid update
while {} {tk winctl $wid ${recv $wid}} &
.EE
@@ -252,5 +276,6 @@ while {} {tk winctl $wid ${recv $wid}} &
.IR sh-expr (1),
.IR tkcmd (1),
.IR tk (2),
+.IR tkclient (2),
.IR wmlib (2),
``The Tk Reference Manual''
diff --git a/man/2/INDEX b/man/2/INDEX
index 6c7d8e44..f12f0d3a 100644
--- a/man/2/INDEX
+++ b/man/2/INDEX
@@ -21,6 +21,7 @@ btos convcs
convcs convcs
stob convcs
crc crc
+csv csv
daytime daytime
filet daytime
gmt daytime
@@ -98,9 +99,7 @@ inflate filter-deflate
filter-slip filter-slip
slip filter-slip
format format
-
fsproto fsproto
-fsproto fsproto fsproto
readprotofile fsproto
readprotostring fsproto
geodesy geodesy
@@ -287,6 +286,7 @@ rand rand
readdir readdir
regex regex
registries registries
+rfc822 rfc822
scsi scsiio
scsiio scsiio
secstore secstore
@@ -412,6 +412,7 @@ pctl sys-pctl
sys-pctl sys-pctl
pipe sys-pipe
sys-pipe sys-pipe
+aprint sys-print
fprint sys-print
print sys-print
sprint sys-print
@@ -479,6 +480,8 @@ virgil virgil
volume volume
w3c w3c-css
w3c-css w3c-css
+w3c w3c-uris
+w3c-uris w3c-uris
w3c w3c-xpointers
w3c-xpointers w3c-xpointers
wait wait
diff --git a/man/2/csv b/man/2/csv
new file mode 100644
index 00000000..00b10ffc
--- /dev/null
+++ b/man/2/csv
@@ -0,0 +1,58 @@
+.TH CSV 2
+.SH NAME
+csv \- comma-separated values
+.SH SYNOPSIS
+.EX
+include "bufio.m";
+include "csv.m";
+csv := load CSV CSV->PATH;
+
+init: fn(bufio: Bufio);
+getline: fn(fd: ref Bufio->Iobuf): list of string;
+quote: fn(s: string): string;
+.EE
+.SH DESCRIPTION
+.B CSV
+provides a few functions to help read and write data in ``comma-separated value'' format.
+The
+.I csv
+format has a sequence of fields on a line (terminated by a newline, carriage return,
+or carriage return and newline).
+Fields are separated by commas, and may be empty.
+A field that starts with a double-quote is a quoted field, continuing
+to the next lone double-quote character, including commas and line terminators,
+but taking two double-quotes to represent one double-quote.
+Any text following quoted text, up to the next comma or line terminator, is included
+in the field value.
+Note that in a field that does not start with a double-quote, double-quotes are not treated specially.
+.PP
+.B Init
+must be called before any other operation of the module.
+.I Bufio
+is the instance of the
+.IR bufio (2)
+module that will provide the open files to be read.
+.PP
+.B Getline
+reads a sequence of fields in
+.I csv
+format from
+.B Iobuf
+.IR fd ,
+unquotes fields as required, and returns them in order in a list.
+It returns nil on end-of-file (or read error).
+An empty line is regarded as containing a single empty field.
+.PP
+.B Quote
+returns string
+.I s
+quoted as required by the
+.I csv
+format:
+the result is quoted if
+.I s
+contains comma, newline, or a quote (and all embedded quotes are doubled).
+.SH SOURCE
+.B /appl/lib/csv.b
+.SH SEE ALSO
+.IR sh-csv (1)
diff --git a/man/2/fsproto b/man/2/fsproto
index 9f0c5487..d67368ef 100644
--- a/man/2/fsproto
+++ b/man/2/fsproto
@@ -1,6 +1,5 @@
.TH FSPROTO 2
.SH NAME
-FSproto:
FSproto: readprotofile, readprotostring \- read file system prototype file
.SH SYNOPSIS
.EX
diff --git a/man/2/keyring-ipint b/man/2/keyring-ipint
index 8a47c001..d5c3dd8a 100644
--- a/man/2/keyring-ipint
+++ b/man/2/keyring-ipint
@@ -31,6 +31,10 @@ IPint: adt
cmp: fn(i1: self ref IPint, i2: ref IPint): int;
shl: fn(i: self ref IPint, n: int): ref IPint;
shr: fn(i: self ref IPint, n: int): ref IPint;
+ and: fn(i1: self ref IPint, i2: ref IPint): ref IPint;
+ ior: fn(i1: self ref IPint, i2: ref IPint): ref IPint;
+ not: fn(i: self ref IPint): ref IPint;
+ xor: fn(i1: self ref IPint, i2: ref IPint): ref IPint;
};
.EE
.SH DESCRIPTION
@@ -145,3 +149,28 @@ Returns
.IB i .shr( n )
Returns
.IR i >> n
+.TP
+.IB i1 .and( i2 )
+Returns
+.IR i & n ,
+bitwise AND
+.TP
+.IB i1 .ior( i2 )
+Returns
+.IR i | n ,
+bitwise inclusive-OR
+(it is
+.B ior
+because plain
+.B or
+is a Limbo keyword)
+.TP
+.IB i .not()
+Returns
+.RI ~ i ,
+bitwise ones-complement
+.TP
+.IB i1 .xor( i2 )
+Returns
+.IR i ^ n ,
+bitwise exclusive-OR
diff --git a/man/2/pop3 b/man/2/pop3
index 6288bc2a..938f02c9 100644
--- a/man/2/pop3
+++ b/man/2/pop3
@@ -33,14 +33,9 @@ is
.IR nil ,
.B open
uses
-.BR $POPSERVER ,
-and if that is not defined, it
-uses
-.BR $MAILSERVER ,
-the default mail server, if set up in
-.LR /services/cs/db
-(see
-.IR db (6)).
+.BR $pop3 ,
+which must be defined in
+.IR ndb (6).
The remaining functions assume a successfully opened connection.
.PP
.B Stat
diff --git a/man/2/rfc822 b/man/2/rfc822
new file mode 100644
index 00000000..378d97e5
--- /dev/null
+++ b/man/2/rfc822
@@ -0,0 +1,327 @@
+.TH RFC822 2
+.SH NAME
+rfc822 \- RFC822 mail format helpers
+.SH SYNOPSIS
+.EX
+include "bufio.m";
+include "rfc822.m";
+rfc822 := load RFC822 RFC822->PATH;
+Content, Rfclex: import rfc822;
+
+Word, QString: con ...;
+Maxrequest: con 16*1024; # more than enough for anything sensible
+
+init: fn(b: Bufio);
+
+Rfclex: adt {
+ tok: int;
+ wordval: string;
+
+ mk: fn(a: array of byte): ref Rfclex;
+ getc: fn(p: self ref Rfclex): int;
+ ungetc: fn(p: self ref Rfclex);
+ lex: fn(p: self ref Rfclex): int;
+ unlex: fn(p: self ref Rfclex);
+ skipws: fn(p: self ref Rfclex): int;
+
+ line: fn(p: self ref Rfclex): string;
+};
+
+readheaders: fn(fd: ref Bufio->Iobuf, limit: int):
+ array of (string, array of byte);
+parseparams: fn(ps: ref Rfclex): list of (string, string);
+parsecontent: fn(ps: ref Rfclex, multipart: int,
+ head: list of ref Content): list of ref Content;
+mimefields: fn(ps: ref Rfclex):
+ list of (string, list of (string, string));
+
+quotable: fn(s: string): int;
+quote: fn(s: string): string;
+
+sec2date: fn(secs: int): string;
+date2sec: fn(s: string): int;
+now: fn(): int;
+time: fn(): string;
+
+Content: adt{
+ generic: string;
+ specific: string;
+ params: list of (string, string);
+
+ mk: fn(specific: string, generic: string,
+ params: list of (string, string)): ref Content;
+ check: fn(c: self ref Content, oks: list of ref Content): int;
+ text: fn(c: self ref Content): string;
+};
+
+suffixclass: fn(name: string): (ref Content, ref Content);
+dataclass: fn(a: array of byte): (ref Content, ref Content);
+.EE
+.SH DESCRIPTION
+.B RFC822
+provides types and functions to help read and parse RFC822 e-mail headers
+(following the more streamlined rules of RFC2822, which has replaced RFC822),
+including some MIME extensions.
+Currently the focus is on operations that support HTTP and other W3C protocols,
+rather than mail reading.
+.PP
+.B Init
+must be called before any other operation in the module.
+It must be given an instance of the
+.B Bufio
+module (see
+.IR bufio (2)).
+.PP
+.B Readheaders
+reads a set of RFC822 header lines from
+.IR fd ,
+ended by an empty line.
+It returns an array of tuples
+.BI ( fieldname,\ value ),
+one per header line.
+The string
+.I fieldname
+is the header line's field name, in lower case.
+The
+.I value
+gives the rest of the line, after removing any initial white space and appending any continuation lines, uninterpreted,
+as an array of bytes (not a string).
+.I Limit
+is the maximum allowed size of the header in bytes;
+usually that is
+.BR Maxrequest .
+.B Readheaders
+returns the tuple
+.B (nil,\ nil)
+on end of file or if the header size limit is exceeded.
+.PP
+.B Rfclex
+takes a header line's
+.I value
+and produces a sequence of tokens.
+It provides the following operations:
+.TP
+.BI Rfclex.mk( a )
+Return a reference to a new
+.B Rfclex
+value that will produce tokens from the array of byte
+.IR a ,
+which is normally the
+.I value
+of one of the header lines returned by
+.BR readheaders .
+.TP
+.IB rfl .getc()
+Return the next character from the input stream, in the Latin-1 (ISO 8859-1) character set.
+Return a negative value
+.RB ( Bufio->EOF )
+on end-of-file.
+.TP
+.IB rfl .ungetc()
+Put back the last character read, which will be returned again by the next call to
+.IR rfl .getc .
+.TP
+.IB rfl .lex()
+Return the next token from the input stream, ignoring any leading white space.
+Most tokens are single characters representing themselves.
+The token value is also assigned to
+.IB rfl .tok .
+There are two special token values:
+.BR Word ,
+representing an unquoted word in the RFC2822 grammar; and
+.BR QString ,
+representing a quoted string.
+In both cases
+.IB rfl .wordval
+will contain the text of the word or string (without quotes).
+.TP
+.IB rfl .unlex()
+Put back the last token read; the next call to
+.IB rfl .lex
+will return it again.
+.TP
+.IB rfl .skipws()
+Skip over any white space at the current position;
+return the initial character of the next token (which is not consumed).
+.TP
+.IB rfl .line()
+Return a string giving the remainder of the input line.
+.PP
+Several functions take an
+.B Rfclex
+referring to a header line's value, parse it, and return a higher-level representation of its value.
+.PP
+.B Parseparams
+parses a sequence of
+.I parameter
+settings of the form (\c
+.BI ; attribute = value\c
+)*
+and returns a corresponding list of tuples
+.BI ( attribute,\ value ) .
+It returns nil if no parameters are found.
+.PP
+.B Parsecontent
+parses the values of fields such as
+.B Content-Type
+and
+.BR Accept .
+The syntax is (loosely) a sequence of comma-separated elements of the form
+.IR type ,
+.IB type /* ,
+or
+.IB type / subtype
+followed by an optional sequence of parameters of the form (\c
+. BI ; attribute = value
+)*.
+The
+.IB type / subtype
+form is allowed only if
+.I multipart
+is true (non-zero).
+It returns a corresponding list of
+.B Content
+values followed by the initial list
+.IR head .
+.PP
+.B Mimefields
+parses a sequence of comma-separated elements of the form
+.IR word (\c
+.BI ; attr = val
+)*
+as used for instance in the rule
+.IR transfer-coding .
+It returns a corresponding list of tuples
+.BI ( word,\ l )
+where
+.I l
+is an optional list of tuples
+.BI ( attr,\ val ) .
+.PP
+When producing an RFC822 header line, words must be quoted when they contain certain
+special characters.
+.B Quotable
+returns true iff the string
+.I s
+contains any of those characters.
+.B Quote
+returns the value of
+.I s
+with quotes added as required.
+.PP
+RFC822 headers have a particular syntax for dates, different from that of
+.IR daytime (2).
+The function
+.B sec2date
+returns a string in RFC822 date format representing the time
+.I secs
+(in seconds from the Epoch).
+.B Date2sec
+takes a string in RFC822 date format and returns the time in seconds from the Epoch.
+.B Now
+returns the current time in seconds from the epoch
+(it is equivalent to
+.B Daytime->now()
+from
+.IR daytime (2)).
+.B Time
+returns the current time in RFC822's date format.
+.PP
+The Multipurpose Internet Mail Extensions (see RFC2045-7) include syntax
+for describing different types of media, content, and content encodings.
+.B Content
+values represent those descriptions.
+Its fields and operations are as follows:
+.TP
+.B generic
+General class of content (eg,
+.BR application ,
+.BR image ,
+.BR text ,
+etc)
+.TP
+.B specific
+Optional particular type within that class
+(eg,
+.B octet-stream
+within
+.BR application ,
+or
+.B plain
+within
+.BR text )
+.TP
+.B params
+Optional list of
+.BI ( attr,\ value )
+pairs giving parameters to the content type or encoding.
+The particular attribute
+.B q
+has a floating-point
+.I value
+that specifies the relative quality (utility) of a particular type or encoding to a client.
+.TP
+.BI mk( generic,\ specific,\ params )
+Return a reference to a new
+.B Content
+value, initialised with the given parameters.
+.TP
+.IB c .check( ok )
+Return true if
+.I c
+is acceptable content/media/encoding according to the list of allowable forms in
+.IR ok .
+.I C
+is always acceptable if
+.I ok
+is nil (ie, there are no restrictions).
+Otherwise, at least one of the
+.B Content
+values in
+.I ok
+must match
+.IR c .
+That is, an
+.I ok
+value must have the same generic and specific types as
+.IR c ,
+or specify
+.RB ` * '
+in one or both positions (to match any value in
+.IR c ).
+Any
+.I params
+are ignored.
+.TP
+.IB c .text()
+Return the RFC822 syntax for
+.IR c :
+.IB generic / specific ; a\f5=\fIv\fR\&...
+where the component words are quoted if necessary.
+.PP
+Given the
+.I name
+of a file,
+.B suffixclass
+returns a tuple
+.BI ( type,\ enc )
+where
+.I type
+gives the MIME
+.B Content-Type
+of
+.I name
+(or nil, if its type is not known), and
+.I enc
+gives the MIME
+.B Content-Encoding
+of
+.I name
+(or nil, if it is not encoded).
+.SH FILES
+.TF /lib/mimetype
+.TP
+/lib/mimetype
+map between file suffix and MIME content types
+.SH SOURCE
+.B /appl/lib/rfc822.b
diff --git a/man/2/smtp b/man/2/smtp
index 16cde120..f94cdf3d 100644
--- a/man/2/smtp
+++ b/man/2/smtp
@@ -7,7 +7,7 @@ include "smtp.m";
smtp := load Smtp Smtp->PATH;
open: fn(server: string): (int, string);
-sendmail: fn(fromwho: string,
+sendmail: fn(fromwhom: string,
towhom: list of string,
cc: list of string,
msg: list of string): (int, string);
@@ -26,11 +26,9 @@ is nil,
.B open
uses the
default mail server
-.B $MAILSERVER
-if set up in
-.BR /services/cs/db ;
-see
-.IR db (6).
+.BR $smtp ,
+which must be defined in
+.IR ndb (6).
It returns -1 and an error message if the connection fails.
.PP
.B Sendmail
diff --git a/man/2/sys-print b/man/2/sys-print
index c499ad43..0fa21403 100644
--- a/man/2/sys-print
+++ b/man/2/sys-print
@@ -1,11 +1,12 @@
.TH SYS-PRINT 2
.SH NAME
-print, fprint, sprint \- print formatted output
+print, aprint, fprint, sprint \- print formatted output
.SH SYNOPSIS
.EX
include "sys.m";
sys := load Sys Sys->PATH;
+aprint: fn(format: string, *): array of byte;
fprint: fn(fd: ref FD, format: string, *): int;
print: fn(format: string, *): int;
sprint: fn(format: string, *): string;
@@ -22,6 +23,10 @@ file descriptor.
.B Sprint
places text
in a string, which it returns.
+.B Aprint
+is similar but returns the text in
+.IR utf (6)
+representation as an array of bytes.
.B Print
and
.B fprint
diff --git a/man/2/w3c-uris b/man/2/w3c-uris
new file mode 100644
index 00000000..d4dbb73d
--- /dev/null
+++ b/man/2/w3c-uris
@@ -0,0 +1,242 @@
+.TH W3C-URIS 2
+.SH NAME
+w3c-uris \- uniform resource identifiers
+.SH SYNOPSIS
+.EX
+include "uris.m";
+
+uris := load URIs URIs->PATH;
+URI: import uris;
+
+URI: adt
+{
+ scheme: string;
+ userinfo: string; # authority, part I
+ host: string; # authority, part II
+ port: string; # authority, part III
+ path: string; # starts with / if absolute
+ query: string; # includes ? if not nil
+ fragment: string; # includes # if not nil
+
+ parse: fn(s: string): ref URI;
+ text: fn(u: self ref URI): string;
+ addbase: fn(base: self ref URI, rel: ref URI): ref URI;
+ authority: fn(u: self ref URI): string;
+ copy: fn(u: self ref URI): ref URI;
+ eq: fn(u: self ref URI, v: ref URI): int;
+ hasauthority: fn(u: self ref URI): int;
+ isabsolute: fn(u: self ref URI): int;
+ nodots: fn(u: self ref URI): ref URI;
+ userpw: fn(u: self ref URI): (string, string);
+};
+
+init: fn();
+dec: fn(s: string): string;
+enc: fn(s: string, safe: string): string;
+.EE
+.SH DESCRIPTION
+.B URIs
+supports the `generic syntax' for `Uniform' Resource Identifiers (URIs), defined by RFC3986.
+Each URI can have up to five components in the general syntax:
+.IP
+.IB scheme :
+.BI // authority / path
+.BI ? query
+.BI # fragment
+.PP
+where each component is optional, and can have scheme-specific substructure.
+For instance, in the
+.BR ftp ,
+.B http
+schemes, and perhaps others, the
+.I authority
+component has the further syntax:
+.IP
+.IB userinfo @ host : port
+.PP
+The set of characters allowed in most components is also scheme-specific, as is their interpretation, and indeed the
+interpretation of the component itself.
+.PP
+.B Init
+must be called before any other operation in the module.
+.PP
+.B URI
+represents a parse of a URI into its components, where the
+.I authority
+has been further split into the scheme-specific but common triple of
+.IR userinfo ,
+.I host
+and
+.IR port .
+(The function
+.B URI.authority
+will reproduce the original
+.I authority
+component if required.)
+The
+.B query
+field starts with the
+.RB ` ? '
+character that introduces the
+.I query
+component, so that an empty query is represented by the string
+\f5"?"\fP, and the absence of a query component is represented by a nil value.
+The
+.B fragment
+field is handled in a similar way with its delimiting
+.RB ` # '.
+The fields representing the other components do not include the delimiters in the syntax,
+and all but
+.B query
+have percent-encoded characters decoded.
+(The query string is an exception because the set of characters to escape is application-specific.
+See below for decoding and encoding functions.)
+.B URI
+provides the following operations:
+.TP
+.BI parse( s )
+Return a
+.B URI
+value representing the results of parsing string
+.I s
+as a URI.
+There is no error return.
+The component values have percent-escapes decoded as discussed above.
+The scheme name is converted to lower case.
+.TP
+.IB u .text()
+Return the textual representation of
+.I u
+in the generic syntax,
+adding percent-encoding as required to prevent characters
+being misinterpreted as delimiters.
+.TP
+.IB u .addbase( b )
+Resolves URI reference
+.I u
+with respect to a base URI
+.IR b ,
+including resolving all
+.RB ` . '
+and
+.RB ` .. '
+segments in the URI's path,
+and returns the resulting
+.B URI
+value.
+If
+.I u
+is an absolute URI reference or
+.I b
+is nil, the result is the same as
+.I u
+except that all
+.RB ` . '
+and
+.RB ` .. '
+segments have been resolved in the resulting path, and leading
+instances of them removed.
+.TP
+.IB u .authority()
+Returns the text of the
+.I authority
+component of
+.IR u ,
+in the generic syntax,
+created from its
+.BR userinfo ,
+.B host
+and
+.B port
+components.
+.TP
+.IB u .copy()
+Return a reference to an independent copy of
+.IR u .
+.TP
+.IB u .eq( v )
+Returns true if
+.I u
+and
+.I v
+are textually equal in all components except
+.BR fragment .
+Note that
+.I u
+and
+.I v
+are assumed to be in a canonical form for the scheme and application.
+.TP
+.IB u .eqf( v )
+Returns true if
+.I u
+and
+.I v
+are textually equal in all components including
+.BR fragment .
+.TP
+.IB u .hasauthority()
+Returns true if any of the authority subcomponents of
+.I u
+are not nil; returns false otherwise.
+.TP
+.IB u .isabsolute()
+Returns true if
+.I u
+has a
+.I scheme
+component; returns false otherwise.
+.TP
+.IB u .nodots()
+Returns a new
+.B URI
+value in which all
+.RB ` . '
+and
+.RB ` .. '
+segments have been resolved (equivalent to
+.IB u .addbase(nil)\c
+).
+.TP
+.IB u .userpw()
+Returns a tuple
+.BI ( username,\ password )
+derived from parsing the
+.I userinfo
+subcomponent of
+.I authority
+using the deprecated but depressingly still common convention that
+.I userinfo
+has the syntax ``\fIusername\fP\f5:\fP\fIpassword\fP''.
+.PP
+A reserved or otherwise special character that appears in a URI component must be
+encoded using a sequence of one or more strings of the form
+.BI % xx
+where
+.I xx
+is the hexadecimal value of one byte of the character.
+A string
+.I s
+containing such encodings can be decoded by the function
+.BR dec .
+A string
+.I s
+can be encoded by
+.BR enc ,
+where the parameter
+.I safe
+lists the characters that need not be escaped (where
+.I safe
+may be nil or empty).
+These functions are normally only needed to decode and encode the values of
+.BR URI.query ,
+because
+.B URI.parse
+and
+.B URI.text
+above decode and encode the other fields.
+.SH SOURCE
+.B /appl/lib/w3c/uris.b
+.SH SEE ALSO
+.IR charon (1),
+.IR httpd (8)
diff --git a/man/2/xml b/man/2/xml
index 8387971a..0b286e49 100644
--- a/man/2/xml
+++ b/man/2/xml
@@ -11,6 +11,8 @@ Parser, Item, Location, Attributes, Mark: import xml;
init: fn(): string;
open: fn(f: string, warning: chan of (Locator, string),
preelem: string): (ref Parser, string);
+fopen: fn(iob: ref Bufio->Iobuf, f: string, warning: chan of (Locator, string),
+ preelem: string): (ref Parser, string);
Parser: adt {
fileoffset: int;
@@ -79,8 +81,15 @@ A new parser instance is created by calling
.BR open(\fIf\fP,\ \fIwarning\fP,\ \fIpreelem\fP) ,
which opens the file
.I f
-for parsing as an XML document.
-It returns a tuple, say
+for parsing as an XML document,
+or
+.BR fopen(\fIiob\fP,\ \fIname\fP,\ \fIwarning\fP,\ \fIpreelem\fP) ,
+which does the same for an already open
+.B Iobuf
+(the string
+.I name
+will be used in diagnostics).
+Both functions return a tuple
.RI ( p ,\ err ).
If there is an error opening the document,
.I p
@@ -94,7 +103,7 @@ If
is not nil, non-fatal errors encountered when parsing
will be sent on this channel - a separate process will
be needed to received them. Each error is represented
-by a tuple, say
+by a tuple
.RI ( loc ,\ msg ),
containing the location
.IR loc ,
diff --git a/man/3/cmd b/man/3/cmd
index 83b4e245..52a3e191 100644
--- a/man/3/cmd
+++ b/man/3/cmd
@@ -10,6 +10,8 @@ cmd \- interface to host operating system commands
.br
.BI /cmd/ n /data
.br
+.BI /cmd/ n /stderr
+.br
.BI /cmd/ n /status
.br
.BI /cmd/ n /wait
@@ -69,9 +71,11 @@ Spawn a host process to run the
with arguments as given.
The write returns with an error, setting the error string, if anything prevents
starting the command.
-If write returns successfully, the command has started, and its input and
+If write returns successfully, the command has started, and its standard input and
output may be accessed through
-.B data
+.BR data ,
+and its error output accessed through
+.B stderr
(see below).
If arguments containing white space are quoted (following the conventions of
.IR sh (1)
@@ -105,14 +109,17 @@ The
file provides a connection to the input and output of a previously-started
host command.
It must be opened separately for reading and for writing.
-When opened for reading, it returns data that the command writes to its standard output and standard error (the
-streams are merged); when closed, further writes by the command will receive the host
+When opened for reading, it returns data that the command writes to its standard output; when closed, further writes by the command will receive the host
equivalent of `write to closed pipe'.
When opened for writing, data written to the file
can be read by the command on its standard input; when closed, further reads by
the command will see the host equivalent of `end of file'.
(Unfortunately there is no way to know when the command needs input.)
.PP
+The
+.B stderr
+file provides a similar read-only connection to the error output from the command.
+.PP
Once started, a host command runs until it terminates or until it is killed,
by using the
.B kill
diff --git a/man/7/INDEX b/man/7/INDEX
index 0fcedcaf..59cedaf0 100644
--- a/man/7/INDEX
+++ b/man/7/INDEX
@@ -1,3 +1,4 @@
intro 0intro
+cddb cddb
db db
dbsrv dbsrv
diff --git a/man/7/cddb b/man/7/cddb
new file mode 100644
index 00000000..34c64f70
--- /dev/null
+++ b/man/7/cddb
@@ -0,0 +1,56 @@
+.TH CDDB 7
+.SH NAME
+cddb \- CD database
+.SH SYNOPSIS
+.B cddb
+[
+.B -DTt
+]
+[
+.B -s
+.I server
+]
+.B query
+.I diskid
+.I ntracks
+.I track0id
+.I ...
+.SH DESCRIPTION
+.I Cddb
+queries an Internet database to get a table of
+contents and other details for audio CDs.
+The CD has
+.I ntracks
+tracks, and
+.I trackNid
+is a hash value derived from the
+.IR N 'th
+track's characteristics;
+.I diskid
+is a hash of all the track IDs.
+.PP
+.I Cddb
+takes 4 optional arguments.
+The
+.B -s server
+option causes
+.I cddb
+to use a different server for the query
+(default is
+.IR freedb.freedb.org ).
+The
+.B -D
+option causes the raw database response from the server to be dumped
+to standard output.
+The
+.I -t
+option causes the time of each track to be appended to the normal output.
+.I -T
+prints track times and
+adds a line at the end with the total time.
+.SH SOURCE
+.B /appl/cmd/cddb.b
+.SH SEE ALSO
+.I 9660srv
+(in
+.IR dossrv (4))
diff --git a/man/8/httpd b/man/8/httpd
index 414bb304..eca8bf25 100644
--- a/man/8/httpd
+++ b/man/8/httpd
@@ -4,11 +4,11 @@ httpd, echo, stats \- HTTP server
.SH SYNOPSIS
.B svc/httpd/httpd
[
-.BI -c cachesize
+.BI -a " addr"
] [
-.B -D
+.BI -c " cachesize"
] [
-.BI -p port
+.B -D
]
.PP
.BI svc/httpd/echo " meth vers uri search"
@@ -17,9 +17,10 @@ httpd, echo, stats \- HTTP server
.SH DESCRIPTION
.I Httpd
is a simple HTTP daemon, serving version 1.0 of the HTTP protocol.
-It listens for incoming calls on a given TCP/IP
-.I port
-(default: 80).
+It listens for incoming calls on a given
+.I address
+(default:
+.BR tcp!*!80 ).
It serves content rooted at
.L /services/httpd/root
in its name space.
@@ -55,7 +56,13 @@ are provided (see below).
.I Httpd
has the following options:
.TP
-.BI -c cachesize
+.BI -a " address"
+Listen for calls on the given
+.IR address ,
+expressed using the syntax of
+.IR sys-dial (2).
+.TP
+.BI -c " cachesize"
Set the size of the daemon's cache to
.I cachesize
kilobytes. The default is a five megabyte cache.
@@ -63,10 +70,6 @@ kilobytes. The default is a five megabyte cache.
.B -D
Debugging information is written to the file
.BR /services/httpd/httpd.debug .
-.TP
-.BI -p port
-Listen for requests on the given
-.IR port .
.PP
.I Echo
is a trivial server that just returns the method, URI, any search, and the headers sent by the client.
diff --git a/man/8/shutdown b/man/8/shutdown
index 5385f91e..130cc14c 100644
--- a/man/8/shutdown
+++ b/man/8/shutdown
@@ -21,6 +21,10 @@ will be given the same options as were given it when it started.
.SH FILES
.B /dev/sysctl
.SH SOURCE
-.B /appl/cmd/shutdown.b
+.TF /dis/shutdown
+.TP
+.B /dis/shutdown
+.IR sh (1)
+script
.SH "SEE ALSO"
.IR cons (3)
diff --git a/man/index b/man/index
index f4141471..ed82db44 100644
--- a/man/index
+++ b/man/index
@@ -140,6 +140,7 @@
82543gc /man/10/plan9.ini
91cxx /man/10/plan9.ini
9660srv /man/4/dossrv
+9660srv /man/7/cddb
9660srv /man/8/init
9660srv.b /man/4/dossrv
9999:noworld /man/4/kfs
@@ -255,6 +256,7 @@ abs /man/2/w3c-xpointers
absence /man/10/strcat
absence /man/2/ir
absence /man/2/prof
+absence /man/2/w3c-uris
absence /man/3/ip
absence /man/8/dns
absence /man/8/prep
@@ -271,6 +273,7 @@ absolute /man/10/a.out
absolute /man/10/conf
absolute /man/2/math-fp
absolute /man/2/sys-millisec
+absolute /man/2/w3c-uris
absolute /man/2/w3c-xpointers
absolute /man/8/bootpd
absolutely /man/1/chmod
@@ -301,6 +304,7 @@ accept /man/10ti925/epocimg
accept /man/2/arg
accept /man/2/dhcpclient
accept /man/2/ip
+accept /man/2/rfc822
accept /man/2/sexprs
accept /man/2/spree-gather
accept /man/3/cmd
@@ -319,6 +323,7 @@ acceptable /man/1/miniterm
acceptable /man/1/sh-arg
acceptable /man/1/sh-expr
acceptable /man/1/telnet
+acceptable /man/2/rfc822
acceptable /man/2/secstore
acceptable /man/2/security-auth
acceptable /man/2/spki-verifier
@@ -413,6 +418,7 @@ access /man/1/0intro
access /man/1/alphabet-abc
access /man/1/alphabet-fs
access /man/1/alphabet-grid
+access /man/1/ar
access /man/1/chmod
access /man/1/collab
access /man/1/ebook
@@ -924,6 +930,7 @@ adaptec /man/10/plan9.ini
adapter /man/10/plan9.ini
adapters /man/10/plan9.ini
adcs /man/3/audio
+add /man/1/ar
add /man/1/bind
add /man/1/chmod
add /man/1/grid-monitor
@@ -967,6 +974,7 @@ add /man/9/canvas
add /man/9/menu
add /man/9/options
add /man/9/text
+addbase /man/2/w3c-uris
addbuiltin /man/2/sh
addclock0link /man/10/delay
addclock0link /man/10/kbdputc
@@ -993,6 +1001,7 @@ added /man/10/plan9.ini
added /man/10/styxserver
added /man/2/draw-display
added /man/2/draw-image
+added /man/2/rfc822
added /man/2/sets
added /man/2/spree-cardlib
added /man/3/sd
@@ -1014,6 +1023,7 @@ adding /man/1/sh-alphabet
adding /man/10/devattach
adding /man/10/plan9.ini
adding /man/10/strcat
+adding /man/2/w3c-uris
adding /man/3/pnp
adding /man/6/dis
adding /man/8/cs
@@ -1101,6 +1111,7 @@ addr /man/4/acme
addr /man/4/lockfs
addr /man/7/db
addr /man/8/cs
+addr /man/8/httpd
addr&amask /man/2/dis
address /man/1/acme
address /man/1/alphabet-abc
@@ -1185,6 +1196,7 @@ address /man/8/cs
address /man/8/dhcp
address /man/8/dns
address /man/8/getauthinfo
+address /man/8/httpd
address /man/8/prep
address /man/8/rip
address /man/8/styxchat
@@ -1260,6 +1272,7 @@ adds /man/2/spree-cardlib
adds /man/3/ip
adds /man/3/logfs
adds /man/4/registry
+adds /man/7/cddb
adds /man/8/ftl
adds /man/8/prep
addsbuiltin /man/2/sh
@@ -1406,6 +1419,7 @@ adt /man/2/prefab-style
adt /man/2/print
adt /man/2/prof
adt /man/2/registries
+adt /man/2/rfc822
adt /man/2/scsiio
adt /man/2/security-login
adt /man/2/security-ssl
@@ -1430,6 +1444,7 @@ adt /man/2/translate
adt /man/2/ubfa
adt /man/2/venti
adt /man/2/w3c-css
+adt /man/2/w3c-uris
adt /man/2/w3c-xpointers
adt /man/2/wmclient
adt /man/2/wmsrv
@@ -1520,6 +1535,7 @@ afid /man/2/styxservers
afid /man/5/0intro
afid /man/5/attach
afid /man/8/styxchat
+afile /man/1/ar
afile /man/10/iar
afollowing /man/2/w3c-xpointers
afp /man/2/dis
@@ -1877,6 +1893,7 @@ allow /man/9/text
allow.b /man/2/spree-allow
allow.m /man/2/spree-allow
allowable /man/2/keyring-0intro
+allowable /man/2/rfc822
allowable /man/9/canvas
allowable /man/9/text
allowance /man/2/prefab-compound
@@ -2054,6 +2071,7 @@ alt /man/2/tkclient
alt /man/2/wait
alt /man/3/prog
alt /man/6/keyboard
+alter /man/1/ar
alter /man/1/mash
alter /man/1/wm-misc
alter /man/10/iar
@@ -2356,6 +2374,7 @@ appearing /man/1/wm-sh
appearing /man/2/cfg
appearing /man/9/scale
append /man/1/acme
+append /man/1/ar
append /man/1/chmod
append /man/1/limbo
append /man/1/ls
@@ -2396,12 +2415,14 @@ appended /man/2/security-0intro
appended /man/2/tk
appended /man/3/ssl
appended /man/4/acme
+appended /man/7/cddb
appended /man/9/bind
appended /man/9/scrollbar
appending /man/1/asm
appending /man/1/limbo
appending /man/1/sh
appending /man/2/attrdb
+appending /man/2/rfc822
appending /man/2/security-0intro
appending /man/8/prep
appending /man/9/menu
@@ -2422,6 +2443,7 @@ appl /man/1/alphabet-abc
appl /man/1/alphabet-fs
appl /man/1/alphabet-grid
appl /man/1/alphabet-main
+appl /man/1/ar
appl /man/1/asm
appl /man/1/auplay
appl /man/1/avr
@@ -2566,6 +2588,7 @@ appl /man/2/bufio
appl /man/2/cfg
appl /man/2/convcs
appl /man/2/crc
+appl /man/2/csv
appl /man/2/daytime
appl /man/2/dbm
appl /man/2/debug
@@ -2607,6 +2630,7 @@ appl /man/2/pslib
appl /man/2/rand
appl /man/2/readdir
appl /man/2/regex
+appl /man/2/rfc822
appl /man/2/scsiio
appl /man/2/secstore
appl /man/2/security-auth
@@ -2638,6 +2662,7 @@ appl /man/2/venti
appl /man/2/virgil
appl /man/2/volume
appl /man/2/w3c-css
+appl /man/2/w3c-uris
appl /man/2/w3c-xpointers
appl /man/2/wmclient
appl /man/2/wmlib
@@ -2668,6 +2693,7 @@ appl /man/4/ramfile
appl /man/4/registry
appl /man/4/spree
appl /man/4/tarfs
+appl /man/7/cddb
appl /man/7/db
appl /man/7/dbsrv
appl /man/8/applylog
@@ -2696,7 +2722,6 @@ appl /man/8/rdbgsrv
appl /man/8/register
appl /man/8/rip
appl /man/8/rstyxd
-appl /man/8/shutdown
appl /man/8/signer
appl /man/8/sntp
appl /man/8/srv
@@ -2742,6 +2767,7 @@ application /man/2/popup
application /man/2/prefab-element
application /man/2/prefab-environ
application /man/2/prefab-style
+application /man/2/rfc822
application /man/2/security-0intro
application /man/2/selectfile
application /man/2/styxservers
@@ -2752,6 +2778,7 @@ application /man/2/tk
application /man/2/tkclient
application /man/2/translate
application /man/2/ubfa
+application /man/2/w3c-uris
application /man/2/wmclient
application /man/2/wmlib
application /man/3/draw
@@ -2948,9 +2975,11 @@ approximate /man/1/sh-file2chan
approximate /man/2/geodesy
approximate /man/9/canvas
approximately /man/2/bloomfilter
+approximation /man/1/man
approximation /man/3/fs
apreceding /man/2/w3c-xpointers
april /man/2/ida
+aprint /man/2/sys-print
aprvx /man/8/mkfs
apx /man/10/2c
aqid /man/10/styx
@@ -2960,10 +2989,12 @@ aqid /man/5/attach
aqid /man/8/styxchat
aqua /man/9/types
ar /man/1/alphabet-fs
+ar /man/1/ar
ar /man/1/fs
ar /man/10/ar
ar /man/10/iar
ar /man/10/mk
+ar.b /man/1/ar
ar.h /man/10/ar
arbitrarily /man/1/acme
arbitrarily /man/2/dict
@@ -3020,6 +3051,7 @@ arch /man/3/vga
arch /man/4/archfs
arch /man/4/namespace
arch /man/8/mkfs
+arch.a /man/1/ar
arch.b /man/8/create
archfile /man/4/archfs
archfs /man/4/archfs
@@ -3052,6 +3084,7 @@ archival /man/2/spree-gather
archival /man/2/spree-objstore
archival /man/2/venti
archive /man/1/alphabet-fs
+archive /man/1/ar
archive /man/1/fs
archive /man/1/gettar
archive /man/10/0intro
@@ -3078,6 +3111,7 @@ archived /man/4/tarfs
archived /man/8/mkfs
archived /man/8/prep
archiveobj /man/2/spree-allow
+archives /man/1/ar
archives /man/1/gettar
archives /man/10/2l
archives /man/10/ar
@@ -3326,6 +3360,7 @@ array /man/2/popup
array /man/2/prof
array /man/2/readdir
array /man/2/regex
+array /man/2/rfc822
array /man/2/scsiio
array /man/2/secstore
array /man/2/security-random
@@ -3344,6 +3379,7 @@ array /man/2/sys-byte2char
array /man/2/sys-dirread
array /man/2/sys-file2chan
array /man/2/sys-pipe
+array /man/2/sys-print
array /man/2/sys-read
array /man/2/sys-utfbytes
array /man/2/tabs
@@ -3426,6 +3462,7 @@ arrows /man/1/ebook
arrows /man/9/canvas
arrows /man/9/scrollbar
arrowshape /man/9/canvas
+art /man/1/ar
artifacts /man/6/colour
artist /man/1/collab-clients
artists /man/1/collab-clients
@@ -3531,6 +3568,7 @@ assigned /man/1/yacc
assigned /man/10/styxserver
assigned /man/2/dhcpclient
assigned /man/2/palmfile
+assigned /man/2/rfc822
assigned /man/2/sys-0intro
assigned /man/2/sys-dial
assigned /man/2/sys-self
@@ -3631,6 +3669,7 @@ assumed /man/1/collab-clients
assumed /man/1/cprof
assumed /man/1/du
assumed /man/1/look
+assumed /man/1/man
assumed /man/1/mash
assumed /man/1/mdb
assumed /man/1/mprof
@@ -3652,6 +3691,7 @@ assumed /man/2/spree
assumed /man/2/spree-cardlib
assumed /man/2/styx
assumed /man/2/styxservers-nametree
+assumed /man/2/w3c-uris
assumed /man/3/boot
assumed /man/3/ds
assumed /man/3/gpio
@@ -3684,6 +3724,7 @@ assuming /man/9/types
assumption /man/1/disdep
assumption /man/1/mdb
assumption /man/10/2c
+assumptions /man/1/ar
assumptions /man/10/iar
asterisk /man/1/sh-arg
asterisk /man/1/sh-std
@@ -3829,6 +3870,7 @@ attempt /man/1/charon
attempt /man/1/dmview
attempt /man/1/listen
attempt /man/1/miniterm
+attempt /man/1/os
attempt /man/1/tiny
attempt /man/1/touch
attempt /man/1/wm
@@ -3908,6 +3950,7 @@ attr /man/2/factotum
attr /man/2/palmfile
attr /man/2/plumbmsg
attr /man/2/registries
+attr /man/2/rfc822
attr /man/3/i82365
attr /man/3/sign
attr /man/4/factotum
@@ -3939,6 +3982,7 @@ attribute /man/2/cfg
attribute /man/2/convcs
attribute /man/2/plumbmsg
attribute /man/2/registries
+attribute /man/2/rfc822
attribute /man/2/spree
attribute /man/2/spree-cardlib
attribute /man/2/spree-objstore
@@ -4016,6 +4060,7 @@ audio /man/3/kprof
audio /man/3/mpeg
audio /man/3/tv
audio /man/6/audio
+audio /man/7/cddb
audio0 /man/10/plan9.ini
audioctl /man/1/auplay
audioctl /man/1/mux
@@ -4224,6 +4269,7 @@ authority /man/2/security-0intro
authority /man/2/security-login
authority /man/2/spki
authority /man/2/tk
+authority /man/2/w3c-uris
authority /man/6/auth
authority /man/6/dis
authority /man/6/keys
@@ -4252,6 +4298,7 @@ autoconvert /man/1/sh-alphabet
autodeclare /man/1/sh-alphabet
autodetected /man/10/plan9.ini
autoexec.bat /man/10/plan9.ini
+autoload /man/1/sh
automate /man/1/wm-sh
automate /man/2/styxservers
automatic /man/1/acme
@@ -4384,6 +4431,7 @@ avoid /man/5/stat
avoid /man/6/ndb
avoid /man/9/text
avoiding /man/4/ftpfs
+avoids /man/1/ar
avoids /man/1/sh-file2chan
avoids /man/10/iar
avoids /man/2/crc
@@ -4422,6 +4470,7 @@ b64toip /man/2/keyring-ipint
backed /man/2/palmfile
backed /man/9/canvas
background /man/1/cprof
+background /man/1/os
background /man/1/sh
background /man/1/tiny
background /man/1/tktester
@@ -4564,6 +4613,7 @@ base /man/2/print
base /man/2/sexprs
base /man/2/string
base /man/2/sys-dial
+base /man/2/w3c-uris
base /man/3/flash
base /man/3/kprof
base /man/3/pnp
@@ -4755,6 +4805,7 @@ behaves /man/2/prefab-compound
behaves /man/9/canvas
behaves /man/9/menu
behaves /man/9/text
+behavior /man/1/ar
behavior /man/10/iar
behavior /man/10/plan9.ini
behavior /man/2/draw-image
@@ -4763,6 +4814,7 @@ behavior /man/5/open
behaviour /man/1/acme
behaviour /man/1/emu
behaviour /man/1/ftree
+behaviour /man/1/os
behaviour /man/1/sh
behaviour /man/1/sh-alphabet
behaviour /man/1/wm-sh
@@ -5237,6 +5289,7 @@ bitstring /man/2/asn1
bitwise /man/1/fc
bitwise /man/1/mdb
bitwise /man/1/sh-expr
+bitwise /man/2/keyring-ipint
bitwise /man/2/sets
bitwise /man/2/tkclient
bitwise /man/2/wmclient
@@ -6037,22 +6090,27 @@ bufio /man/1/yacc
bufio /man/2/attrdb
bufio /man/2/bufio
bufio /man/2/bufio-chanfill
+bufio /man/2/csv
bufio /man/2/format
bufio /man/2/imagefile
bufio /man/2/pslib
+bufio /man/2/rfc822
bufio /man/2/sexprs
bufio /man/2/spki
bufio /man/2/sys-read
bufio /man/2/sys-seek
bufio /man/2/sys-self
bufio /man/2/ubfa
+bufio /man/2/xml
bufio.b /man/2/bufio
bufio.m /man/1/yacc
bufio.m /man/2/attrdb
bufio.m /man/2/bufio
bufio.m /man/2/bufio-chanfill
+bufio.m /man/2/csv
bufio.m /man/2/format
bufio.m /man/2/palmfile
+bufio.m /man/2/rfc822
bufio.m /man/2/sexprs
bufio.m /man/2/spki
bufio.m /man/2/spki-verifier
@@ -6068,6 +6126,7 @@ bug /man/10/ref
buggy /man/3/sd
bugs /man/1/9win
bugs /man/1/acme
+bugs /man/1/ar
bugs /man/1/asm
bugs /man/1/cal
bugs /man/1/cat
@@ -6340,6 +6399,7 @@ button /man/1/ftree
button /man/1/grid-monitor
button /man/1/grid-query
button /man/1/keyboard
+button /man/1/man
button /man/1/mash-tk
button /man/1/miniterm
button /man/1/session
@@ -6477,6 +6537,7 @@ byte /man/2/math-export
byte /man/2/palmfile
byte /man/2/plumbmsg
byte /man/2/prof
+byte /man/2/rfc822
byte /man/2/scsiio
byte /man/2/secstore
byte /man/2/security-random
@@ -6491,10 +6552,12 @@ byte /man/2/styxservers
byte /man/2/sys-0intro
byte /man/2/sys-byte2char
byte /man/2/sys-file2chan
+byte /man/2/sys-print
byte /man/2/sys-read
byte /man/2/sys-utfbytes
byte /man/2/ubfa
byte /man/2/venti
+byte /man/2/w3c-uris
byte /man/2/wmsrv
byte /man/3/arch
byte /man/3/boot
@@ -6617,6 +6680,7 @@ bytes /man/2/palmfile
bytes /man/2/plumbmsg
bytes /man/2/pop3
bytes /man/2/print
+bytes /man/2/rfc822
bytes /man/2/scsiio
bytes /man/2/secstore
bytes /man/2/security-random
@@ -6868,6 +6932,7 @@ canonical /man/2/draw-rect
canonical /man/2/keyset
canonical /man/2/sexprs
canonical /man/2/spki
+canonical /man/2/w3c-uris
canonical /man/6/dis
canonical /man/6/sexprs
canonical /man/9/types
@@ -6977,6 +7042,7 @@ carets /man/1/mash
carets /man/1/sh
carriage /man/1/deb
carriage /man/1/mash
+carriage /man/2/csv
carriage /man/6/keyboard
carriage /man/6/sexprs
carriage /man/6/translate
@@ -7017,6 +7083,7 @@ cases /man/2/0intro
cases /man/2/dis
cases /man/2/draw-0intro
cases /man/2/draw-image
+cases /man/2/rfc822
cases /man/2/security-auth
cases /man/2/sys-dirread
cases /man/2/w3c-xpointers
@@ -7133,12 +7200,16 @@ cd /man/3/prog
cd /man/3/sd
cd /man/4/dossrv
cd /man/6/namespace
+cd /man/7/cddb
cd.b /man/1/cd
+cddb /man/7/cddb
+cddb.b /man/7/cddb
cdfile /man/4/dossrv
cdfppqrtw /man/8/kfscmd
cdir /man/10/styxserver
cdroms /man/4/dossrv
cds /man/1/tr
+cds /man/7/cddb
ce /man/10/srclist
ceases /man/9/canvas
ceases /man/9/text
@@ -7535,6 +7606,7 @@ char /man/6/sexprs
char /man/9/text
char2byte /man/2/sys-byte2char
character /man/1/acme
+character /man/1/ar
character /man/1/bind
character /man/1/brutus
character /man/1/charon
@@ -7583,6 +7655,7 @@ character /man/2/asn1
character /man/2/bufio
character /man/2/cfg
character /man/2/convcs
+character /man/2/csv
character /man/2/debug
character /man/2/draw-0intro
character /man/2/draw-font
@@ -7594,6 +7667,7 @@ character /man/2/keyring-getmsg
character /man/2/palmfile
character /man/2/prof
character /man/2/regex
+character /man/2/rfc822
character /man/2/sexprs
character /man/2/spree-cardlib
character /man/2/string
@@ -7604,6 +7678,7 @@ character /man/2/sys-tokenize
character /man/2/tftp
character /man/2/ubfa
character /man/2/w3c-css
+character /man/2/w3c-uris
character /man/2/w3c-xpointers
character /man/2/wmsrv
character /man/3/0intro
@@ -7648,11 +7723,13 @@ characteristics /man/3/flash
characteristics /man/3/ip
characteristics /man/6/audio
characteristics /man/6/colour
+characteristics /man/7/cddb
characteristics /man/7/db
characteristics /man/8/ftl
characterized /man/9/canvas
characters /man/1/acme
characters /man/1/alphabet-fs
+characters /man/1/ar
characters /man/1/bind
characters /man/1/charon
characters /man/1/dd
@@ -7707,6 +7784,7 @@ characters /man/2/filepat
characters /man/2/filter-deflate
characters /man/2/filter-slip
characters /man/2/palmfile
+characters /man/2/rfc822
characters /man/2/sexprs
characters /man/2/sh
characters /man/2/spree
@@ -7718,6 +7796,7 @@ characters /man/2/sys-print
characters /man/2/sys-tokenize
characters /man/2/sys-utfbytes
characters /man/2/w3c-css
+characters /man/2/w3c-uris
characters /man/3/0intro
characters /man/3/cap
characters /man/3/cons
@@ -7763,6 +7842,7 @@ charon /man/1/charon
charon /man/1/miniterm
charon /man/1/webgrab
charon /man/1/wm-misc
+charon /man/2/w3c-uris
charon.cfg /man/1/charon
chars /man/9/text
charset /man/2/convcs
@@ -7810,6 +7890,7 @@ check /man/10/styxserver
check /man/2/crc
check /man/2/format
check /man/2/keyring-crypt
+check /man/2/rfc822
check /man/2/security-0intro
check /man/2/styxservers
check /man/2/styxservers-nametree
@@ -7849,6 +7930,7 @@ checked /man/8/changelogin
checked /man/8/kfscmd
checking /man/1/acme
checking /man/1/alphabet-main
+checking /man/1/ar
checking /man/1/ftest
checking /man/1/limbo
checking /man/1/listen
@@ -8061,6 +8143,7 @@ class /man/1/sh-string
class /man/2/0intro
class /man/2/asn1
class /man/2/ip
+class /man/2/rfc822
class /man/2/string
class /man/2/w3c-css
class /man/3/arch
@@ -8212,6 +8295,7 @@ client /man/2/factotum
client /man/2/format
client /man/2/keyring-auth
client /man/2/plumbmsg
+client /man/2/rfc822
client /man/2/security-0intro
client /man/2/security-auth
client /man/2/security-login
@@ -8481,6 +8565,7 @@ cmd /man/1/alphabet-abc
cmd /man/1/alphabet-fs
cmd /man/1/alphabet-grid
cmd /man/1/alphabet-main
+cmd /man/1/ar
cmd /man/1/asm
cmd /man/1/auplay
cmd /man/1/avr
@@ -8619,6 +8704,7 @@ cmd /man/4/ramfile
cmd /man/4/registry
cmd /man/4/spree
cmd /man/4/tarfs
+cmd /man/7/cddb
cmd /man/7/dbsrv
cmd /man/8/applylog
cmd /man/8/bootpd
@@ -8642,7 +8728,6 @@ cmd /man/8/plumber
cmd /man/8/prep
cmd /man/8/rip
cmd /man/8/rstyxd
-cmd /man/8/shutdown
cmd /man/8/signer
cmd /man/8/sntp
cmd /man/8/styxchat
@@ -8750,6 +8835,7 @@ codes /man/2/ir
codes /man/2/scsiio
codes /man/3/cons
codes /man/6/scancode
+coding /man/2/rfc822
coding /man/2/security-0intro
coff /man/10/5coff
coffee /man/1/wm-misc
@@ -8957,6 +9043,7 @@ combine /man/2/draw-rect
combine /man/3/draw
combine /man/3/ssl
combine /man/9/bind
+combined /man/1/ar
combined /man/10/iar
combined /man/2/bloomfilter
combined /man/2/draw-0intro
@@ -8978,6 +9065,8 @@ comm.b /man/1/comm
comma /man/1/charon
comma /man/1/mc
comma /man/1/sh-csv
+comma /man/2/csv
+comma /man/2/rfc822
comma /man/6/users
command's /man/1/mash
command's /man/1/mash-tk
@@ -8991,6 +9080,7 @@ command2 /man/1/mash
commas /man/10/acid
commas /man/10/plan9.ini
commas /man/10/print
+commas /man/2/csv
commas /man/2/sys-print
commas /man/9/grid
commence /man/1/session
@@ -9055,6 +9145,7 @@ common /man/2/spree-gather
common /man/2/styxservers
common /man/2/sys-dial
common /man/2/ubfa
+common /man/2/w3c-uris
common /man/2/w3c-xpointers
common /man/2/xml
common /man/3/cons
@@ -9295,6 +9386,7 @@ complement /man/1/sh-expr
complement /man/1/tr
complement /man/2/bufio
complement /man/2/draw-display
+complement /man/2/keyring-ipint
complement /man/3/audio
complement /man/6/audio
complement /man/6/dis
@@ -9419,6 +9511,7 @@ component /man/2/names
component /man/2/palmfile
component /man/2/prefab-element
component /man/2/print
+component /man/2/rfc822
component /man/2/secstore
component /man/2/security-0intro
component /man/2/security-login
@@ -9426,6 +9519,7 @@ component /man/2/styxservers-nametree
component /man/2/sys-dial
component /man/2/sys-fd2path
component /man/2/ubfa
+component /man/2/w3c-uris
component /man/3/tv
component /man/6/colour
component /man/6/ndb
@@ -9460,6 +9554,7 @@ components /man/2/prefab-element
components /man/2/print
components /man/2/ubfa
components /man/2/w3c-css
+components /man/2/w3c-uris
components /man/2/w3c-xpointers
components /man/5/0intro
components /man/6/colour
@@ -9604,6 +9699,7 @@ con /man/2/prefab-element
con /man/2/print
con /man/2/prof
con /man/2/readdir
+con /man/2/rfc822
con /man/2/scsiio
con /man/2/secstore
con /man/2/styx
@@ -9615,6 +9711,7 @@ con /man/2/wmclient
concatblock /man/10/allocb
concatenate /man/1/cat
concatenate /man/1/mash
+concatenated /man/1/ar
concatenated /man/1/mash
concatenated /man/1/sh
concatenated /man/1/sh-string
@@ -10342,12 +10439,14 @@ constants /man/5/0intro
constants /man/6/ubfa
constants /man/8/httpd
constants /man/8/prep
+constituent /man/1/ar
constituent /man/1/sh-regex
constituent /man/10/ar
constituent /man/10/iar
constituent /man/2/prefab-element
constituent /man/2/sys-bind
constituent /man/2/sys-open
+constituents /man/1/ar
constituents /man/10/iar
constr /man/2/asn1
constrained /man/2/asn1
@@ -10408,6 +10507,7 @@ consume /man/9/pack
consumed /man/10/styxserver
consumed /man/2/convcs
consumed /man/2/filter
+consumed /man/2/rfc822
consumed /man/2/sys-byte2char
consumed /man/2/wmclient
consumed /man/2/wmsrv
@@ -10494,6 +10594,7 @@ contains /man/10/styxserver
contains /man/2/alphabet-intro
contains /man/2/asn1
contains /man/2/attrdb
+contains /man/2/csv
contains /man/2/dbm
contains /man/2/debug
contains /man/2/dhcpclient
@@ -10519,6 +10620,7 @@ contains /man/2/prefab-element
contains /man/2/print
contains /man/2/prof
contains /man/2/registries
+contains /man/2/rfc822
contains /man/2/secstore
contains /man/2/security-login
contains /man/2/security-ssl
@@ -10614,6 +10716,7 @@ content /man/2/dbm
content /man/2/format
content /man/2/keyring-getmsg
content /man/2/palmfile
+content /man/2/rfc822
content /man/2/sys-stat
content /man/2/venti
content /man/2/w3c-css
@@ -10690,6 +10793,7 @@ continually /man/2/sys-read
continuation /man/1/mash
continuation /man/1/strings
continuation /man/10/atoi
+continuation /man/2/rfc822
continue /man/1/blur
continue /man/1/deb
continue /man/1/mc
@@ -10719,6 +10823,7 @@ continues /man/9/0intro
continues /man/9/text
continuing /man/1/acme
continuing /man/1/tiny
+continuing /man/2/csv
continuous /man/6/colour
continuously /man/2/sys-millisec
continuously /man/9/options
@@ -10742,6 +10847,7 @@ control /man/1/mc
control /man/1/miniterm
control /man/1/mk
control /man/1/mux
+control /man/1/os
control /man/1/sh
control /man/1/sh-std
control /man/1/tktester
@@ -10929,6 +11035,7 @@ convention /man/2/math-linalg
convention /man/2/sh
convention /man/2/sys-0intro
convention /man/2/sys-dial
+convention /man/2/w3c-uris
convention /man/2/w3c-xpointers
convention /man/3/sd
convention /man/5/0intro
@@ -11119,6 +11226,7 @@ converted /man/2/spki
converted /man/2/spree
converted /man/2/sys-print
converted /man/2/w3c-css
+converted /man/2/w3c-uris
converted /man/2/w3c-xpointers
converted /man/2/xml
converted /man/3/mnt
@@ -11365,6 +11473,7 @@ copy /man/2/sh
copy /man/2/styxservers
copy /man/2/sys-pctl
copy /man/2/sys-tokenize
+copy /man/2/w3c-uris
copy /man/3/env
copy /man/3/ether
copy /man/3/flash
@@ -11698,6 +11807,7 @@ cpu.b /man/1/cpu
cpu.b /man/4/cpu
cpus /man/10/mk
cputype /man/3/arch
+cr /man/1/ar
cr /man/10/iar
crackerbarrel /man/1/math-misc
crackerbarrel.b /man/1/math-misc
@@ -11721,6 +11831,7 @@ create /man/1/alphabet-abc
create /man/1/alphabet-fs
create /man/1/alphabet-grid
create /man/1/alphabet-main
+create /man/1/ar
create /man/1/bind
create /man/1/blur
create /man/1/fs
@@ -11867,6 +11978,7 @@ created /man/2/sys-open
created /man/2/tabs
created /man/2/tk
created /man/2/tkclient
+created /man/2/w3c-uris
created /man/2/wmclient
created /man/2/wmlib
created /man/2/wmsrv
@@ -12115,10 +12227,8 @@ cs /man/1/secstore
cs /man/1/tr
cs /man/1/webgrab
cs /man/2/convcs
-cs /man/2/pop3
cs /man/2/secstore
cs /man/2/security-login
-cs /man/2/smtp
cs /man/2/srv
cs /man/2/sys-dial
cs /man/2/virgil
@@ -12148,7 +12258,10 @@ css.m /man/2/w3c-css
css21 /man/2/w3c-css
csv /man/1/sh
csv /man/1/sh-csv
+csv /man/2/csv
csv.b /man/1/sh-csv
+csv.b /man/2/csv
+csv.m /man/2/csv
ct65545 /man/3/vga
ct65545hwgc /man/3/vga
ctime /man/2/daytime
@@ -12241,6 +12354,7 @@ currency /man/1/units
currency /man/6/keyboard
current /man/1/acme
current /man/1/alphabet-fs
+current /man/1/ar
current /man/1/basename
current /man/1/bind
current /man/1/blur
@@ -12335,6 +12449,7 @@ current /man/2/keyring-sha1
current /man/2/newns
current /man/2/popup
current /man/2/registries
+current /man/2/rfc822
current /man/2/scsiio
current /man/2/security-auth
current /man/2/sh
@@ -12611,6 +12726,7 @@ data /man/2/bufio
data /man/2/bufio-chanfill
data /man/2/convcs
data /man/2/crc
+data /man/2/csv
data /man/2/dbm
data /man/2/debug
data /man/2/devpointer
@@ -12777,6 +12893,7 @@ database /man/4/dbfs
database /man/4/registry
database /man/6/attrdb
database /man/6/ndb
+database /man/7/cddb
database /man/7/db
database /man/7/dbsrv
database /man/8/bootpd
@@ -12790,6 +12907,7 @@ databases /man/2/attrdb
databases /man/2/dbm
databases /man/7/0intro
databook /man/3/i82365
+dataclass /man/2/rfc822
datafd /man/7/db
datafile /man/1/calendar
datafile /man/1/idea
@@ -12805,6 +12923,7 @@ datasource /man/10/odbc
datatype /man/2/venti
dataxx /man/2/plumbmsg
date /man/1/acme
+date /man/1/ar
date /man/1/date
date /man/1/deb
date /man/1/emu
@@ -12820,6 +12939,7 @@ date /man/10/iar
date /man/10/mk
date /man/2/command
date /man/2/keyring-0intro
+date /man/2/rfc822
date /man/2/tk
date /man/8/changelogin
date /man/8/collabsrv
@@ -12833,7 +12953,10 @@ date.b /man/1/date
date.b /man/1/wm-misc
date.dis /man/2/command
date2epoch /man/2/spki
+date2sec /man/2/rfc822
+dates /man/1/ar
dates /man/10/iar
+dates /man/2/rfc822
dates /man/2/sys-0intro
dates /man/8/mkfs
datops /man/2/draw-image
@@ -12848,6 +12971,7 @@ dawes /man/2/format
daytime /man/1/date
daytime /man/2/daytime
daytime /man/2/palmfile
+daytime /man/2/rfc822
daytime /man/8/createsignerkey
daytime.b /man/2/daytime
daytime.m /man/2/daytime
@@ -12859,8 +12983,6 @@ db /man/10/devattach
db /man/10/odbc
db /man/2/attrdb
db /man/2/dbm
-db /man/2/pop3
-db /man/2/smtp
db /man/2/sys-dial
db /man/7/db
db /man/7/dbsrv
@@ -12970,6 +13092,7 @@ deb /man/6/sbl
deb.b /man/1/deb
debate /man/1/diff
debdata.b /man/1/deb
+debian /man/1/ar
debsrc.b /man/1/deb
debug /man/1/0intro
debug /man/1/deb
@@ -13043,6 +13166,7 @@ debugging /man/9/text
debugon /man/3/draw
dec /man/10/a.out
dec /man/2/encoding
+dec /man/2/w3c-uris
decakilometre /man/2/geodesy
decametre /man/2/geodesy
decendants /man/9/destroy
@@ -13177,11 +13301,13 @@ decode /man/1/uuencode
decode /man/2/asn1
decode /man/2/filter-slip
decode /man/2/palmfile
+decode /man/2/w3c-uris
decoded /man/1/uuencode
decoded /man/10/rune
decoded /man/2/asn1
decoded /man/2/dis
decoded /man/2/w3c-css
+decoded /man/2/w3c-uris
decoded /man/6/sexprs
decoder /man/3/mpeg
decoders /man/10/ms2
@@ -13195,6 +13321,7 @@ decoding /man/2/encoding
decoding /man/2/filter-slip
decoding /man/2/ubfa
decoding /man/2/w3c-css
+decoding /man/2/w3c-uris
decoding /man/3/tls
decompress /man/10/5cv
decompresses /man/10/5cv
@@ -13284,6 +13411,7 @@ default /man/1/limbo
default /man/1/listen
default /man/1/logon
default /man/1/look
+default /man/1/man
default /man/1/mash
default /man/1/mash-tk
default /man/1/math-misc
@@ -13354,7 +13482,6 @@ default /man/2/geodesy
default /man/2/keyring-auth
default /man/2/keyset
default /man/2/math-fp
-default /man/2/pop3
default /man/2/prefab-compound
default /man/2/print
default /man/2/prof
@@ -13409,6 +13536,7 @@ default /man/6/man
default /man/6/namespace
default /man/6/ndb
default /man/6/translate
+default /man/7/cddb
default /man/7/db
default /man/7/dbsrv
default /man/8/applylog
@@ -13586,6 +13714,7 @@ defined /man/2/secstore
defined /man/2/sets
defined /man/2/sexprs
defined /man/2/sh
+defined /man/2/smtp
defined /man/2/spki
defined /man/2/spki-verifier
defined /man/2/styx
@@ -13598,6 +13727,7 @@ defined /man/2/sys-self
defined /man/2/sys-stat
defined /man/2/translate
defined /man/2/ubfa
+defined /man/2/w3c-uris
defined /man/2/w3c-xpointers
defined /man/3/cons
defined /man/3/draw
@@ -13806,6 +13936,7 @@ delegate /man/2/spki
delegated /man/6/ndb
delegation /man/2/spki
delete /man/1/acme
+delete /man/1/ar
delete /man/1/brutus
delete /man/1/secstore
delete /man/1/tktester
@@ -13921,8 +14052,10 @@ delimiter /man/2/sys-tokenize
delimiter /man/6/regexp
delimiters /man/1/acme
delimiters /man/10/getfields
+delimiters /man/2/w3c-uris
delimiters /man/2/w3c-xpointers
delimiters /man/3/ssl
+delimiting /man/2/w3c-uris
delims /man/10/getfields
delindex /man/2/spree-cardlib
deliver /man/1/tail
@@ -14076,8 +14209,10 @@ depends /man/9/text
deprecated /man/10/ms2
deprecated /man/10/plan9.ini
deprecated /man/10/print
+deprecated /man/2/w3c-uris
deprecated /man/3/ip
deprecated /man/9/scrollbar
+depressingly /man/2/w3c-uris
depth /man/1/alphabet-fs
depth /man/1/fs
depth /man/1/wm-misc
@@ -14105,6 +14240,8 @@ derived /man/10/0intro
derived /man/10/c2l
derived /man/2/styxservers
derived /man/2/w3c-css
+derived /man/2/w3c-uris
+derived /man/7/cddb
derived /man/9/0intro
derived /man/9/1copyright
des /man/2/keyring-0intro
@@ -14315,6 +14452,7 @@ describing /man/2/convcs
describing /man/2/dbm
describing /man/2/dis
describing /man/2/filter
+describing /man/2/rfc822
describing /man/2/security-ssl
describing /man/2/spree-allow
describing /man/2/styxservers-nametree
@@ -14339,6 +14477,7 @@ descriptions /man/1/sh-std
descriptions /man/1/unicode
descriptions /man/10/qio
descriptions /man/2/draw-font
+descriptions /man/2/rfc822
descriptions /man/2/security-0intro
descriptions /man/4/registry
descriptions /man/5/0intro
@@ -14629,6 +14768,7 @@ details /man/3/prog
details /man/4/archfs
details /man/6/colour
details /man/6/image
+details /man/7/cddb
details /man/8/dhcp
details /man/9/bind
details /man/9/canvas
@@ -15313,6 +15453,7 @@ diagnostics /man/2/sys-iounit
diagnostics /man/2/sys-pipe
diagnostics /man/2/virgil
diagnostics /man/2/w3c-css
+diagnostics /man/2/xml
diagnostics /man/3/boot
diagnostics /man/3/cap
diagnostics /man/3/cmd
@@ -15356,6 +15497,7 @@ dial /man/4/cpu
dial /man/4/export
dial /man/8/collabsrv
dial /man/8/cs
+dial /man/8/httpd
dial /man/8/ping
dial /man/8/rstyxd
dial /man/8/styxchat
@@ -15802,6 +15944,7 @@ directories /man/8/mkfs
directory /man/1/0intro
directory /man/1/acme
directory /man/1/alphabet-fs
+directory /man/1/ar
directory /man/1/basename
directory /man/1/bind
directory /man/1/blur
@@ -16020,6 +16163,7 @@ dis /man/1/emu
dis /man/1/fs
dis /man/1/grid-ns
dis /man/1/limbo
+dis /man/1/man
dis /man/1/mash
dis /man/1/mash-make
dis /man/1/mk
@@ -16061,6 +16205,7 @@ dis /man/6/proto
dis /man/6/sbl
dis /man/8/collabsrv
dis /man/8/init
+dis /man/8/shutdown
dis /man/8/srv
dis /man/8/svc
dis.b /man/2/dis
@@ -16168,6 +16313,7 @@ discarded /man/8/changelogin
discarded /man/9/send
discarding /man/1/charon
discarding /man/2/bufio
+discards /man/1/ar
discards /man/10/allocb
discards /man/10/iar
discards /man/10/plan9.ini
@@ -16203,6 +16349,7 @@ discussed /man/10/qio
discussed /man/2/bufio
discussed /man/2/keyring-0intro
discussed /man/2/sys-stat
+discussed /man/2/w3c-uris
discussion /man/10/2c
discussion /man/2/draw-image
discussion /man/3/draw
@@ -16244,6 +16391,7 @@ diskblocks.b /man/2/diskblocks
diskblocks.m /man/2/diskblocks
diskette /man/8/prep
diskettes /man/8/prep
+diskid /man/7/cddb
disks /man/10/9load
disks /man/2/disks
disks /man/2/scsiio
@@ -16813,6 +16961,7 @@ dossrv /man/10/9load
dossrv /man/3/ds
dossrv /man/4/0intro
dossrv /man/4/dossrv
+dossrv /man/7/cddb
dossrv /man/8/init
dossrv /man/8/prep
dossrv.b /man/4/dossrv
@@ -16847,6 +16996,7 @@ double /man/10/c2l
double /man/10/print
double /man/10/sleep
double /man/2/cfg
+double /man/2/csv
double /man/2/math-export
double /man/2/math-fp
double /man/6/attrdb
@@ -16856,6 +17006,7 @@ double /man/8/prep
double /man/9/bind
double /man/9/entry
double /man/9/text
+doubled /man/2/csv
doubled /man/2/string
doubled /man/9/bind
doublequote /man/1/sh
@@ -17152,6 +17303,7 @@ dropped /man/3/pbus
dropping /man/1/wm-misc
drops /man/3/eia
drops /man/3/ip
+drqtpmx /man/1/ar
drqtpmx /man/10/iar
ds /man/1/units
ds /man/3/ds
@@ -17182,6 +17334,7 @@ dt /man/6/man
dtag /man/9/canvas
dtop /man/2/spree-cardlib
dtr /man/3/eia
+dtt /man/7/cddb
dtype /man/2/disks
dtype /man/2/palmfile
dtype /man/2/styxservers
@@ -17213,6 +17366,7 @@ dump /man/10/acid
dump /man/4/acme
dump /man/8/styxchat
dumpdir /man/4/acme
+dumped /man/7/cddb
dumping /man/1/xd
dumps /man/1/xd
dumps /man/10/panic
@@ -17237,6 +17391,7 @@ duplicated /man/1/uniq
duplicated /man/10/9load
duplicated /man/2/readdir
duplicated /man/8/kfscmd
+duplicates /man/1/ar
duplicates /man/1/disdep
duplicates /man/10/iar
duplicates /man/4/registry
@@ -17553,6 +17708,7 @@ efr /man/1/cprof
eg /man/1/keyboard
eg /man/1/kill
eg /man/1/netstat
+eg /man/1/os
eg /man/1/timestamp
eg /man/1/tiny
eg /man/1/webgrab
@@ -17585,6 +17741,7 @@ eg /man/2/palmfile
eg /man/2/plumbmsg
eg /man/2/print
eg /man/2/registries
+eg /man/2/rfc822
eg /man/2/secstore
eg /man/2/security-login
eg /man/2/srv
@@ -17745,6 +17902,7 @@ els /man/2/names
els /man/2/sexprs
els /man/2/ubfa
elseaction /man/1/sh-std
+elsewhere /man/1/ar
elsewhere /man/1/dmview
elsewhere /man/1/session
elsewhere /man/1/sh
@@ -17762,6 +17920,7 @@ email /man/1/mux
emanating /man/1/sh-file2chan
embedded /man/1/ebook
embedded /man/2/asn1
+embedded /man/2/csv
embedded /man/2/ip
embedded /man/2/math-0intro
embedded /man/9/panel
@@ -17953,6 +18112,8 @@ ename /man/5/error
ename /man/8/styxchat
enc /man/2/encoding
enc /man/2/ida
+enc /man/2/rfc822
+enc /man/2/w3c-uris
enc /man/3/audio
enc /man/3/tls
enc /man/6/audio
@@ -17993,6 +18154,7 @@ encode /man/2/encoding
encode /man/2/filter-slip
encode /man/2/keyring-0intro
encode /man/2/palmfile
+encode /man/2/w3c-uris
encode /man/3/tls
encode /man/6/dis
encode /man/6/image
@@ -18014,6 +18176,8 @@ encoded /man/2/keyring-crypt
encoded /man/2/keyring-ipint
encoded /man/2/math-export
encoded /man/2/palmfile
+encoded /man/2/rfc822
+encoded /man/2/w3c-uris
encoded /man/2/wmsrv
encoded /man/3/tls
encoded /man/3/tv
@@ -18053,10 +18217,12 @@ encoding /man/2/keyring-0intro
encoding /man/2/keyring-getmsg
encoding /man/2/palmfile
encoding /man/2/plumbmsg
+encoding /man/2/rfc822
encoding /man/2/secstore
encoding /man/2/sexprs
encoding /man/2/sys-print
encoding /man/2/ubfa
+encoding /man/2/w3c-uris
encoding /man/3/cons
encoding /man/5/stat
encoding /man/6/audio
@@ -18071,7 +18237,9 @@ encoding.m /man/2/encoding
encodings /man/1/charon
encodings /man/2/asn1
encodings /man/2/encoding
+encodings /man/2/rfc822
encodings /man/2/sexprs
+encodings /man/2/w3c-uris
encodings /man/6/sexprs
encountering /man/10/9load
encountering /man/2/bufio
@@ -18145,6 +18313,7 @@ endarrow /man/2/draw-image
endcontrol /man/1/wm
enddisc /man/2/draw-image
ended /man/10/error
+ended /man/2/rfc822
ended /man/2/wait
ended /man/3/pointer
endian /man/1/auplay
@@ -18610,6 +18779,7 @@ eo /man/1/itest
eoc /man/2/asn1
eof /man/2/bufio
eof /man/2/ir
+eof /man/2/rfc822
eof /man/4/spree
eoff /man/2/dis
eol /man/2/regex
@@ -18635,6 +18805,7 @@ epoch /man/1/timestamp
epoch /man/10/seconds
epoch /man/2/daytime
epoch /man/2/palmfile
+epoch /man/2/rfc822
epoch /man/2/sys-millisec
epoch /man/2/sys-stat
epoch /man/3/cons
@@ -18660,9 +18831,11 @@ eq /man/2/sexprs
eq /man/2/spki
eq /man/2/ubfa
eq /man/2/venti
+eq /man/2/w3c-uris
eq /man/6/man
eqaddr /man/2/ether
eqchan /man/10/newchan
+eqf /man/2/w3c-uris
eqn /man/6/man
eqqid /man/10/newchan
equal /man/1/diff
@@ -18690,6 +18863,7 @@ equal /man/2/stringinttab
equal /man/2/styxservers-nametree
equal /man/2/sys-pctl
equal /man/2/ubfa
+equal /man/2/w3c-uris
equal /man/3/dbg
equal /man/3/ssl
equal /man/5/read
@@ -18743,10 +18917,12 @@ equivalent /man/2/geodesy
equivalent /man/2/ir
equivalent /man/2/keyring-rc4
equivalent /man/2/math-export
+equivalent /man/2/rfc822
equivalent /man/2/secstore
equivalent /man/2/sexprs
equivalent /man/2/sys-dirread
equivalent /man/2/sys-read
+equivalent /man/2/w3c-uris
equivalent /man/2/wmsrv
equivalent /man/3/cmd
equivalent /man/3/draw
@@ -18891,6 +19067,7 @@ error /man/2/bloomfilter
error /man/2/bufio
error /man/2/cfg
error /man/2/convcs
+error /man/2/csv
error /man/2/dbm
error /man/2/debug
error /man/2/dhcpclient
@@ -18954,6 +19131,7 @@ error /man/2/translate
error /man/2/ubfa
error /man/2/venti
error /man/2/w3c-css
+error /man/2/w3c-uris
error /man/2/w3c-xpointers
error /man/2/wait
error /man/2/wmsrv
@@ -19068,6 +19246,7 @@ escape /man/1/xd
escape /man/10/acid
escape /man/2/filter-slip
escape /man/2/sexprs
+escape /man/2/w3c-uris
escape /man/6/keyboard
escape /man/6/sexprs
escape /man/6/translate
@@ -19075,9 +19254,11 @@ escape /man/9/0intro
escaped /man/1/mash
escaped /man/1/mdb
escaped /man/2/tk
+escaped /man/2/w3c-uris
escaped /man/9/0intro
escaped /man/9/bind
escapes /man/10/atoi
+escapes /man/2/w3c-uris
escapes /man/6/sexprs
escaping /man/1/mash
eschews /man/6/keyboard
@@ -19165,6 +19346,7 @@ etc /man/2/draw-image
etc /man/2/ir
etc /man/2/math-elem
etc /man/2/prefab-element
+etc /man/2/rfc822
etc /man/2/spree
etc /man/2/styx
etc /man/2/styxservers
@@ -19365,6 +19547,7 @@ ex /man/6/man
exact /man/1/0intro
exact /man/1/look
exact /man/1/sh-std
+exact /man/1/sh-tk
exact /man/1/wm
exact /man/2/asn1
exact /man/2/tkclient
@@ -19459,6 +19642,7 @@ exceed /man/2/diskblocks
exceed /man/8/prep
exceeded /man/1/charon
exceeded /man/10/qio
+exceeded /man/2/rfc822
exceeded /man/3/ip
exceeds /man/1/charon
exceeds /man/10/dmainit
@@ -19527,6 +19711,7 @@ except /man/2/sys-dial
except /man/2/sys-pctl
except /man/2/sys-print
except /man/2/sys-stat
+except /man/2/w3c-uris
except /man/2/wmsrv
except /man/3/cmd
except /man/3/flash
@@ -19575,6 +19760,7 @@ exception /man/2/math-0intro
exception /man/2/math-fp
exception /man/2/sh
exception /man/2/sys-pipe
+exception /man/2/w3c-uris
exception /man/2/xml
exception /man/3/pipe
exception /man/3/prog
@@ -19690,6 +19876,7 @@ exclusive /man/1/mathcalc
exclusive /man/10/ar
exclusive /man/10/dev
exclusive /man/10/qlock
+exclusive /man/2/keyring-ipint
exclusive /man/2/lock
exclusive /man/2/spree-cardlib
exclusive /man/2/sys-export
@@ -19910,6 +20097,7 @@ exhaustively /man/2/asn1
exist /man/1/0intro
exist /man/1/acme
exist /man/1/alphabet-fs
+exist /man/1/ar
exist /man/1/calendar
exist /man/1/charon
exist /man/1/cprof
@@ -20147,6 +20335,7 @@ exits /man/1/listen
exits /man/1/mathcalc
exits /man/1/mk
exits /man/1/netkey
+exits /man/1/os
exits /man/1/sh
exits /man/1/wm-sh
exits /man/10/mk
@@ -20429,6 +20618,7 @@ expressed /man/3/pnp
expressed /man/3/rtc
expressed /man/6/sexprs
expressed /man/8/cs
+expressed /man/8/httpd
expresses /man/2/spki
expression /man/1/acme
expression /man/1/alphabet-abc
@@ -20542,6 +20732,7 @@ extension /man/4/dossrv
extension /man/6/dis
extensions /man/1/limbo
extensions /man/10/2c
+extensions /man/2/rfc822
extensions /man/3/cons
extensions /man/4/dossrv
extensive /man/10/9load
@@ -20622,6 +20813,7 @@ extra /man/9/grid
extra /man/9/options
extra /man/9/pack
extra /man/9/text
+extract /man/1/ar
extract /man/1/gettar
extract /man/1/secstore
extract /man/1/sh-arg
@@ -20633,6 +20825,7 @@ extract /man/2/convcs
extract /man/2/disks
extract /man/2/print
extract /man/2/sexprs
+extracted /man/1/ar
extracted /man/1/gettar
extracted /man/1/sh-arg
extracted /man/10/iar
@@ -20853,6 +21046,7 @@ false /man/2/palmfile
false /man/2/secstore
false /man/2/sh
false /man/2/styxservers
+false /man/2/w3c-uris
false /man/9/checkbutton
false /man/9/grid
false /man/9/options
@@ -20956,6 +21150,7 @@ fd /man/10/print
fd /man/10/styxserver
fd /man/2/attrdb
fd /man/2/bufio
+fd /man/2/csv
fd /man/2/dhcpclient
fd /man/2/diskblocks
fd /man/2/disks
@@ -20972,6 +21167,7 @@ fd /man/2/keyring-sha1
fd /man/2/print
fd /man/2/readdir
fd /man/2/registries
+fd /man/2/rfc822
fd /man/2/scsiio
fd /man/2/security-auth
fd /man/2/security-ssl
@@ -21123,6 +21319,7 @@ fids /man/2/styxservers
fids /man/5/0intro
fids /man/5/version
field's /man/2/format
+fieldname /man/2/rfc822
fields /man/1/alphabet-fs
fields /man/1/fs
fields /man/1/gettar
@@ -21142,6 +21339,7 @@ fields /man/10/parsecmd
fields /man/10/styx
fields /man/10/styxserver
fields /man/2/crc
+fields /man/2/csv
fields /man/2/dhcpclient
fields /man/2/draw-screen
fields /man/2/format
@@ -21151,8 +21349,10 @@ fields /man/2/plumbmsg
fields /man/2/prefab-element
fields /man/2/print
fields /man/2/prof
+fields /man/2/rfc822
fields /man/2/spki
fields /man/2/sys-stat
+fields /man/2/w3c-uris
fields /man/3/arch
fields /man/3/cmd
fields /man/3/cons
@@ -21191,6 +21391,7 @@ file /man/1/0intro
file /man/1/acme
file /man/1/alphabet-fs
file /man/1/alphabet-main
+file /man/1/ar
file /man/1/asm
file /man/1/auplay
file /man/1/avr
@@ -21340,6 +21541,7 @@ file /man/2/cfg
file /man/2/command
file /man/2/convcs
file /man/2/crc
+file /man/2/csv
file /man/2/daytime
file /man/2/dbm
file /man/2/debug
@@ -21377,6 +21579,7 @@ file /man/2/prof
file /man/2/pslib
file /man/2/readdir
file /man/2/registries
+file /man/2/rfc822
file /man/2/scsiio
file /man/2/secstore
file /man/2/security-auth
@@ -21666,6 +21869,7 @@ files /man/1/0intro
files /man/1/9win
files /man/1/acme
files /man/1/alphabet-fs
+files /man/1/ar
files /man/1/auplay
files /man/1/bind
files /man/1/blur
@@ -21778,6 +21982,7 @@ files /man/2/alphabet-intro
files /man/2/attrdb
files /man/2/bufio
files /man/2/convcs
+files /man/2/csv
files /man/2/dbm
files /man/2/debug
files /man/2/devpointer
@@ -21800,6 +22005,7 @@ files /man/2/plumbmsg
files /man/2/print
files /man/2/prof
files /man/2/readdir
+files /man/2/rfc822
files /man/2/scsiio
files /man/2/secstore
files /man/2/security-0intro
@@ -22095,6 +22301,7 @@ findpair /man/2/attrdb
finds /man/1/acme
finds /man/1/diff
finds /man/1/disdep
+finds /man/1/man
finds /man/1/sh-alphabet
finds /man/1/strings
finds /man/10/9load
@@ -22320,6 +22527,7 @@ floating /man/10/print
floating /man/2/math-0intro
floating /man/2/math-export
floating /man/2/math-fp
+floating /man/2/rfc822
floating /man/2/sys-print
floating /man/9/canvas
floating /man/9/text
@@ -22417,6 +22625,7 @@ fn /man/2/cfg
fn /man/2/command
fn /man/2/convcs
fn /man/2/crc
+fn /man/2/csv
fn /man/2/daytime
fn /man/2/dbm
fn /man/2/debug
@@ -22488,6 +22697,7 @@ fn /man/2/rand
fn /man/2/readdir
fn /man/2/regex
fn /man/2/registries
+fn /man/2/rfc822
fn /man/2/scsiio
fn /man/2/secstore
fn /man/2/security-auth
@@ -22549,6 +22759,7 @@ fn /man/2/venti
fn /man/2/virgil
fn /man/2/volume
fn /man/2/w3c-css
+fn /man/2/w3c-uris
fn /man/2/w3c-xpointers
fn /man/2/wait
fn /man/2/wmclient
@@ -22568,6 +22779,7 @@ fnn /man/1/mux
fns.h /man/10/0intro
fnvram /man/3/tinyfs
focus /man/1/wm
+focus /man/2/rfc822
focus /man/9/0intro
focus /man/9/bind
focus /man/9/button
@@ -22683,6 +22895,7 @@ footypes.b /man/2/alphabet-intro
footypes.m /man/2/alphabet-intro
fopen /man/1/yacc
fopen /man/2/bufio
+fopen /man/2/xml
force100 /man/10/plan9.ini
forced /man/10/delay
forces /man/1/charon
@@ -22747,6 +22960,7 @@ format /man/1/0intro
format /man/1/acme
format /man/1/alphabet-fs
format /man/1/alphabet-main
+format /man/1/ar
format /man/1/auplay
format /man/1/avr
format /man/1/brutus
@@ -22801,6 +23015,7 @@ format /man/2/attrdb
format /man/2/bufio
format /man/2/cfg
format /man/2/convcs
+format /man/2/csv
format /man/2/daytime
format /man/2/devpointer
format /man/2/dis
@@ -22824,6 +23039,7 @@ format /man/2/palmfile
format /man/2/plumbmsg
format /man/2/prefab-element
format /man/2/print
+format /man/2/rfc822
format /man/2/sets
format /man/2/smtp
format /man/2/styx
@@ -23003,6 +23219,7 @@ forms /man/10/conf
forms /man/2/dhcpclient
forms /man/2/ip
forms /man/2/math-0intro
+forms /man/2/rfc822
forms /man/2/sexprs
forms /man/2/spki
forms /man/2/styxservers-nametree
@@ -23109,6 +23326,7 @@ fractions /man/9/text
frag /man/2/ida
fragment /man/2/ida
fragment /man/2/plumbmsg
+fragment /man/2/w3c-uris
fragments /man/2/ida
frags /man/2/ida
frame /man/1/charon
@@ -23166,6 +23384,7 @@ freed /man/2/registries
freed /man/3/cons
freed /man/3/draw
freed /man/5/version
+freedb.freedb.org /man/7/cddb
freedom /man/1/sh
freeing /man/1/mprof
freeing /man/10/allocb
@@ -23207,7 +23426,7 @@ fromfile /man/1/mv
fromfiles /man/1/cp
fromid /man/2/spree
fromuser /man/3/cap
-fromwho /man/2/smtp
+fromwhom /man/2/smtp
fronly /man/2/palmfile
front /man/1/acme
front /man/1/deb
@@ -23271,6 +23490,7 @@ ftlctl /man/3/ftl
ftldata /man/3/ftl
ftldata /man/8/ftl
ftp /man/1/charon
+ftp /man/2/w3c-uris
ftp /man/4/9srvfs
ftp /man/4/ftpfs
ftp.vitanuova.com /man/4/ftpfs
@@ -23404,6 +23624,7 @@ further /man/2/sexprs
further /man/2/spki
further /man/2/spki-verifier
further /man/2/styxservers
+further /man/2/w3c-uris
further /man/3/cap
further /man/3/cmd
further /man/3/draw
@@ -23630,6 +23851,8 @@ generic /man/10/plan9.ini
generic /man/2/alphabet-intro
generic /man/2/convcs
generic /man/2/disks
+generic /man/2/rfc822
+generic /man/2/w3c-uris
generic /man/2/xml
generic /man/6/proto
generic /man/8/mkfs
@@ -23684,6 +23907,7 @@ getb /man/2/bufio
getbtos /man/2/convcs
getbytearray /man/2/keyring-getstring
getc /man/2/bufio
+getc /man/2/rfc822
getcard /man/2/spree-cardlib
getcards /man/2/spree-cardlib
getcsv /man/1/sh-csv
@@ -23703,6 +23927,7 @@ getip /man/2/dhcpclient
getips /man/2/dhcpclient
getkeys /man/2/cfg
getline /man/1/read
+getline /man/2/csv
getlines /man/1/sh-csv
getlines /man/1/sh-sexprs
getlines /man/1/sh-std
@@ -23738,6 +23963,7 @@ gfer /man/3/gpio
gg /man/9/types
gh /man/3/tv
ghost /man/10/panic
+gid /man/1/ar
gid /man/10/ar
gid /man/10/devattach
gid /man/10/iar
@@ -23850,6 +24076,7 @@ gradually /man/10/panic
grained /man/1/wm-misc
gram.y /man/10/mk
grammar /man/1/yacc
+grammar /man/2/rfc822
grammar /man/2/w3c-css
grammar /man/2/w3c-xpointers
grammar /man/6/ubfa
@@ -24036,6 +24263,7 @@ grouping /man/1/mash
grouping /man/1/mc
grouping /man/1/units
grouping /man/9/menu
+groups /man/1/ar
groups /man/1/ls
groups /man/10/iar
groups /man/2/attrdb
@@ -24113,6 +24341,7 @@ gux /man/1/cp
gw /man/3/ip
gwip /man/3/ip
gz /man/1/gzip
+gzip /man/1/ar
gzip /man/1/gzip
gzip /man/10/5cv
gzip /man/10/9load
@@ -24168,6 +24397,7 @@ handled /man/10/conf
handled /man/10/qio
handled /man/2/cfg
handled /man/2/sys-export
+handled /man/2/w3c-uris
handled /man/3/cons
handled /man/3/ds
handled /man/5/flush
@@ -24278,6 +24508,7 @@ hardware /man/3/vga
hardware /man/3/vid
hardware /man/8/bootpd
hasattr /man/2/attrdb
+hasauthority /man/2/w3c-uris
hasexcept /man/6/dis
hash /man/1/alphabet-main
hash /man/1/secstore
@@ -24311,6 +24542,7 @@ hash /man/6/dis
hash /man/6/keys
hash /man/6/keytext
hash /man/6/login
+hash /man/7/cddb
hash.b /man/2/hash
hash.m /man/2/hash
hashalg /man/3/tls
@@ -24384,6 +24616,7 @@ header /man/2/asn1
header /man/2/dis
header /man/2/filter-deflate
header /man/2/keyring-getmsg
+header /man/2/rfc822
header /man/2/spree
header /man/3/ether
header /man/3/ftl
@@ -24401,6 +24634,7 @@ header /man/8/create
headerless /man/10/5cv
headers /man/10/allocb
headers /man/10/inm
+headers /man/2/rfc822
headers /man/2/secstore
headers /man/3/ip
headers /man/3/pbus
@@ -24482,6 +24716,7 @@ helmert /man/2/geodesy
help.html /man/1/charon
helper /man/2/alphabet-intro
helper /man/2/wmsrv
+helpers /man/2/rfc822
helpful /man/1/unicode
helpful /man/8/cs
helpful /man/8/rip
@@ -24533,6 +24768,7 @@ hexadecimal /man/2/registries
hexadecimal /man/2/sets
hexadecimal /man/2/sexprs
hexadecimal /man/2/sys-print
+hexadecimal /man/2/w3c-uris
hexadecimal /man/3/arch
hexadecimal /man/3/dbg
hexadecimal /man/3/ether
@@ -24625,6 +24861,7 @@ higher /man/10/lock
higher /man/10/xalloc
higher /man/2/draw-0intro
higher /man/2/draw-image
+higher /man/2/rfc822
higher /man/2/sets
higher /man/2/wmlib
higher /man/3/flash
@@ -24860,6 +25097,7 @@ host /man/2/srv
host /man/2/sys-dial
host /man/2/tftp
host /man/2/virgil
+host /man/2/w3c-uris
host /man/3/audio
host /man/3/boot
host /man/3/cap
@@ -24893,6 +25131,7 @@ host /man/8/rdbgsrv
host /man/8/register
host /man/8/signer
host /man/8/svc
+host's /man/1/os
host's /man/2/ip
host's /man/2/sys-dial
host's /man/3/cmd
@@ -24942,19 +25181,23 @@ ht /man/2/hash
html /man/1/charon
html /man/1/cook
html /man/1/ebook
+html /man/1/man
html /man/1/webgrab
html /man/2/stringinttab
http /man/1/charon
http /man/1/webgrab
http /man/2/dhcpclient
+http /man/2/rfc822
http /man/2/sexprs
http /man/2/w3c-css
+http /man/2/w3c-uris
http /man/2/w3c-xpointers
http /man/2/xml
http /man/6/ubfa
http /man/8/httpd
http.suff /man/8/httpd
http1.0 /man/1/charon
+httpd /man/2/w3c-uris
httpd /man/8/httpd
httpd.debug /man/8/httpd
httpd.log /man/8/httpd
@@ -25022,6 +25265,7 @@ ia5string /man/2/asn1
iallocb /man/10/allocb
ialt /man/2/dis
iamax /man/2/math-linalg
+iar /man/1/ar
iar /man/10/2l
iar /man/10/ar
iar /man/10/iar
@@ -25231,6 +25475,7 @@ identifier /man/8/bootpd
identifiers /man/2/0intro
identifiers /man/2/asn1
identifiers /man/2/spree
+identifiers /man/2/w3c-uris
identifiers /man/3/draw
identifiers /man/3/prog
identifiers /man/4/spree
@@ -25315,6 +25560,7 @@ idiomatic /man/2/command
idioms /man/1/acme
idiosyncratic /man/6/keyboard
idle /man/10/dmainit
+ids /man/1/ar
ids /man/1/deb
ids /man/1/kill
ids /man/10/iar
@@ -25329,6 +25575,7 @@ ids /man/3/tinyfs
ids /man/4/acme
ids /man/4/kfs
ids /man/4/tarfs
+ids /man/7/cddb
ids /man/8/create
ids /man/9/canvas
idstring /man/3/pnp
@@ -25352,6 +25599,7 @@ ie /man/2/ip
ie /man/2/palmfile
ie /man/2/plumbmsg
ie /man/2/registries
+ie /man/2/rfc822
ie /man/2/secstore
ie /man/2/sexprs
ie /man/2/spki
@@ -25386,6 +25634,7 @@ ifcdir /man/8/dhcp
ifdef /man/10/2c
iff /man/2/ether
iff /man/2/names
+iff /man/2/rfc822
iff /man/2/sexprs
iff /man/2/spki
iff /man/6/dis
@@ -25428,10 +25677,13 @@ ignoring /man/10/2c
ignoring /man/10/newchan
ignoring /man/2/draw-0intro
ignoring /man/2/prefab-compound
+ignoring /man/2/rfc822
ignoring /man/3/draw
ignoring /man/8/prep
+ii /man/2/w3c-uris
iic.c /man/3/i2c
iii /man/10/plan9.ini
+iii /man/2/w3c-uris
il /man/1/netstat
il /man/3/ip
il /man/6/ndb
@@ -25493,6 +25745,7 @@ image /man/2/prefab-element
image /man/2/prefab-style
image /man/2/print
image /man/2/pslib
+image /man/2/rfc822
image /man/2/selectfile
image /man/2/tk
image /man/2/wmclient
@@ -25810,6 +26063,7 @@ import /man/2/ip
import /man/2/itslib
import /man/2/math-export
import /man/2/plumbmsg
+import /man/2/rfc822
import /man/2/sets
import /man/2/sh
import /man/2/spki-verifier
@@ -25825,6 +26079,7 @@ import /man/2/tk
import /man/2/translate
import /man/2/venti
import /man/2/w3c-css
+import /man/2/w3c-uris
import /man/2/w3c-xpointers
import /man/2/wmsrv
import /man/2/xml
@@ -25945,6 +26200,7 @@ include /man/2/cfg
include /man/2/command
include /man/2/convcs
include /man/2/crc
+include /man/2/csv
include /man/2/daytime
include /man/2/dbm
include /man/2/debug
@@ -26021,6 +26277,7 @@ include /man/2/rand
include /man/2/readdir
include /man/2/regex
include /man/2/registries
+include /man/2/rfc822
include /man/2/scsiio
include /man/2/secstore
include /man/2/security-0intro
@@ -26085,6 +26342,7 @@ include /man/2/venti
include /man/2/virgil
include /man/2/volume
include /man/2/w3c-css
+include /man/2/w3c-uris
include /man/2/w3c-xpointers
include /man/2/wmclient
include /man/2/wmlib
@@ -26141,6 +26399,7 @@ included /man/10/kproc
included /man/10/mk
included /man/10/plan9.ini
included /man/2/cfg
+included /man/2/csv
included /man/2/encoding
included /man/2/keyring-sha1
included /man/2/prefab-compound
@@ -26179,6 +26438,7 @@ includes /man/2/keyring-ipint
includes /man/2/security-0intro
includes /man/2/sys-print
includes /man/2/w3c-css
+includes /man/2/w3c-uris
includes /man/3/0intro
includes /man/3/eia
includes /man/3/pbus
@@ -26197,6 +26457,7 @@ inclusion /man/2/prefab-element
inclusive /man/1/mc
inclusive /man/1/strings
inclusive /man/10/plan9.ini
+inclusive /man/2/keyring-ipint
inclusive /man/2/sets
inclusive /man/2/spree-cardlib
inclusive /man/2/string
@@ -26311,6 +26572,7 @@ indeed /man/1/0intro
indeed /man/10/intrenable
indeed /man/2/security-0intro
indeed /man/2/sys-fd2path
+indeed /man/2/w3c-uris
indeed /man/3/srv9
indeed /man/4/9srvfs
indeed /man/4/ramfile
@@ -26343,6 +26605,7 @@ independent /man/2/draw-display
independent /man/2/draw-image
independent /man/2/styx
independent /man/2/sys-0intro
+independent /man/2/w3c-uris
independent /man/3/audio
independent /man/3/draw
independent /man/3/env
@@ -26606,6 +26869,7 @@ infer /man/2/ir
inferface /man/1/wm
inferno /man/1/0intro
inferno /man/1/9win
+inferno /man/1/ar
inferno /man/1/auplay
inferno /man/1/avr
inferno /man/1/bind
@@ -26842,6 +27106,7 @@ init /man/2/cfg
init /man/2/command
init /man/2/convcs
init /man/2/crc
+init /man/2/csv
init /man/2/dbm
init /man/2/debug
init /man/2/devpointer
@@ -26878,6 +27143,7 @@ init /man/2/pslib
init /man/2/rand
init /man/2/readdir
init /man/2/registries
+init /man/2/rfc822
init /man/2/scsiio
init /man/2/secstore
init /man/2/security-auth
@@ -26906,6 +27172,7 @@ init /man/2/translate
init /man/2/ubfa
init /man/2/venti
init /man/2/w3c-css
+init /man/2/w3c-uris
init /man/2/w3c-xpointers
init /man/2/wait
init /man/2/wmclient
@@ -26924,6 +27191,7 @@ init /man/4/namespace
init /man/8/init
initbuiltin /man/2/sh
initialisation /man/1/emu
+initialisation /man/1/sh
initialisation /man/1/toolbar
initialisation /man/10/9load
initialisation /man/10/allocb
@@ -26994,6 +27262,7 @@ initialised /man/2/draw-context
initialised /man/2/draw-display
initialised /man/2/itslib
initialised /man/2/pslib
+initialised /man/2/rfc822
initialised /man/2/sh
initialised /man/2/spree
initialised /man/2/sys-stat
@@ -27210,6 +27479,7 @@ input /man/2/ir
input /man/2/keyring-getstring
input /man/2/math-export
input /man/2/plumbmsg
+input /man/2/rfc822
input /man/2/sexprs
input /man/2/styx
input /man/2/sys-0intro
@@ -27404,6 +27674,7 @@ installs /man/8/create
installs /man/8/prep
instance /man/1/acme
instance /man/1/alphabet-fs
+instance /man/1/ar
instance /man/1/calendar
instance /man/1/collab
instance /man/1/collab-clients
@@ -27441,6 +27712,7 @@ instance /man/2/asn1
instance /man/2/bufio
instance /man/2/bufio-chanfill
instance /man/2/command
+instance /man/2/csv
instance /man/2/dhcpclient
instance /man/2/dialog
instance /man/2/draw-0intro
@@ -27455,6 +27727,7 @@ instance /man/2/keyset
instance /man/2/palmfile
instance /man/2/print
instance /man/2/registries
+instance /man/2/rfc822
instance /man/2/secstore
instance /man/2/security-auth
instance /man/2/selectfile
@@ -27474,6 +27747,7 @@ instance /man/2/sys-print
instance /man/2/sys-self
instance /man/2/sys-stat
instance /man/2/ubfa
+instance /man/2/w3c-uris
instance /man/2/wait
instance /man/2/xml
instance /man/3/dbg
@@ -27511,6 +27785,7 @@ instances /man/10/error
instances /man/2/filter
instances /man/2/styxservers
instances /man/2/sys-dup
+instances /man/2/w3c-uris
instances /man/3/draw
instances /man/3/ip
instances /man/3/srv
@@ -27666,6 +27941,7 @@ int /man/2/rand
int /man/2/readdir
int /man/2/regex
int /man/2/registries
+int /man/2/rfc822
int /man/2/scsiio
int /man/2/secstore
int /man/2/security-auth
@@ -27719,6 +27995,7 @@ int /man/2/ubfa
int /man/2/venti
int /man/2/volume
int /man/2/w3c-css
+int /man/2/w3c-uris
int /man/2/w3c-xpointers
int /man/2/wait
int /man/2/wmclient
@@ -28227,12 +28504,14 @@ internet /man/1/mux
internet /man/2/dhcpclient
internet /man/2/ip
internet /man/2/keyring-sha1
+internet /man/2/rfc822
internet /man/2/sexprs
internet /man/2/srv
internet /man/2/tftp
internet /man/3/ip
internet /man/6/ndb
internet /man/6/sexprs
+internet /man/7/cddb
internet /man/8/bootpd
internet /man/8/cs
internet /man/8/dns
@@ -28273,6 +28552,7 @@ interpretation /man/2/names
interpretation /man/2/registries
interpretation /man/2/styxservers-nametree
interpretation /man/2/sys-fversion
+interpretation /man/2/w3c-uris
interpretation /man/3/cmd
interpretation /man/3/fpga
interpretation /man/3/ip
@@ -28497,6 +28777,7 @@ introduced /man/1/mc
introduced /man/2/cfg
introduced /man/2/w3c-css
introduces /man/2/0intro
+introduces /man/2/w3c-uris
introduction /man/1/0intro
introduction /man/10/0intro
introduction /man/2/0intro
@@ -28521,6 +28802,7 @@ ints /man/3/prog
inttoip /man/2/keyring-ipint
inval /man/2/math-fp
inval /man/3/dbg
+invalid /man/1/ar
invalid /man/1/sh
invalid /man/1/sh-std
invalid /man/10/c2l
@@ -28718,22 +29000,27 @@ io /man/3/i2c
io.h /man/10/0intro
ioalloc /man/3/arch
iob /man/2/format
+iob /man/2/xml
iob /man/3/arch
iobfd /man/3/arch
iobuf /man/1/yacc
iobuf /man/2/attrdb
iobuf /man/2/bufio
iobuf /man/2/bufio-chanfill
+iobuf /man/2/csv
iobuf /man/2/format
iobuf /man/2/imagefile
iobuf /man/2/pslib
+iobuf /man/2/rfc822
iobuf /man/2/sexprs
iobuf /man/2/ubfa
+iobuf /man/2/xml
iobuf.gets /man/6/dis
ioexclude /man/10/plan9.ini
iohdrsz /man/10/styx
iohdrsz /man/2/styx
iol /man/3/arch
+ior /man/2/keyring-ipint
iostats /man/4/iostats
iostats.b /man/4/iostats
iostats.out /man/4/iostats
@@ -28778,7 +29065,6 @@ ip /man/8/cs
ip /man/8/dhcp
ip /man/8/dns
ip /man/8/fpgaload
-ip /man/8/httpd
ip /man/8/init
ip /man/8/logind
ip /man/8/ping
@@ -28889,6 +29175,7 @@ isa /man/10/dmainit
isa /man/10/plan9.ini
isa /man/3/pnp
isa.h /man/6/dis
+isabsolute /man/2/w3c-uris
isaconfig /man/10/inb
isatom /man/2/ubfa
isbinary /man/2/ubfa
@@ -28929,6 +29216,7 @@ isn't /man/9/text
isnan /man/2/math-fp
iso /man/1/charon
iso /man/2/palmfile
+iso /man/2/rfc822
iso /man/4/dossrv
iso /man/6/utf
iso11172 /man/3/mpeg
@@ -29307,6 +29595,7 @@ kexec /man/2/tftp
kexec /man/3/boot
key /man/1/acme
key /man/1/alphabet-main
+key /man/1/ar
key /man/1/charon
key /man/1/crypt
key /man/1/idea
@@ -29577,6 +29866,7 @@ keytext /man/6/auth
keytext /man/6/keytext
keyword /man/1/man
keyword /man/1/mc
+keyword /man/2/keyring-ipint
keywords /man/1/man
keywords /man/1/mash
keywords /man/10/c2l
@@ -29615,6 +29905,7 @@ kids /man/2/prefab-element
kill /man/1/acme
kill /man/1/grid-monitor
kill /man/1/kill
+kill /man/1/os
kill /man/1/ps
kill /man/1/wm-misc
kill /man/10/acid
@@ -29634,6 +29925,7 @@ kill /man/8/cs
kill.b /man/1/kill
killed /man/1/deb
killed /man/1/grid-monitor
+killed /man/1/os
killed /man/10/kproc
killed /man/3/cmd
killed /man/3/prog
@@ -29766,6 +30058,7 @@ labour /man/1/alphabet-abc
labour /man/1/alphabet-grid
labs /man/10/0intro
labs /man/2/dialog
+lack /man/1/os
lack /man/1/sh
lack /man/8/dns
lack /man/8/ping
@@ -29873,6 +30166,7 @@ latexslides /man/1/cook
latexslides /man/2/stringinttab
latin /man/10/kbdputc
latin /man/2/palmfile
+latin /man/2/rfc822
latin /man/2/sys-0intro
latin /man/6/keyboard
latin1 /man/2/convcs
@@ -29984,7 +30278,9 @@ leading /man/1/uuencode
leading /man/10/atoi
leading /man/2/ip
leading /man/2/math-linalg
+leading /man/2/rfc822
leading /man/2/string
+leading /man/2/w3c-uris
leading /man/2/xml
leading /man/3/cons
leading /man/3/ether
@@ -30279,6 +30575,7 @@ level /man/2/filter-deflate
level /man/2/ida
level /man/2/itslib
level /man/2/prefab-compound
+level /man/2/rfc822
level /man/2/scsiio
level /man/2/security-0intro
level /man/2/sh
@@ -30350,6 +30647,7 @@ levels /man/2/keyring-0intro
levels /man/2/security-0intro
levels /man/2/venti
lex /man/1/yacc
+lex /man/2/rfc822
lex.c /man/10/mk
lex.lval.v /man/1/yacc
lex.o /man/10/mk
@@ -30408,6 +30706,7 @@ lib /man/2/bufio
lib /man/2/cfg
lib /man/2/convcs
lib /man/2/crc
+lib /man/2/csv
lib /man/2/daytime
lib /man/2/dbm
lib /man/2/debug
@@ -30448,6 +30747,7 @@ lib /man/2/pslib
lib /man/2/rand
lib /man/2/readdir
lib /man/2/regex
+lib /man/2/rfc822
lib /man/2/scsiio
lib /man/2/secstore
lib /man/2/security-auth
@@ -30477,6 +30777,7 @@ lib /man/2/venti
lib /man/2/virgil
lib /man/2/volume
lib /man/2/w3c-css
+lib /man/2/w3c-uris
lib /man/2/w3c-xpointers
lib /man/2/wmclient
lib /man/2/wmlib
@@ -30504,6 +30805,7 @@ lib /man/8/plumber
lib /man/8/srv
lib /man/8/styxmon
lib /man/8/svc
+lib.a /man/1/ar
lib.a /man/10/iar
lib.h /man/10/0intro
lib9 /man/10/getfields
@@ -30577,6 +30879,7 @@ libprefab /man/2/prefab-element
libprefab /man/2/prefab-environ
libprefab /man/2/prefab-style
libprefab /man/4/namespace
+libraries /man/1/ar
libraries /man/10/0intro
libraries /man/10/2c
libraries /man/10/2l
@@ -30745,6 +31048,7 @@ limit /man/10/lock
limit /man/10/plan9.ini
limit /man/10/qio
limit /man/2/0intro
+limit /man/2/rfc822
limit /man/2/sets
limit /man/2/styx
limit /man/3/cons
@@ -30801,6 +31105,7 @@ linalg /man/2/0intro
linalg /man/2/math-0intro
linalg /man/2/math-linalg
line's /man/2/attrdb
+line's /man/2/rfc822
line's /man/9/text
line.char /man/9/text
linear /man/1/mash
@@ -30861,6 +31166,7 @@ lines /man/2/plumbmsg
lines /man/2/prefab-compound
lines /man/2/print
lines /man/2/prof
+lines /man/2/rfc822
lines /man/2/secstore
lines /man/2/smtp
lines /man/3/audio
@@ -30934,6 +31240,7 @@ links /man/2/wmsrv
links /man/4/ftpfs
links /man/6/sexprs
linksys /man/10/plan9.ini
+linux /man/1/ar
linux /man/10/conf
linux /man/10/styxserver
linux /man/4/namespace
@@ -30943,6 +31250,7 @@ linuxswap /man/8/prep
lisp /man/2/sexprs
lisp's /man/2/sexprs
list /man/1/acme
+list /man/1/ar
list /man/1/blur
list /man/1/charon
list /man/1/cook
@@ -31014,6 +31322,7 @@ list /man/2/attrdb
list /man/2/cfg
list /man/2/command
list /man/2/convcs
+list /man/2/csv
list /man/2/debug
list /man/2/dhcpclient
list /man/2/dialog
@@ -31041,6 +31350,7 @@ list /man/2/prefab-element
list /man/2/print
list /man/2/prof
list /man/2/registries
+list /man/2/rfc822
list /man/2/scsiio
list /man/2/secstore
list /man/2/security-auth
@@ -31139,6 +31449,7 @@ listbox /man/9/listbox
listbox's /man/9/listbox
listboxes /man/1/tktester
listboxes /man/9/listbox
+listed /man/1/ar
listed /man/1/ftree
listed /man/1/grid-ns
listed /man/1/grid-register
@@ -31214,6 +31525,7 @@ listens /man/8/httpd
listens /man/8/srv
listens /man/8/svc
listing /man/1/acme
+listing /man/1/ar
listing /man/1/asm
listing /man/1/env
listing /man/1/gettar
@@ -31265,6 +31577,7 @@ lists /man/2/registries
lists /man/2/sexprs
lists /man/2/sh
lists /man/2/w3c-css
+lists /man/2/w3c-uris
lists /man/2/w3c-xpointers
lists /man/3/dynld
lists /man/3/indir
@@ -31364,6 +31677,7 @@ load /man/2/cfg
load /man/2/command
load /man/2/convcs
load /man/2/crc
+load /man/2/csv
load /man/2/daytime
load /man/2/dbm
load /man/2/debug
@@ -31440,6 +31754,7 @@ load /man/2/rand
load /man/2/readdir
load /man/2/regex
load /man/2/registries
+load /man/2/rfc822
load /man/2/scsiio
load /man/2/secstore
load /man/2/security-auth
@@ -31503,6 +31818,7 @@ load /man/2/venti
load /man/2/virgil
load /man/2/volume
load /man/2/w3c-css
+load /man/2/w3c-uris
load /man/2/w3c-xpointers
load /man/2/wait
load /man/2/wmclient
@@ -31589,6 +31905,7 @@ loader /man/10/5cv
loader /man/10/dynld
loader /man/2/dis
loader /man/6/dis
+loaders /man/1/ar
loaders /man/10/2c
loaders /man/10/2l
loaders /man/10/9load
@@ -31852,6 +32169,7 @@ logwindow /man/1/logwindow
logwindow /man/4/logfile
logwindow.b /man/1/logwindow
log₂ /man/2/bloomfilter
+lone /man/2/csv
longer /man/1/acme
longer /man/1/miniterm
longer /man/1/prof
@@ -31904,7 +32222,6 @@ looking /man/2/spree-objstore
looking /man/6/ndb
looking /man/8/httpd
lookman /man/1/man
-lookman.b /man/1/man
looks /man/1/0intro
looks /man/1/ps
looks /man/1/sh
@@ -31952,6 +32269,7 @@ loops /man/10/lock
loops /man/2/math-linalg
loops /man/6/colour
loosely /man/1/sh
+loosely /man/2/rfc822
lose /man/1/wm
loses /man/2/filepat
losing /man/2/sh
@@ -32005,6 +32323,7 @@ lower /man/10/error
lower /man/2/convcs
lower /man/2/draw-rect
lower /man/2/encoding
+lower /man/2/rfc822
lower /man/2/security-0intro
lower /man/2/sexprs
lower /man/2/sh
@@ -32014,6 +32333,7 @@ lower /man/2/sys-fversion
lower /man/2/sys-print
lower /man/2/tk
lower /man/2/w3c-css
+lower /man/2/w3c-uris
lower /man/3/tv
lower /man/6/keyboard
lower /man/6/man
@@ -32056,6 +32376,7 @@ lpt?raw /man/10ti925/tihost
lr /man/1/yacc
lr /man/6/man
ls /man/1/alphabet-fs
+ls /man/1/ar
ls /man/1/chgrp
ls /man/1/chmod
ls /man/1/fs
@@ -32230,6 +32551,7 @@ mail /man/2/dhcpclient
mail /man/2/encoding
mail /man/2/keyring-0intro
mail /man/2/pop3
+mail /man/2/rfc822
mail /man/2/smtp
mail /man/2/translate
mail /man/4/ftpfs
@@ -32240,12 +32562,11 @@ mailbox /man/2/pop3
mailboxes /man/4/namespace
mailpop3 /man/1/acme
mailserver /man/1/sendmail
-mailserver /man/2/pop3
-mailserver /man/2/smtp
main /man/1/alphabet-abc
main /man/1/alphabet-fs
main /man/1/alphabet-grid
main /man/1/alphabet-main
+main /man/1/ar
main /man/1/charon
main /man/1/deb
main /man/1/emu
@@ -32323,12 +32644,14 @@ maintained /man/2/wmlib
maintained /man/3/logfs
maintained /man/4/dbfs
maintained /man/4/memfs
+maintainer /man/1/ar
maintainer /man/10/iar
maintaining /man/2/convcs
maintaining /man/3/draw
maintaining /man/4/factotum
maintaining /man/8/dhcp
maintains /man/1/acme
+maintains /man/1/ar
maintains /man/10/devattach
maintains /man/10/iar
maintains /man/10/plan9.ini
@@ -32369,9 +32692,11 @@ malloc /man/10/xalloc
mallocz /man/10/error
mallocz /man/10/malloc
man.b /man/1/man
+man2html /man/1/man
man2txt /man/1/man
man2txt.b /man/1/man
manage /man/1/0intro
+manage /man/1/ar
manage /man/1/gettar
manage /man/1/wm
manage /man/1/wm-sh
@@ -32465,7 +32790,9 @@ manga /man/8/mangaload
mangaload /man/8/mangaload
mangaload.b /man/8/mangaload
manga™ /man/8/mangaload
+manifest /man/1/ar
manifestation /man/6/utf
+manipulate /man/1/ar
manipulate /man/1/blur
manipulate /man/10/dev
manipulate /man/10/odbc
@@ -32589,6 +32916,7 @@ map /man/2/draw-0intro
map /man/2/draw-display
map /man/2/imagefile
map /man/2/print
+map /man/2/rfc822
map /man/3/draw
map /man/3/fs
map /man/3/ip
@@ -32789,6 +33117,7 @@ match /man/2/filter
match /man/2/keyring-0intro
match /man/2/popup
match /man/2/regex
+match /man/2/rfc822
match /man/2/security-0intro
match /man/2/selectfile
match /man/2/spree-allow
@@ -32971,6 +33300,7 @@ maximum /man/2/factotum
maximum /man/2/keyring-0intro
maximum /man/2/math-fp
maximum /man/2/palmfile
+maximum /man/2/rfc822
maximum /man/2/spree-gather
maximum /man/2/styx
maximum /man/2/sys-fversion
@@ -33003,6 +33333,7 @@ maxmembers /man/2/spree-gather
maxn /man/2/venti
maxpkt /man/3/usb
maxraint /man/2/ip
+maxrequest /man/2/rfc822
maxrpc /man/2/styx
maxsd53c8xx /man/10/plan9.ini
maxsize /man/1/emu
@@ -33081,6 +33412,7 @@ meaningful /man/1/charon
meaningful /man/1/tktester
meaningful /man/2/wmsrv
meaningless /man/1/acme
+meanings /man/1/ar
meanings /man/10/iar
meanings /man/10ti925/tihost
meant /man/1/cpu
@@ -33132,6 +33464,7 @@ mechanisms /man/9/canvas
medblue /man/2/draw-display
medgreen /man/2/draw-display
media /man/10/plan9.ini
+media /man/2/rfc822
media /man/2/scsiio
media /man/2/w3c-css
media /man/3/ip
@@ -33296,6 +33629,7 @@ memsize /man/6/dis
memstart /man/2/prof
memstats /man/2/prof
mention /man/10/2l
+mentioned /man/1/ar
mentioned /man/1/sendmail
mentioned /man/1/sh
mentioned /man/10/2l
@@ -33359,9 +33693,7 @@ merge /man/1/alphabet-fs
merge /man/1/fs
merge /man/1/sh-string
merge /man/9/grid
-merged /man/1/os
merged /man/2/spree
-merged /man/3/cmd
merging /man/1/alphabet-fs
merging /man/1/fs
mersenne /man/1/math-misc
@@ -33663,7 +33995,10 @@ millliseconds /man/10/sleep
mime /man/1/charon
mime /man/2/encoding
mime /man/2/keyring-0intro
+mime /man/2/rfc822
mime /man/6/sexprs
+mimefields /man/2/rfc822
+mimetype /man/2/rfc822
mimic /man/1/ebook
mimic /man/2/sys-werrstr
mimicked /man/1/tiny
@@ -33773,10 +34108,12 @@ miscellaneous /man/1/wm-misc
miscellaneous /man/3/cons
miscellany /man/1/acme
mishandled /man/3/draw
+misinterpreted /man/2/w3c-uris
misleading /man/8/rip
mismatch /man/10/2c
mismatches /man/2/sys-stat
missing /man/1/acme
+missing /man/1/ar
missing /man/1/look
missing /man/1/mk
missing /man/1/mkdir
@@ -33811,6 +34148,7 @@ mk /man/10/acid
mk /man/10/conf
mk /man/10/mk
mk /man/2/draw-display
+mk /man/2/rfc822
mk /man/4/namespace
mk's /man/1/mk
mk's /man/10/mk
@@ -33906,6 +34244,7 @@ mod.dis /man/1/limbo
mod.types /man/2/dis
mode /man/1/9win
mode /man/1/alphabet-fs
+mode /man/1/ar
mode /man/1/chmod
mode /man/1/cp
mode /man/1/crypt
@@ -34005,6 +34344,7 @@ modes /man/9/listbox
modes /man/9/text
modf /man/2/math-fp
modification /man/1/alphabet-fs
+modification /man/1/ar
modification /man/1/bind
modification /man/1/du
modification /man/1/fs
@@ -34039,6 +34379,7 @@ modifications /man/9/entry
modifications /man/9/text
modified /man/1/acme
modified /man/1/alphabet-fs
+modified /man/1/ar
modified /man/1/charon
modified /man/1/cp
modified /man/1/du
@@ -34071,6 +34412,7 @@ modified /man/9/text
modifier /man/10/devattach
modifier /man/2/sys-stat
modifier /man/9/text
+modifiers /man/1/ar
modifiers /man/10/iar
modifiers /man/9/text
modifies /man/2/command
@@ -34184,6 +34526,7 @@ module /man/2/cfg
module /man/2/command
module /man/2/convcs
module /man/2/crc
+module /man/2/csv
module /man/2/dbm
module /man/2/debug
module /man/2/dhcpclient
@@ -34222,6 +34565,7 @@ module /man/2/prof
module /man/2/pslib
module /man/2/regex
module /man/2/registries
+module /man/2/rfc822
module /man/2/scsiio
module /man/2/secstore
module /man/2/security-0intro
@@ -34254,6 +34598,7 @@ module /man/2/translate
module /man/2/ubfa
module /man/2/venti
module /man/2/w3c-css
+module /man/2/w3c-uris
module /man/2/w3c-xpointers
module /man/2/wait
module /man/2/wmclient
@@ -34547,6 +34892,7 @@ mouse /man/1/collab-clients
mouse /man/1/emu
mouse /man/1/keyboard
mouse /man/1/logon
+mouse /man/1/man
mouse /man/1/mash-tk
mouse /man/1/miniterm
mouse /man/1/session
@@ -34584,6 +34930,7 @@ mouse /man/9/text
mouse /man/9/update
mouseport /man/10/plan9.ini
move /man/1/acme
+move /man/1/ar
move /man/1/cprof
move /man/1/ebook
move /man/1/ftree
@@ -34763,6 +35110,7 @@ multicast /man/3/ether
multicast /man/3/ip
multiflag /man/10/getfields
multimaster /man/10/plan9.ini
+multipart /man/2/rfc822
multiples /man/10/devattach
multiples /man/2/diskblocks
multiples /man/2/spree-cardlib
@@ -34798,6 +35146,7 @@ multiprocessor /man/10/lock
multiprocessor /man/10/plan9.ini
multiprocessor /man/10/sleep
multiprocessors /man/10/splhi
+multipurpose /man/2/rfc822
multisync135 /man/10/plan9.ini
musicam,i /man/3/mpeg
musicam,ii /man/3/mpeg
@@ -34867,6 +35216,7 @@ names /man/1/0intro
names /man/1/acme
names /man/1/alphabet-fs
names /man/1/alphabet-main
+names /man/1/ar
names /man/1/basename
names /man/1/charon
names /man/1/cleanname
@@ -35140,6 +35490,8 @@ ndb /man/1/grid-localreg
ndb /man/10/9load
ndb /man/2/attrdb
ndb /man/2/dhcpclient
+ndb /man/2/pop3
+ndb /man/2/smtp
ndb /man/4/namespace
ndb /man/4/registry
ndb /man/6/attrdb
@@ -35213,6 +35565,7 @@ necessary /man/2/keyring-0intro
necessary /man/2/palmfile
necessary /man/2/prefab-element
necessary /man/2/prefab-environ
+necessary /man/2/rfc822
necessary /man/2/security-0intro
necessary /man/2/spki
necessary /man/2/styxpersist
@@ -35271,6 +35624,7 @@ needed /man/2/spree
needed /man/2/styxservers
needed /man/2/sys-dirread
needed /man/2/sys-pctl
+needed /man/2/w3c-uris
needed /man/2/xml
needed /man/3/dbg
needed /man/3/ip
@@ -35341,6 +35695,7 @@ negative /man/2/math-fp
negative /man/2/plumbmsg
negative /man/2/prof
negative /man/2/rand
+negative /man/2/rfc822
negative /man/2/secstore
negative /man/2/sets
negative /man/2/styxservers
@@ -35379,6 +35734,7 @@ negotiation /man/4/import
negotiation /man/7/db
neighbour /man/9/text
neither /man/1/alphabet-fs
+neither /man/1/ar
neither /man/1/charon
neither /man/1/cprof
neither /man/1/fs
@@ -35615,6 +35971,7 @@ newline /man/10/panic
newline /man/2/arg
newline /man/2/asn1
newline /man/2/bufio
+newline /man/2/csv
newline /man/2/dialog
newline /man/2/keyring-certtostr
newline /man/2/keyring-getmsg
@@ -35747,6 +36104,7 @@ nil /man/2/bufio
nil /man/2/cfg
nil /man/2/command
nil /man/2/convcs
+nil /man/2/csv
nil /man/2/dbm
nil /man/2/debug
nil /man/2/devpointer
@@ -35793,6 +36151,7 @@ nil /man/2/prefab-compound
nil /man/2/prefab-element
nil /man/2/regex
nil /man/2/registries
+nil /man/2/rfc822
nil /man/2/scsiio
nil /man/2/secstore
nil /man/2/security-auth
@@ -35834,6 +36193,7 @@ nil /man/2/translate
nil /man/2/ubfa
nil /man/2/virgil
nil /man/2/w3c-css
+nil /man/2/w3c-uris
nil /man/2/w3c-xpointers
nil /man/2/wait
nil /man/2/wmclient
@@ -35881,6 +36241,7 @@ nodev /man/6/namespace
nodevs /man/1/sh-std
nodevs /man/2/sys-pctl
nodevs /man/6/namespace
+nodots /man/2/w3c-uris
nodummyrr /man/10/plan9.ini
noecho /man/4/acme
noerror /man/1/dd
@@ -35972,6 +36333,7 @@ non /man/2/print
non /man/2/rand
non /man/2/regex
non /man/2/registries
+non /man/2/rfc822
non /man/2/scsiio
non /man/2/security-auth
non /man/2/sets
@@ -36185,6 +36547,7 @@ notation /man/9/types
notbefore /man/2/spki
note /man/1/acme
note /man/1/alphabet-fs
+note /man/1/ar
note /man/1/bind
note /man/1/fc
note /man/1/fs
@@ -36217,6 +36580,7 @@ note /man/2/bufio
note /man/2/cfg
note /man/2/command
note /man/2/convcs
+note /man/2/csv
note /man/2/daytime
note /man/2/geodesy
note /man/2/palmfile
@@ -36233,6 +36597,7 @@ note /man/2/styxservers-nametree
note /man/2/sys-dial
note /man/2/sys-self
note /man/2/translate
+note /man/2/w3c-uris
note /man/2/wmsrv
note /man/2/xml
note /man/3/dbg
@@ -36375,6 +36740,7 @@ ntfs /man/3/fs
ntfs /man/8/prep
nthreads /man/1/charon
ntp /man/8/sntp
+ntracks /man/7/cddb
ntsc /man/2/draw-image
ntsc /man/3/tv
ntsc /man/3/vid
@@ -36459,6 +36825,7 @@ numblocks /man/1/zeros
numeral /man/1/acme
numeral /man/2/ir
numerator /man/6/keyboard
+numeric /man/1/ar
numeric /man/1/charon
numeric /man/1/kill
numeric /man/1/look
@@ -36531,6 +36898,7 @@ obj /man/2/spree
obj /man/2/spree-allow
obj /man/2/spree-cardlib
obj /man/2/ubfa
+object /man/1/ar
object /man/1/asm
object /man/1/bind
object /man/1/disdep
@@ -36830,6 +37198,7 @@ octal /man/6/proto
octal /man/6/sexprs
octal /man/8/kfscmd
octet /man/2/asn1
+octet /man/2/rfc822
octet /man/8/httpd
octets /man/2/asn1
octetstring /man/2/asn1
@@ -36963,6 +37332,7 @@ ok /man/1/sh-test
ok /man/1/tktester
ok /man/2/ip
ok /man/2/itslib
+ok /man/2/rfc822
ok /man/2/security-auth
ok /man/2/tkclient
ok /man/2/venti
@@ -36971,6 +37341,7 @@ ok /man/4/factotum
ok /man/4/keyfs
ok /man/8/rdbgsrv
ok /man/9/canvas
+oks /man/2/rfc822
old.bundle /man/1/alphabet-fs
old.bundle /man/1/fs
old.index.html /man/1/webgrab
@@ -37055,6 +37426,7 @@ ones /man/10/plan9.ini
ones /man/2/0intro
ones /man/2/draw-display
ones /man/2/ip
+ones /man/2/keyring-ipint
ones /man/2/translate
ones /man/3/cons
ones /man/3/ds
@@ -37067,6 +37439,7 @@ ones /man/8/styxchat
ones /man/9/text
onetbiosns /man/2/dhcpclient
onodetype /man/2/w3c-xpointers
+onscreen /man/1/sh-tk
onscreen /man/1/wm
onscreen /man/2/tkclient
onscreen /man/2/wmclient
@@ -37316,6 +37689,7 @@ operation /man/10/dmainit
operation /man/10/plan9.ini
operation /man/10/qio
operation /man/10/styxserver
+operation /man/2/csv
operation /man/2/dbm
operation /man/2/dhcpclient
operation /man/2/dis
@@ -37332,6 +37706,7 @@ operation /man/2/keyring-ipint
operation /man/2/math-export
operation /man/2/math-fp
operation /man/2/prefab-element
+operation /man/2/rfc822
operation /man/2/scsiio
operation /man/2/secstore
operation /man/2/sexprs
@@ -37343,6 +37718,7 @@ operation /man/2/sys-open
operation /man/2/sys-stat
operation /man/2/ubfa
operation /man/2/w3c-css
+operation /man/2/w3c-uris
operation /man/2/w3c-xpointers
operation /man/3/dbg
operation /man/3/dup
@@ -37359,6 +37735,7 @@ operations /man/1/mash
operations /man/1/mash-make
operations /man/1/mprof
operations /man/1/nsbuild
+operations /man/1/os
operations /man/1/secstore
operations /man/1/sh
operations /man/1/sh-alphabet
@@ -37393,6 +37770,7 @@ operations /man/2/math-0intro
operations /man/2/names
operations /man/2/prefab-0intro
operations /man/2/registries
+operations /man/2/rfc822
operations /man/2/scsiio
operations /man/2/sets
operations /man/2/sexprs
@@ -37407,6 +37785,7 @@ operations /man/2/sys-bind
operations /man/2/sys-export
operations /man/2/sys-iounit
operations /man/2/ubfa
+operations /man/2/w3c-uris
operations /man/2/wmsrv
operations /man/3/dbg
operations /man/3/draw
@@ -37513,6 +37892,7 @@ option /man/1/9win
option /man/1/acme
option /man/1/alphabet-fs
option /man/1/alphabet-main
+option /man/1/ar
option /man/1/asm
option /man/1/auplay
option /man/1/avr
@@ -37629,6 +38009,7 @@ option /man/4/ramfile
option /man/4/registry
option /man/6/namespace
option /man/6/sbl
+option /man/7/cddb
option /man/8/applylog
option /man/8/bootpd
option /man/8/changelogin
@@ -37674,6 +38055,7 @@ option's /man/1/sh-arg
option's /man/9/options
option's /man/9/text
optional /man/1/acme
+optional /man/1/ar
optional /man/1/bind
optional /man/1/calendar
optional /man/1/charon
@@ -37708,8 +38090,10 @@ optional /man/2/factotum
optional /man/2/geodesy
optional /man/2/math-linalg
optional /man/2/palmfile
+optional /man/2/rfc822
optional /man/2/spki
optional /man/2/w3c-css
+optional /man/2/w3c-uris
optional /man/2/w3c-xpointers
optional /man/3/cmd
optional /man/3/cons
@@ -37728,6 +38112,7 @@ optional /man/6/proto
optional /man/6/sbl
optional /man/6/sexprs
optional /man/6/translate
+optional /man/7/cddb
optional /man/8/create
optional /man/8/cs
optional /man/9/bind
@@ -37735,6 +38120,7 @@ optional /man/9/frame
optional /man/9/text
optional /man/9/types
optionally /man/1/alphabet-main
+optionally /man/1/ar
optionally /man/1/cprof
optionally /man/1/du
optionally /man/1/echo
@@ -38035,6 +38421,7 @@ original /man/2/sys-fd2path
original /man/2/sys-fversion
original /man/2/translate
original /man/2/w3c-css
+original /man/2/w3c-uris
original /man/3/srv
original /man/5/0intro
original /man/6/sbl
@@ -38331,6 +38718,7 @@ output /man/4/cpu
output /man/4/iostats
output /man/6/colour
output /man/6/man
+output /man/7/cddb
output /man/8/applylog
output /man/8/bootpd
output /man/8/create
@@ -38576,6 +38964,7 @@ package /man/6/man
package /man/8/create
package.tgz /man/4/ftpfs
packaged /man/2/prefab-element
+packages /man/1/ar
packages /man/1/man
packages /man/8/create
packblock /man/10/allocb
@@ -38782,6 +39171,7 @@ pairs /man/2/keyring-0intro
pairs /man/2/plumbmsg
pairs /man/2/pop3
pairs /man/2/registries
+pairs /man/2/rfc822
pairs /man/2/spree
pairs /man/2/stringinttab
pairs /man/2/styxpersist
@@ -38919,6 +39309,7 @@ parameter /man/2/ida
parameter /man/2/keyring-sha1
parameter /man/2/plumbmsg
parameter /man/2/popup
+parameter /man/2/rfc822
parameter /man/2/secstore
parameter /man/2/styx
parameter /man/2/styxservers
@@ -38927,6 +39318,7 @@ parameter /man/2/sys-read
parameter /man/2/sys-self
parameter /man/2/ubfa
parameter /man/2/w3c-css
+parameter /man/2/w3c-uris
parameter /man/2/w3c-xpointers
parameter /man/3/0intro
parameter /man/3/dbg
@@ -38960,6 +39352,7 @@ parameters /man/2/keyring-0intro
parameters /man/2/keyring-auth
parameters /man/2/keyring-gensk
parameters /man/2/math-linalg
+parameters /man/2/rfc822
parameters /man/2/security-0intro
parameters /man/2/security-login
parameters /man/2/sexprs
@@ -38981,6 +39374,7 @@ parameters /man/6/ndb
parameters /man/8/dhcp
params /man/10/plan9.ini
params /man/2/factotum
+params /man/2/rfc822
params /man/2/xml
parcel /man/9/pack
parent /man/1/0intro
@@ -39053,12 +39447,14 @@ parse /man/2/dhcpclient
parse /man/2/ether
parse /man/2/ip
parse /man/2/math-0intro
+parse /man/2/rfc822
parse /man/2/sexprs
parse /man/2/sh
parse /man/2/spki
parse /man/2/styxservers
parse /man/2/venti
parse /man/2/w3c-css
+parse /man/2/w3c-uris
parse /man/2/w3c-xpointers
parse /man/2/wait
parse /man/5/stat
@@ -39069,6 +39465,7 @@ parsecidr /man/2/ip
parsecmd /man/10/parsecmd
parsecmd /man/3/cmd
parsecompound /man/2/spki
+parsecontent /man/2/rfc822
parsed /man/1/mash
parsed /man/1/sh-arg
parsed /man/1/tiny
@@ -39088,6 +39485,7 @@ parseline /man/2/attrdb
parseman.b /man/1/man
parsemask /man/2/ip
parsename /man/2/spki
+parseparams /man/2/rfc822
parser /man/1/yacc
parser /man/2/asn1
parser /man/2/cfg
@@ -39105,6 +39503,7 @@ parses /man/10/parsecmd
parses /man/2/arg
parses /man/2/cfg
parses /man/2/disks
+parses /man/2/rfc822
parses /man/2/spki
parses /man/2/spree
parses /man/2/w3c-css
@@ -39121,6 +39520,7 @@ parsing /man/10/mk
parsing /man/2/spki
parsing /man/2/spree
parsing /man/2/w3c-css
+parsing /man/2/w3c-uris
parsing /man/2/xml
parsing /man/6/sexprs
partial /man/1/cprof
@@ -39181,6 +39581,7 @@ particular /man/2/plumbmsg
particular /man/2/prof
particular /man/2/readdir
particular /man/2/registries
+particular /man/2/rfc822
particular /man/2/security-auth
particular /man/2/sh
particular /man/2/spki
@@ -39375,6 +39776,7 @@ password /man/2/pop3
password /man/2/secstore
password /man/2/security-0intro
password /man/2/security-login
+password /man/2/w3c-uris
password /man/4/factotum
password /man/4/ftpfs
password /man/6/keys
@@ -39443,6 +39845,7 @@ path /man/2/cfg
path /man/2/command
path /man/2/convcs
path /man/2/crc
+path /man/2/csv
path /man/2/daytime
path /man/2/dbm
path /man/2/debug
@@ -39516,6 +39919,7 @@ path /man/2/rand
path /man/2/readdir
path /man/2/regex
path /man/2/registries
+path /man/2/rfc822
path /man/2/scsiio
path /man/2/secstore
path /man/2/security-auth
@@ -39578,6 +39982,7 @@ path /man/2/venti
path /man/2/virgil
path /man/2/volume
path /man/2/w3c-css
+path /man/2/w3c-uris
path /man/2/w3c-xpointers
path /man/2/wait
path /man/2/wmclient
@@ -39834,6 +40239,7 @@ perceived /man/1/tiny
percent /man/1/mk
percent /man/10/mk
percent /man/2/w3c-css
+percent /man/2/w3c-uris
percent /man/9/bind
percentage /man/1/collab-clients
percentage /man/1/prof
@@ -40353,6 +40759,8 @@ plain /man/1/man
plain /man/1/wish
plain /man/10/print
plain /man/2/disks
+plain /man/2/keyring-ipint
+plain /man/2/rfc822
plain /man/2/sys-print
plain /man/2/tkclient
plain /man/2/w3c-css
@@ -40367,6 +40775,7 @@ plain /man/8/dhcp
plaintext /man/2/security-0intro
plan /man/1/0intro
plan /man/1/9win
+plan /man/1/ar
plan /man/1/bind
plan /man/1/crypt
plan /man/1/diff
@@ -40491,6 +40900,7 @@ plot /man/1/wm-misc
plotted /man/1/wm-misc
plug /man/1/miniterm
plug /man/3/pnp
+plumb /man/1/man
plumb /man/1/plumb
plumb /man/1/wm-sh
plumb /man/2/plumbmsg
@@ -40747,7 +41157,6 @@ pops /man/2/dialog
pops /man/2/popup
pops /man/4/factotum
pops /man/6/dis
-popserver /man/2/pop3
popt /man/2/print
popts.cfg /man/2/print
popular /man/1/wm-misc
@@ -40799,6 +41208,7 @@ port /man/2/sys-file2chan
port /man/2/sys-iounit
port /man/2/sys-print
port /man/2/virgil
+port /man/2/w3c-uris
port /man/3/arch
port /man/3/audio
port /man/3/boot
@@ -40843,7 +41253,6 @@ port /man/6/plumbing
port /man/7/db
port /man/8/bootpd
port /man/8/cs
-port /man/8/httpd
port /man/8/logind
port /man/8/mangaload
port /man/8/plumber
@@ -40920,6 +41329,7 @@ positions /man/2/draw-pointer
positions /man/2/math-fp
positions /man/2/prof
positions /man/2/regex
+positions /man/2/rfc822
positions /man/2/sexprs
positions /man/3/pointer
positions /man/6/sbl
@@ -40944,6 +41354,7 @@ posix /man/4/tarfs
posix.1 /man/1/gettar
posix.c /man/3/fs
posn /man/2/devpointer
+posname /man/1/ar
posname /man/10/iar
possess /man/2/keyring-0intro
possess /man/4/registry
@@ -41053,6 +41464,7 @@ pre /man/2/string
pre /man/9/types
pread /man/1/cp
pread /man/2/sys-read
+precede /man/1/ar
precede /man/1/deb
precede /man/1/grep
precede /man/10/error
@@ -41091,6 +41503,7 @@ preceeding /man/2/cfg
precise /man/2/math-fp
precise /man/2/sexprs
precise /man/3/mpeg
+precisely /man/1/sh
precisely /man/3/sign
precision /man/1/fc
precision /man/10/print
@@ -41289,6 +41702,7 @@ presents /man/2/sh
presents /man/2/sys-0intro
presents /man/2/sys-file2chan
presents /man/3/arch
+preserve /man/1/ar
preserve /man/1/dd
preserve /man/10/iar
preserve /man/2/keyring-getmsg
@@ -41365,6 +41779,7 @@ prevent /man/2/disks
prevent /man/2/security-0intro
prevent /man/2/sys-chdir
prevent /man/2/sys-pctl
+prevent /man/2/w3c-uris
prevent /man/3/cap
prevent /man/3/cmd
prevent /man/9/bind
@@ -41492,6 +41907,7 @@ prinormal /man/10/kproc
print /man/1/acme
print /man/1/alphabet-fs
print /man/1/alphabet-main
+print /man/1/ar
print /man/1/cal
print /man/1/cmp
print /man/1/comm
@@ -41715,6 +42131,7 @@ prints /man/2/sys-byte2char
prints /man/2/sys-print
prints /man/3/cons
prints /man/4/registry
+prints /man/7/cddb
prints /man/8/bootpd
prints /man/8/create
prints /man/8/cs
@@ -41841,6 +42258,7 @@ process /man/1/listen
process /man/1/mc
process /man/1/mk
process /man/1/nsbuild
+process /man/1/os
process /man/1/ps
process /man/1/sh
process /man/1/sh-file2chan
@@ -42068,6 +42486,7 @@ prod /man/10/qio
produce /man/1/acme
produce /man/1/alphabet-abc
produce /man/1/alphabet-grid
+produce /man/1/ar
produce /man/1/cook
produce /man/1/ls
produce /man/1/mash-make
@@ -42082,6 +42501,7 @@ produce /man/10/mk
produce /man/2/keyring-0intro
produce /man/2/keyring-certtostr
produce /man/2/keyring-sha1
+produce /man/2/rfc822
produce /man/2/scsiio
produce /man/2/styx
produce /man/2/sys-pipe
@@ -42141,6 +42561,7 @@ produces /man/10/print
produces /man/2/draw-image
produces /man/2/keyring-certtostr
produces /man/2/keyring-sha1
+produces /man/2/rfc822
produces /man/2/sets
produces /man/2/sys-print
produces /man/3/ip
@@ -42151,6 +42572,7 @@ produces /man/8/applylog
produces /man/8/cs
producing /man/1/acme
producing /man/10/print
+producing /man/2/rfc822
producing /man/2/sys-print
producing /man/2/translate
producing /man/4/logfile
@@ -42565,6 +42987,7 @@ protocols /man/1/charon
protocols /man/10/allocb
protocols /man/10/conf
protocols /man/2/keyring-getmsg
+protocols /man/2/rfc822
protocols /man/2/security-0intro
protocols /man/2/sys-open
protocols /man/3/ip
@@ -42611,6 +43034,7 @@ provide /man/10/sleep
provide /man/10/splhi
provide /man/2/0intro
provide /man/2/alphabet-intro
+provide /man/2/csv
provide /man/2/dhcpclient
provide /man/2/draw-0intro
provide /man/2/draw-context
@@ -42790,6 +43214,7 @@ provides /man/2/bufio
provides /man/2/command
provides /man/2/convcs
provides /man/2/crc
+provides /man/2/csv
provides /man/2/debug
provides /man/2/devpointer
provides /man/2/dhcpclient
@@ -42827,6 +43252,7 @@ provides /man/2/print
provides /man/2/prof
provides /man/2/readdir
provides /man/2/registries
+provides /man/2/rfc822
provides /man/2/scsiio
provides /man/2/security-0intro
provides /man/2/security-ssl
@@ -42856,6 +43282,7 @@ provides /man/2/ubfa
provides /man/2/venti
provides /man/2/virgil
provides /man/2/volume
+provides /man/2/w3c-uris
provides /man/2/wait
provides /man/2/wmclient
provides /man/2/wmlib
@@ -42938,6 +43365,7 @@ ps /man/1/ps
ps /man/1/stack
ps /man/1/time
ps /man/2/print
+ps /man/2/rfc822
ps.b /man/1/ps
ps2 /man/10/plan9.ini
ps2intellimouse /man/10/plan9.ini
@@ -43173,6 +43601,7 @@ qreopen /man/10/qio
qroot /man/10/styxserver
qroot /man/2/styxservers-nametree
qsetlimit /man/10/qio
+qstring /man/2/rfc822
qtappend /man/2/sys-stat
qtappend /man/5/0intro
qtappend /man/8/styxchat
@@ -43196,6 +43625,7 @@ qtfile /man/5/0intro
qtmount /man/10/devattach
qtype /man/2/styxservers
qtype /man/2/sys-stat
+quadratic /man/1/ar
quadratic /man/10/iar
quadratic /man/2/draw-image
qualified /man/1/acme
@@ -43217,6 +43647,7 @@ qualify /man/2/0intro
qualify /man/6/ndb
qualifying /man/1/sh
quality /man/2/rand
+quality /man/2/rfc822
quantisation /man/1/du
quantised /man/1/du
quantities /man/1/units
@@ -43236,6 +43667,7 @@ queried /man/9/variable
queries /man/2/bloomfilter
queries /man/2/styxservers
queries /man/4/registry
+queries /man/7/cddb
queries /man/8/cs
queries /man/8/dns
queries /man/8/httpd
@@ -43246,8 +43678,10 @@ query /man/1/grid-query
query /man/1/session
query /man/2/filepat
query /man/2/sh
+query /man/2/w3c-uris
query /man/3/prog
query /man/4/factotum
+query /man/7/cddb
query /man/8/cs
query /man/8/dns
query /man/9/button
@@ -43293,6 +43727,7 @@ queues /man/10/qio
queues /man/3/eia
queues /man/3/pipe
queuing /man/2/wmlib
+quick /man/1/ar
quick /man/10/iar
quick /man/4/namespace
quickly /man/1/charon
@@ -43314,6 +43749,7 @@ quiz /man/1/collab-clients
qunlock /man/10/error
qunlock /man/10/qlock
quota /man/10/allocb
+quotable /man/2/rfc822
quotation /man/1/mash
quotation /man/1/sh
quote /man/1/mash
@@ -43324,6 +43760,8 @@ quote /man/1/sh-regex
quote /man/1/tiny
quote /man/1/wm-sh
quote /man/2/attrdb
+quote /man/2/csv
+quote /man/2/rfc822
quote /man/2/string
quote /man/2/tk
quote /man/4/registry
@@ -43352,7 +43790,9 @@ quoted /man/10/getfields
quoted /man/10/mk
quoted /man/10/parsecmd
quoted /man/2/cfg
+quoted /man/2/csv
quoted /man/2/draw-context
+quoted /man/2/rfc822
quoted /man/2/string
quoted /man/2/sys-print
quoted /man/2/tk
@@ -43380,6 +43820,8 @@ quotes /man/10/c2l
quotes /man/10/getfields
quotes /man/10/mk
quotes /man/2/cfg
+quotes /man/2/csv
+quotes /man/2/rfc822
quotes /man/2/string
quotes /man/2/sys-print
quotes /man/4/registry
@@ -43651,6 +44093,7 @@ raw /man/3/pnp
raw /man/3/sd
raw /man/3/touch
raw /man/6/sexprs
+raw /man/7/cddb
raw /man/8/fpgaload
raw /man/8/ftl
raw /man/8/prep
@@ -43820,6 +44263,7 @@ read /man/10/readnum
read /man/10/styxserver
read /man/2/bufio
read /man/2/bufio-chanfill
+read /man/2/csv
read /man/2/debug
read /man/2/devpointer
read /man/2/dis
@@ -43845,6 +44289,7 @@ read /man/2/prefab-0intro
read /man/2/prefab-element
read /man/2/readdir
read /man/2/registries
+read /man/2/rfc822
read /man/2/secstore
read /man/2/security-0intro
read /man/2/security-ssl
@@ -44003,6 +44448,7 @@ readgif /man/2/imagefile
readgif.b /man/2/imagefile
readgifpath /man/2/imagefile
readheader /man/2/spree
+readheaders /man/2/rfc822
readid /man/2/palmfile
readimage /man/2/draw-display
readiness /man/2/crc
@@ -44037,6 +44483,7 @@ reading /man/2/math-0intro
reading /man/2/palmfile
reading /man/2/print
reading /man/2/readdir
+reading /man/2/rfc822
reading /man/2/security-0intro
reading /man/2/styx
reading /man/2/styxservers
@@ -44149,6 +44596,7 @@ reads /man/1/wish
reads /man/10/odbc
reads /man/10/plan9.ini
reads /man/10/qio
+reads /man/2/csv
reads /man/2/devpointer
reads /man/2/dis
reads /man/2/disks
@@ -44162,6 +44610,7 @@ reads /man/2/keyring-getstring
reads /man/2/newns
reads /man/2/plumbmsg
reads /man/2/readdir
+reads /man/2/rfc822
reads /man/2/scsiio
reads /man/2/styx
reads /man/2/styxpersist
@@ -44780,6 +45229,7 @@ ref /man/2/bufio-chanfill
ref /man/2/cfg
ref /man/2/command
ref /man/2/crc
+ref /man/2/csv
ref /man/2/daytime
ref /man/2/dbm
ref /man/2/debug
@@ -44834,6 +45284,7 @@ ref /man/2/prof
ref /man/2/pslib
ref /man/2/readdir
ref /man/2/registries
+ref /man/2/rfc822
ref /man/2/scsiio
ref /man/2/secstore
ref /man/2/security-auth
@@ -44881,6 +45332,7 @@ ref /man/2/ubfa
ref /man/2/venti
ref /man/2/volume
ref /man/2/w3c-css
+ref /man/2/w3c-uris
ref /man/2/w3c-xpointers
ref /man/2/wait
ref /man/2/wmclient
@@ -44926,6 +45378,7 @@ refer /man/9/text
reference /man/1/0intro
reference /man/1/charon
reference /man/1/limbo
+reference /man/1/man
reference /man/1/mk
reference /man/1/sh-tk
reference /man/1/yacc
@@ -44962,6 +45415,7 @@ reference /man/2/keyring-ipint
reference /man/2/lock
reference /man/2/palmfile
reference /man/2/plumbmsg
+reference /man/2/rfc822
reference /man/2/scsiio
reference /man/2/secstore
reference /man/2/security-login
@@ -44974,6 +45428,7 @@ reference /man/2/sys-open
reference /man/2/sys-self
reference /man/2/translate
reference /man/2/w3c-css
+reference /man/2/w3c-uris
reference /man/3/draw
reference /man/3/prog
reference /man/3/touch
@@ -44997,6 +45452,7 @@ referenced /man/4/mntgen
referenced /man/6/sbl
referenced /man/8/mkfs
references /man/1/limbo
+references /man/1/man
references /man/1/mash
references /man/1/mash-tk
references /man/1/mk
@@ -45034,6 +45490,7 @@ referring /man/1/mash
referring /man/10/conf
referring /man/2/arg
referring /man/2/diskblocks
+referring /man/2/rfc822
referring /man/2/spree-objstore
referring /man/2/styxservers
referring /man/2/sys-dup
@@ -45123,6 +45580,7 @@ reg /man/2/registries
reg /man/3/gpio
reg /man/6/ubfa
regard /man/10/qio
+regarded /man/2/csv
regarded /man/2/itslib
regarded /man/2/sys-read
regarded /man/4/registry
@@ -45303,6 +45761,7 @@ rejected /man/8/getauthinfo
rejecting /man/3/ip
rejecting /man/3/usb
rejects /man/4/palmsrv
+rel /man/2/w3c-uris
relate /man/1/ls
related /man/1/acme
related /man/1/mk
@@ -45348,6 +45807,7 @@ relative /man/2/dis
relative /man/2/disks
relative /man/2/fsproto
relative /man/2/names
+relative /man/2/rfc822
relative /man/2/spree
relative /man/2/sys-export
relative /man/2/tk
@@ -45491,6 +45951,7 @@ remainder /man/10/5cv
remainder /man/10/plan9.ini
remainder /man/10/qio
remainder /man/2/math-fp
+remainder /man/2/rfc822
remainder /man/3/audio
remainder /man/3/cons
remainder /man/3/kprof
@@ -45700,6 +46161,7 @@ removed /man/2/styxservers
removed /man/2/sys-fd2path
removed /man/2/sys-print
removed /man/2/timers
+removed /man/2/w3c-uris
removed /man/3/cap
removed /man/3/flash
removed /man/3/fs
@@ -45748,6 +46210,7 @@ removes /man/9/pack
removes /man/9/text
removesbuiltin /man/2/sh
removing /man/1/rm
+removing /man/2/rfc822
removing /man/3/env
removing /man/4/dbfs
removing /man/4/registry
@@ -45832,6 +46295,7 @@ repl /man/2/draw-display
repl /man/2/draw-image
repl /man/3/draw
replace /man/1/acme
+replace /man/1/ar
replace /man/1/bind
replace /man/1/brutus
replace /man/1/secstore
@@ -45866,6 +46330,7 @@ replaced /man/2/asn1
replaced /man/2/ip
replaced /man/2/keyring-getmsg
replaced /man/2/math-0intro
+replaced /man/2/rfc822
replaced /man/2/sh
replaced /man/2/sys-dial
replaced /man/2/sys-print
@@ -46032,6 +46497,7 @@ represent /man/10/lock
represent /man/10/newchan
represent /man/10/rune
represent /man/2/asn1
+represent /man/2/csv
represent /man/2/debug
represent /man/2/disks
represent /man/2/draw-display
@@ -46040,6 +46506,7 @@ represent /man/2/draw-pointer
represent /man/2/ida
represent /man/2/prefab-element
represent /man/2/registries
+represent /man/2/rfc822
represent /man/2/scsiio
represent /man/2/sexprs
represent /man/2/sh
@@ -46087,6 +46554,7 @@ representation /man/2/keyring-rc4
representation /man/2/keyset
representation /man/2/math-export
representation /man/2/palmfile
+representation /man/2/rfc822
representation /man/2/sexprs
representation /man/2/spki
representation /man/2/spree-allow
@@ -46094,7 +46562,9 @@ representation /man/2/spree-cardlib
representation /man/2/styx
representation /man/2/styxservers
representation /man/2/sys-0intro
+representation /man/2/sys-print
representation /man/2/ubfa
+representation /man/2/w3c-uris
representation /man/2/w3c-xpointers
representation /man/2/workdir
representation /man/3/cons
@@ -46152,6 +46622,7 @@ representing /man/2/keyring-ipint
representing /man/2/plumbmsg
representing /man/2/prefab-element
representing /man/2/registries
+representing /man/2/rfc822
representing /man/2/secstore
representing /man/2/sets
representing /man/2/sexprs
@@ -46164,6 +46635,7 @@ representing /man/2/sys-fversion
representing /man/2/sys-pipe
representing /man/2/sys-utfbytes
representing /man/2/w3c-css
+representing /man/2/w3c-uris
representing /man/2/w3c-xpointers
representing /man/3/0intro
representing /man/3/boot
@@ -46235,6 +46707,7 @@ represents /man/2/translate
represents /man/2/ubfa
represents /man/2/venti
represents /man/2/w3c-css
+represents /man/2/w3c-uris
represents /man/2/w3c-xpointers
represents /man/2/wmsrv
represents /man/2/xml
@@ -46261,6 +46734,7 @@ represents /man/8/styxchat
represents /man/9/bind
represents /man/9/grid
represents /man/9/text
+reproduce /man/2/w3c-uris
reproduced /man/2/sexprs
reproduced /man/5/0intro
reproduced /man/6/sexprs
@@ -46496,6 +46970,7 @@ required /man/10/styx
required /man/10/styxserver
required /man/2/alphabet-intro
required /man/2/asn1
+required /man/2/csv
required /man/2/dhcpclient
required /man/2/disks
required /man/2/encoding
@@ -46509,6 +46984,7 @@ required /man/2/palmfile
required /man/2/print
required /man/2/prof
required /man/2/registries
+required /man/2/rfc822
required /man/2/sexprs
required /man/2/styx
required /man/2/styxconv
@@ -46517,6 +46993,7 @@ required /man/2/sys-print
required /man/2/tk
required /man/2/tkclient
required /man/2/w3c-css
+required /man/2/w3c-uris
required /man/2/wmclient
required /man/3/env
required /man/3/flash
@@ -46633,6 +47110,7 @@ reserve /man/8/ftl
reserved /man/10/dev
reserved /man/10/devattach
reserved /man/10/plan9.ini
+reserved /man/2/w3c-uris
reserved /man/6/dis
reserved /man/8/prep
reserves /man/10/odbc
@@ -46720,15 +47198,18 @@ resolve /man/8/applylog
resolved /man/1/alphabet-fs
resolved /man/1/fs
resolved /man/2/virgil
+resolved /man/2/w3c-uris
resolver /man/2/virgil
resolver /man/6/ndb
resolver /man/8/dns
resolvers /man/6/ndb
resolvers /man/8/dns
resolves /man/2/draw-image
+resolves /man/2/w3c-uris
resolves /man/3/draw
resolves /man/8/prep
resolving /man/1/tiny
+resolving /man/2/w3c-uris
resolving /man/6/ndb
resorting /man/8/dns
resource /man/1/charon
@@ -46743,6 +47224,7 @@ resource /man/10/lock
resource /man/10/qlock
resource /man/2/palmfile
resource /man/2/sys-pctl
+resource /man/2/w3c-uris
resource /man/3/draw
resource /man/4/cpu
resources /man/1/0intro
@@ -46771,6 +47253,7 @@ respect /man/10/mk
respect /man/2/draw-display
respect /man/2/format
respect /man/2/tkclient
+respect /man/2/w3c-uris
respect /man/2/wmclient
respect /man/8/create
respect /man/9/panel
@@ -46820,6 +47303,7 @@ response /man/5/0intro
response /man/5/flush
response /man/5/version
response /man/6/colour
+response /man/7/cddb
response /man/8/plumber
response /man/8/rstyxd
response /man/8/signer
@@ -46852,6 +47336,7 @@ rest /man/1/sh-tk
rest /man/2/arg
rest /man/2/filter-deflate
rest /man/2/prefab-element
+rest /man/2/rfc822
rest /man/2/sets
rest /man/2/sexprs
rest /man/2/sh
@@ -46932,6 +47417,7 @@ restrictions /man/10/intrenable
restrictions /man/10/mk
restrictions /man/10/xalloc
restrictions /man/2/draw-display
+restrictions /man/2/rfc822
restrictions /man/2/security-0intro
restrictions /man/3/flash
restrictions /man/3/ftl
@@ -46995,6 +47481,7 @@ resulting /man/2/sys-dirread
resulting /man/2/sys-fd2path
resulting /man/2/sys-tokenize
resulting /man/2/tk
+resulting /man/2/w3c-uris
resulting /man/2/wait
resulting /man/2/xml
resulting /man/3/i2c
@@ -47041,6 +47528,7 @@ results /man/2/srv
results /man/2/sys-0intro
results /man/2/sys-print
results /man/2/sys-utfbytes
+results /man/2/w3c-uris
results /man/3/cons
results /man/3/dup
results /man/3/ftl
@@ -47171,6 +47659,7 @@ return /man/2/bufio-chanfill
return /man/2/cfg
return /man/2/command
return /man/2/convcs
+return /man/2/csv
return /man/2/dbm
return /man/2/debug
return /man/2/dhcpclient
@@ -47196,6 +47685,7 @@ return /man/2/prefab-compound
return /man/2/prof
return /man/2/rand
return /man/2/registries
+return /man/2/rfc822
return /man/2/scsiio
return /man/2/security-random
return /man/2/sexprs
@@ -47227,6 +47717,7 @@ return /man/2/sys-stat
return /man/2/tk
return /man/2/translate
return /man/2/ubfa
+return /man/2/w3c-uris
return /man/2/wmsrv
return /man/2/xml
return /man/3/arch
@@ -47322,6 +47813,7 @@ returned /man/2/popup
returned /man/2/prefab-compound
returned /man/2/prof
returned /man/2/readdir
+returned /man/2/rfc822
returned /man/2/scsiio
returned /man/2/secstore
returned /man/2/security-login
@@ -47466,6 +47958,7 @@ returns /man/2/bufio-chanfill
returns /man/2/cfg
returns /man/2/convcs
returns /man/2/crc
+returns /man/2/csv
returns /man/2/daytime
returns /man/2/dbm
returns /man/2/debug
@@ -47522,6 +48015,7 @@ returns /man/2/prof
returns /man/2/readdir
returns /man/2/regex
returns /man/2/registries
+returns /man/2/rfc822
returns /man/2/scsiio
returns /man/2/secstore
returns /man/2/security-0intro
@@ -47577,6 +48071,7 @@ returns /man/2/ubfa
returns /man/2/venti
returns /man/2/virgil
returns /man/2/w3c-css
+returns /man/2/w3c-uris
returns /man/2/w3c-xpointers
returns /man/2/wait
returns /man/2/wmclient
@@ -47738,13 +48233,23 @@ rfc1055 /man/2/filter-slip
rfc1058 /man/8/rip
rfc1361 /man/8/sntp
rfc1942 /man/1/charon
+rfc2045 /man/2/rfc822
rfc2104 /man/2/keyring-sha1
rfc2131 /man/2/dhcpclient
rfc2373 /man/2/ip
rfc2453 /man/8/rip
+rfc2822 /man/2/rfc822
rfc3548 /man/2/encoding
+rfc3986 /man/2/w3c-uris
+rfc822 /man/2/rfc822
+rfc822's /man/2/rfc822
+rfc822.b /man/2/rfc822
+rfc822.m /man/2/rfc822
rfc854 /man/1/telnet
+rfclex /man/2/rfc822
+rfclex.mk /man/2/rfc822
rfcs /man/1/telnet
+rfl /man/2/rfc822
rflush /man/5/0intro
rflush /man/5/flush
rflush /man/8/styxchat
@@ -48165,6 +48670,7 @@ rule /man/1/mash-make
rule /man/1/mk
rule /man/10/mk
rule /man/2/draw-image
+rule /man/2/rfc822
rule /man/2/sys-0intro
rule /man/2/w3c-xpointers
rule /man/3/draw
@@ -48201,6 +48707,7 @@ rules /man/2/command
rules /man/2/draw-display
rules /man/2/math-0intro
rules /man/2/plumbmsg
+rules /man/2/rfc822
rules /man/2/spree
rules /man/2/styx
rules /man/2/w3c-css
@@ -48344,6 +48851,7 @@ running /man/1/emu
running /man/1/grid-query
running /man/1/kill
running /man/1/mux
+running /man/1/os
running /man/1/ps
running /man/1/sendmail
running /man/1/sh
@@ -48497,6 +49005,7 @@ safe /man/1/0intro
safe /man/1/charon
safe /man/10/intrenable
safe /man/2/styxservers
+safe /man/2/w3c-uris
safe /man/6/sexprs
safely /man/10/malloc
safely /man/10/parsecmd
@@ -48675,6 +49184,7 @@ scheme /man/2/convcs
scheme /man/2/ida
scheme /man/2/spree
scheme /man/2/spree-cardlib
+scheme /man/2/w3c-uris
scheme /man/2/w3c-xpointers
scheme /man/3/ip
scheme /man/3/mnt
@@ -48684,6 +49194,7 @@ scheme /man/9/canvas
scheme /man/9/text
schemes /man/2/convcs
schemes /man/2/sexprs
+schemes /man/2/w3c-uris
schemes /man/2/w3c-xpointers
schemes /man/6/sexprs
schneier /man/2/keyring-0intro
@@ -48795,6 +49306,7 @@ script /man/1/charon
script /man/1/diff
script /man/1/grid-ns
script /man/1/itest
+script /man/1/man
script /man/1/mk
script /man/1/plumb
script /man/1/sh
@@ -48810,6 +49322,7 @@ script /man/2/sh
script /man/4/cpu
script /man/6/keyboard
script /man/8/plumber
+script /man/8/shutdown
script /man/9/bind
script /man/9/canvas
script /man/9/menu
@@ -48960,6 +49473,7 @@ searching /man/8/dns
searchspec /man/9/canvas
sec /man/2/daytime
sec /man/2/keyring-crypt
+sec2date /man/2/rfc822
seckey /man/2/secstore
secondary /man/6/colour
secondary /man/6/man
@@ -48979,6 +49493,7 @@ seconds /man/2/daytime
seconds /man/2/dhcpclient
seconds /man/2/geodesy
seconds /man/2/palmfile
+seconds /man/2/rfc822
seconds /man/2/sys-stat
seconds /man/2/virgil
seconds /man/2/volume
@@ -49031,6 +49546,7 @@ secrets /man/4/namespace
secrets /man/6/keys
secrets /man/8/svc
secs /man/2/disks
+secs /man/2/rfc822
secs2time /man/2/spki
secsize /man/2/disks
secsize /man/8/ftl
@@ -49247,6 +49763,7 @@ segments /man/10/a.out
segments /man/10/ksize
segments /man/10/kstrip
segments /man/10ti925/tihost
+segments /man/2/w3c-uris
segments /man/3/draw
segments /man/3/flash
segments /man/3/ip
@@ -49323,6 +49840,7 @@ selected /man/1/grid-ns
selected /man/1/keyboard
selected /man/1/logon
selected /man/1/ls
+selected /man/1/man
selected /man/1/mash-tk
selected /man/1/mux
selected /man/1/session
@@ -49492,6 +50010,7 @@ self /man/2/plumbmsg
self /man/2/prefab-compound
self /man/2/prefab-element
self /man/2/registries
+self /man/2/rfc822
self /man/2/scsiio
self /man/2/sets
self /man/2/sexprs
@@ -49507,6 +50026,7 @@ self /man/2/timers
self /man/2/translate
self /man/2/ubfa
self /man/2/venti
+self /man/2/w3c-uris
self /man/2/w3c-xpointers
self /man/2/wmclient
self /man/2/wmsrv
@@ -49670,6 +50190,7 @@ sends /man/9/send
sendtext /man/1/wm-sh
sendtextfd /man/2/print
sensible /man/2/prefab-element
+sensible /man/2/rfc822
sensible /man/2/sys-fversion
sensible /man/8/getauthinfo
sensible /man/8/prep
@@ -49682,6 +50203,7 @@ sensitive /man/9/grab
sent /man/1/acme
sent /man/1/collab-clients
sent /man/1/idea
+sent /man/1/man
sent /man/1/mash
sent /man/1/miniterm
sent /man/1/plumb
@@ -49973,6 +50495,7 @@ server /man/5/walk
server /man/6/keys
server /man/6/ndb
server /man/6/users
+server /man/7/cddb
server /man/7/db
server /man/7/dbsrv
server /man/8/applylog
@@ -50129,10 +50652,8 @@ services /man/1/ns
services /man/1/webgrab
services /man/10/ntsrv
services /man/2/0intro
-services /man/2/pop3
services /man/2/registries
services /man/2/security-0intro
-services /man/2/smtp
services /man/2/srv
services /man/2/sys-pctl
services /man/3/cmd
@@ -50269,6 +50790,7 @@ settings /man/10/plan9.ini
settings /man/2/exception
settings /man/2/geodesy
settings /man/2/print
+settings /man/2/rfc822
settings /man/3/draw
settings /man/3/eia
settings /man/3/fs
@@ -50350,6 +50872,7 @@ sh /man/1/fs
sh /man/1/ftest
sh /man/1/itest
sh /man/1/listen
+sh /man/1/man
sh /man/1/mk
sh /man/1/rcmd
sh /man/1/read
@@ -50376,6 +50899,7 @@ sh /man/10/parsecmd
sh /man/2/0intro
sh /man/2/arg
sh /man/2/command
+sh /man/2/csv
sh /man/2/itslib
sh /man/2/sh
sh /man/2/string
@@ -50397,6 +50921,7 @@ sh /man/6/proto
sh /man/6/regexp
sh /man/8/kfscmd
sh /man/8/rstyxd
+sh /man/8/shutdown
sh /man/8/srv
sh /man/8/styxchat
sh /man/8/svc
@@ -50632,6 +51157,7 @@ shorthand /man/5/0intro
shorthands /man/6/keyboard
shortly /man/2/ip
shorts /man/10/inb
+showing /man/1/ar
showing /man/1/asm
showing /man/1/blur
showing /man/1/collab-clients
@@ -50719,7 +51245,6 @@ shutdown /man/2/plumbmsg
shutdown /man/2/sys-open
shutdown /man/2/timers
shutdown /man/8/shutdown
-shutdown.b /man/8/shutdown
shuts /man/2/drawmux
shuts /man/2/plumbmsg
shutting /man/2/drawmux
@@ -50995,8 +51520,10 @@ similar /man/2/sys-0intro
similar /man/2/sys-print
similar /man/2/translate
similar /man/2/ubfa
+similar /man/2/w3c-uris
similar /man/2/wmsrv
similar /man/3/audio
+similar /man/3/cmd
similar /man/3/dbg
similar /man/3/ftl
similar /man/3/srv9
@@ -51065,6 +51592,7 @@ simply /man/1/cprof
simply /man/1/deb
simply /man/1/grid-monitor
simply /man/1/idea
+simply /man/1/man
simply /man/1/mc
simply /man/1/mv
simply /man/1/sh
@@ -51152,6 +51680,7 @@ six /man/6/man
sixteen /man/5/walk
sixth /man/3/kprof
size /man/1/alphabet-fs
+size /man/1/ar
size /man/1/blur
size /man/1/brutus
size /man/1/cook
@@ -51213,6 +51742,7 @@ size /man/2/prefab-element
size /man/2/print
size /man/2/pslib
size /man/2/readdir
+size /man/2/rfc822
size /man/2/secstore
size /man/2/security-0intro
size /man/2/sexprs
@@ -51329,6 +51859,7 @@ sk /man/2/spki
sk /man/6/auth
skeleton /man/4/namespace
skip /man/1/dd
+skip /man/2/rfc822
skipped /man/1/tiny
skipped /man/4/archfs
skipped /man/5/0intro
@@ -51336,6 +51867,7 @@ skipping /man/5/0intro
skips /man/2/keyring-rc4
skips /man/2/sys-tokenize
skips /man/9/canvas
+skipws /man/2/rfc822
sktopk /man/2/keyring-gensk
sktostr /man/2/keyring-certtostr
sku /man/2/keyring-auth
@@ -51577,6 +52109,7 @@ sometimes /man/6/keyboard
sometimes /man/6/sexprs
sometimes /man/6/utf
sometimes /man/9/canvas
+somewhat /man/1/ar
somewhat /man/1/sh
somewhat /man/10/iar
somewhat /man/2/dividers
@@ -51653,6 +52186,7 @@ source /man/1/alphabet-abc
source /man/1/alphabet-fs
source /man/1/alphabet-grid
source /man/1/alphabet-main
+source /man/1/ar
source /man/1/asm
source /man/1/auplay
source /man/1/avr
@@ -51844,6 +52378,7 @@ source /man/2/bufio
source /man/2/cfg
source /man/2/convcs
source /man/2/crc
+source /man/2/csv
source /man/2/daytime
source /man/2/dbm
source /man/2/debug
@@ -51905,6 +52440,7 @@ source /man/2/pslib
source /man/2/rand
source /man/2/readdir
source /man/2/regex
+source /man/2/rfc822
source /man/2/scsiio
source /man/2/secstore
source /man/2/security-auth
@@ -51945,6 +52481,7 @@ source /man/2/venti
source /man/2/virgil
source /man/2/volume
source /man/2/w3c-css
+source /man/2/w3c-uris
source /man/2/w3c-xpointers
source /man/2/wmclient
source /man/2/wmlib
@@ -52031,6 +52568,7 @@ source /man/6/plumbing
source /man/6/proto
source /man/6/sbl
source /man/6/translate
+source /man/7/cddb
source /man/7/db
source /man/7/dbsrv
source /man/8/applylog
@@ -52147,6 +52685,7 @@ space /man/2/palmfile
space /man/2/prefab-compound
space /man/2/prefab-element
space /man/2/registries
+space /man/2/rfc822
space /man/2/secstore
space /man/2/sexprs
space /man/2/spki
@@ -52357,6 +52896,7 @@ specially /man/1/sh-std
specially /man/1/tiny
specially /man/10/allocb
specially /man/10/mk
+specially /man/2/csv
specially /man/2/dialog
specially /man/3/cons
specially /man/8/cs
@@ -52386,6 +52926,7 @@ specific /man/2/palmfile
specific /man/2/prefab-element
specific /man/2/print
specific /man/2/prof
+specific /man/2/rfc822
specific /man/2/sexprs
specific /man/2/sh
specific /man/2/spree-allow
@@ -52393,6 +52934,7 @@ specific /man/2/spree-cardlib
specific /man/2/sys-iounit
specific /man/2/tabs
specific /man/2/ubfa
+specific /man/2/w3c-uris
specific /man/3/arch
specific /man/3/cons
specific /man/3/ether
@@ -52516,6 +53058,7 @@ specifies /man/2/prefab-element
specifies /man/2/prefab-environ
specifies /man/2/prefab-style
specifies /man/2/print
+specifies /man/2/rfc822
specifies /man/2/sh
specifies /man/2/spree-cardlib
specifies /man/2/sys-byte2char
@@ -52588,6 +53131,7 @@ specify /man/2/format
specify /man/2/keyring-0intro
specify /man/2/prefab-0intro
specify /man/2/prefab-environ
+specify /man/2/rfc822
specify /man/2/spree-cardlib
specify /man/2/sys-print
specify /man/3/draw
@@ -52677,6 +53221,7 @@ split /man/10/dmainit
split /man/10/qio
split /man/2/imagefile
split /man/2/sys-tokenize
+split /man/2/w3c-uris
split /man/3/pipe
split /man/3/sd
split /man/6/namespace
@@ -53041,6 +53586,7 @@ standard /man/4/namespace
standard /man/4/registry
standard /man/6/sexprs
standard /man/6/utf
+standard /man/7/cddb
standard /man/8/applylog
standard /man/8/bootpd
standard /man/8/create
@@ -53189,6 +53735,7 @@ starts /man/10/dmainit
starts /man/10/kbdputc
starts /man/10/ntsrv
starts /man/10ti925/tihost
+starts /man/2/csv
starts /man/2/debug
starts /man/2/draw-0intro
starts /man/2/draw-image
@@ -53199,6 +53746,7 @@ starts /man/2/prof
starts /man/2/styxpersist
starts /man/2/sys-pctl
starts /man/2/timers
+starts /man/2/w3c-uris
starts /man/2/w3c-xpointers
starts /man/2/wait
starts /man/2/wmsrv
@@ -53456,6 +54004,7 @@ stderr /man/1/sh
stderr /man/1/sh-std
stderr /man/1/yacc
stderr /man/2/security-auth
+stderr /man/3/cmd
stdin /man/1/grid-monitor
stdin /man/1/grid-ns
stdin /man/1/grid-register
@@ -53803,6 +54352,7 @@ stream /man/2/filter-deflate
stream /man/2/filter-slip
stream /man/2/imagefile
stream /man/2/keyring-rc4
+stream /man/2/rfc822
stream /man/2/spree
stream /man/2/sys-print
stream /man/2/sys-read
@@ -53822,6 +54372,8 @@ stream.b /man/1/stream
streamed /man/2/convcs
streamers /man/1/stream
streaming /man/1/stream
+streamlined /man/2/rfc822
+streams /man/1/os
streams /man/1/stream
streams /man/2/convcs
streams /man/2/keyring-getmsg
@@ -53829,7 +54381,6 @@ streams /man/2/keyring-getstring
streams /man/2/sys-stat
streams /man/2/wmlib
streams /man/3/audio
-streams /man/3/cmd
streams /man/6/ubfa
streams /man/6/utf
streams /man/7/db
@@ -53915,6 +54466,7 @@ string /man/2/bufio
string /man/2/cfg
string /man/2/command
string /man/2/convcs
+string /man/2/csv
string /man/2/daytime
string /man/2/dbm
string /man/2/debug
@@ -53975,6 +54527,7 @@ string /man/2/pslib
string /man/2/readdir
string /man/2/regex
string /man/2/registries
+string /man/2/rfc822
string /man/2/scsiio
string /man/2/secstore
string /man/2/security-0intro
@@ -54026,6 +54579,7 @@ string /man/2/venti
string /man/2/virgil
string /man/2/volume
string /man/2/w3c-css
+string /man/2/w3c-uris
string /man/2/w3c-xpointers
string /man/2/wait
string /man/2/wmclient
@@ -54158,6 +54712,7 @@ strings /man/2/sys-fversion
strings /man/2/sys-print
strings /man/2/tk
strings /man/2/ubfa
+strings /man/2/w3c-uris
strings /man/3/audio
strings /man/3/cons
strings /man/3/draw
@@ -54574,8 +55129,10 @@ subcommand /man/1/tktester
subcommands /man/1/mash-tk
subcommands /man/1/tktester
subcomponent /man/10/conf
+subcomponent /man/2/w3c-uris
subcomponents /man/1/webgrab
subcomponents /man/2/ubfa
+subcomponents /man/2/w3c-uris
subcube /man/6/colour
subcubes /man/6/colour
subdirectories /man/1/acme
@@ -54750,6 +55307,7 @@ substrings /man/6/plumbing
substructure /man/1/gettar
substructure /man/1/rm
substructure /man/10/2c
+substructure /man/2/w3c-uris
substructures /man/10/2c
subsumes /man/9/grid
subsystem /man/3/fpga
@@ -54767,6 +55325,7 @@ subtraction /man/1/sh-expr
subtree /man/9/grab
subtrees /man/8/applylog
subtype /man/10/devattach
+subtype /man/2/rfc822
subtype /man/2/sys-self
subtype /man/2/sys-stat
subtypes /man/2/xml
@@ -54949,6 +55508,7 @@ suffix /man/2/dbm
suffix /man/2/disks
suffix /man/2/draw-image
suffix /man/2/names
+suffix /man/2/rfc822
suffix /man/2/spki
suffix /man/2/w3c-css
suffix /man/5/version
@@ -54959,6 +55519,7 @@ suffix /man/8/prep
suffix /man/9/types
suffix1 /man/1/webgrab
suffix2 /man/1/webgrab
+suffixclass /man/2/rfc822
suffixed /man/1/du
suffixed /man/1/tiny
suffixed /man/10/atoi
@@ -55135,6 +55696,7 @@ support /man/2/imagefile
support /man/2/keyring-ipint
support /man/2/print
support /man/2/prof
+support /man/2/rfc822
support /man/2/spki-verifier
support /man/2/spree-cardlib
support /man/2/spree-gather
@@ -55224,6 +55786,7 @@ supports /man/2/security-0intro
supports /man/2/spki-verifier
supports /man/2/sys-open
supports /man/2/ubfa
+supports /man/2/w3c-uris
supports /man/3/audio
supports /man/3/i82365
supports /man/3/sd
@@ -55247,10 +55810,12 @@ suppress /man/6/man
suppress /man/8/kfscmd
suppress /man/8/ping
suppressed /man/1/sh
+suppresses /man/1/ar
suppresses /man/1/comm
suppresses /man/1/echo
suppresses /man/1/limbo
suppresses /man/1/mash-tk
+suppresses /man/1/os
suppresses /man/1/yacc
suppresses /man/10/acid
suppresses /man/10/iar
@@ -55473,8 +56038,10 @@ syntax /man/2/attrdb
syntax /man/2/draw-display
syntax /man/2/ip
syntax /man/2/names
+syntax /man/2/rfc822
syntax /man/2/tk
syntax /man/2/w3c-css
+syntax /man/2/w3c-uris
syntax /man/2/w3c-xpointers
syntax /man/3/cmd
syntax /man/3/flash
@@ -55484,6 +56051,7 @@ syntax /man/6/regexp
syntax /man/6/sexprs
syntax /man/6/translate
syntax /man/6/ubfa
+syntax /man/8/httpd
syntax /man/8/ping
syntax /man/9/bind
syntax /man/9/canvas
@@ -55675,6 +56243,7 @@ sys /man/7/db
sys /man/8/bootpd
sys /man/8/collabsrv
sys /man/8/cs
+sys /man/8/httpd
sys /man/8/ping
sys /man/8/rstyxd
sys /man/8/styxchat
@@ -55819,6 +56388,7 @@ tab /man/6/translate
tab /man/6/ubfa
tab /man/9/text
tabbed /man/2/tabs
+table /man/1/ar
table /man/1/charon
table /man/1/cprof
table /man/1/fortune
@@ -55865,6 +56435,7 @@ table /man/6/dis
table /man/6/keyboard
table /man/6/man
table /man/6/sbl
+table /man/7/cddb
table /man/8/prep
table /man/8/rip
table /man/9/grid
@@ -56056,6 +56627,7 @@ takes /man/2/plumbmsg
takes /man/2/prefab-compound
takes /man/2/prefab-element
takes /man/2/prof
+takes /man/2/rfc822
takes /man/2/secstore
takes /man/2/security-0intro
takes /man/2/sh
@@ -56070,6 +56642,7 @@ takes /man/2/wait
takes /man/3/ftl
takes /man/3/prog
takes /man/6/colour
+takes /man/7/cddb
takes /man/8/applylog
takes /man/8/dhcp
takes /man/8/getauthinfo
@@ -56081,6 +56654,7 @@ taking /man/1/blur
taking /man/1/fs
taking /man/1/mash-make
taking /man/2/bufio
+taking /man/2/csv
taking /man/2/draw-example
taking /man/2/sh
taking /man/2/styxservers
@@ -56103,8 +56677,10 @@ tanh /man/2/math-elem
tape /man/1/dd
tape /man/1/mux
tapping /man/1/wm-misc
+tar /man/1/ar
tar /man/1/gettar
tar /man/4/tarfs
+tar.gz /man/1/ar
tarfile /man/4/tarfs
tarfs /man/1/gettar
tarfs /man/4/archfs
@@ -56296,6 +56872,7 @@ template /man/1/tktester
template /man/4/factotum
templates /man/1/tktester
templates /man/4/factotum
+temporaries /man/1/ar
temporaries /man/10/iar
temporarily /man/1/acme
temporarily /man/10/lock
@@ -56366,6 +56943,8 @@ termination /man/1/tiny
termination /man/10/acid
termination /man/10/kproc
terminator /man/1/tiny
+terminator /man/2/csv
+terminators /man/2/csv
terminology /man/2/draw-0intro
terms /man/1/charon
terms /man/1/math-misc
@@ -56480,6 +57059,7 @@ text /man/2/alphabet-intro
text /man/2/asn1
text /man/2/bufio
text /man/2/convcs
+text /man/2/csv
text /man/2/daytime
text /man/2/disks
text /man/2/draw-0intro
@@ -56501,6 +57081,7 @@ text /man/2/prefab-compound
text /man/2/prefab-element
text /man/2/prefab-style
text /man/2/print
+text /man/2/rfc822
text /man/2/secstore
text /man/2/sexprs
text /man/2/smtp
@@ -56515,6 +57096,7 @@ text /man/2/translate
text /man/2/ubfa
text /man/2/venti
text /man/2/w3c-css
+text /man/2/w3c-uris
text /man/2/w3c-xpointers
text /man/2/xml
text /man/3/dbg
@@ -56607,6 +57189,7 @@ textual /man/2/scsiio
textual /man/2/secstore
textual /man/2/sexprs
textual /man/2/spki
+textual /man/2/w3c-uris
textual /man/2/w3c-xpointers
textual /man/3/arch
textual /man/3/cmd
@@ -56644,6 +57227,7 @@ textual /man/9/text
textually /man/1/acme
textually /man/2/ip
textually /man/2/keyring-ipint
+textually /man/2/w3c-uris
textually /man/3/dbg
textually /man/3/pnp
textually /man/8/signer
@@ -56676,6 +57260,7 @@ th /man/2/regex
th /man/2/spree-cardlib
th /man/6/colour
th /man/6/man
+th /man/7/cddb
th /man/9/choicebutton
th /man/9/grid
th /man/9/text
@@ -56850,6 +57435,7 @@ time /man/1/grid-register
time /man/1/itest
time /man/1/limbo
time /man/1/ls
+time /man/1/man
time /man/1/mash
time /man/1/math-misc
time /man/1/mk
@@ -56859,6 +57445,7 @@ time /man/1/ps
time /man/1/sh
time /man/1/sh-file2chan
time /man/1/sh-std
+time /man/1/sh-tk
time /man/1/time
time /man/1/timestamp
time /man/1/touch
@@ -56900,6 +57487,7 @@ time /man/2/palmfile
time /man/2/prof
time /man/2/readdir
time /man/2/registries
+time /man/2/rfc822
time /man/2/scsiio
time /man/2/secstore
time /man/2/security-0intro
@@ -56942,6 +57530,7 @@ time /man/6/keys
time /man/6/keytext
time /man/6/ndb
time /man/6/utf
+time /man/7/cddb
time /man/8/applylog
time /man/8/bootpd
time /man/8/changelogin
@@ -56990,6 +57579,7 @@ timer.start /man/2/timers
timers /man/2/timers
timers.m /man/2/timers
times /man/1/acme
+times /man/1/ar
times /man/1/cprof
times /man/1/itest
times /man/1/mash-make
@@ -57012,6 +57602,7 @@ times /man/3/tls
times /man/4/kfs
times /man/5/0intro
times /man/6/translate
+times /man/7/cddb
times /man/8/changelogin
times /man/8/mkfs
times /man/9/text
@@ -57147,6 +57738,7 @@ tk.m /man/2/wmclient
tk2ms /man/10/seconds
tk2sec /man/10/seconds
tkarg /man/1/tkcmd
+tkclient /man/1/sh-tk
tkclient /man/1/toolbar
tkclient /man/1/wm
tkclient /man/2/draw-context
@@ -57181,6 +57773,7 @@ tmget /man/3/dbg
tmp /man/1/alphabet-abc
tmp /man/1/alphabet-fs
tmp /man/1/alphabet-grid
+tmp /man/1/ar
tmp /man/1/blur
tmp /man/1/diff
tmp /man/1/fs
@@ -57246,7 +57839,9 @@ toggles /man/9/listbox
toggles /man/9/menu
toggling /man/9/menu
toint /man/2/string
+tok /man/2/rfc822
token /man/1/yacc
+token /man/2/rfc822
token /man/2/sexprs
token /man/2/sys-dial
token /man/6/sexprs
@@ -57259,6 +57854,7 @@ tokenize /man/2/sys-tokenize
tokenize.c /man/10/getfields
tokens /man/1/yacc
tokens /man/10/getfields
+tokens /man/2/rfc822
tokens /man/2/sexprs
tokens /man/2/spree
tokens /man/2/wmsrv
@@ -57356,6 +57952,7 @@ total /man/3/prog
total /man/4/factotum
total /man/4/iostats
total /man/5/stat
+total /man/7/cddb
total /man/8/prep
total /man/9/canvas
total /man/9/listbox
@@ -57429,11 +58026,16 @@ track /man/1/blur
track /man/2/disks
track /man/4/dossrv
track /man/4/spree
+track /man/7/cddb
track /man/8/plumber
track /man/8/prep
track /man/9/menu
track /man/9/text
+track's /man/7/cddb
+track0id /man/7/cddb
trackballs /man/2/draw-0intro
+tracknid /man/7/cddb
+tracks /man/7/cddb
trademark /man/6/man
traditional /man/10/plan9.ini
traditional /man/2/arg
@@ -57469,6 +58071,7 @@ transfer /man/10/error
transfer /man/10/inb
transfer /man/10ti925/tihost
transfer /man/2/keyring-0intro
+transfer /man/2/rfc822
transfer /man/2/smtp
transfer /man/2/spree
transfer /man/2/spree-cardlib
@@ -57786,6 +58389,7 @@ trip /man/8/ping
triple /man/2/draw-display
triple /man/2/exception
triple /man/2/w3c-css
+triple /man/2/w3c-uris
triple /man/6/colour
triplets /man/2/draw-0intro
trivial /man/2/tftp
@@ -57908,6 +58512,7 @@ tuple /man/2/prefab-compound
tuple /man/2/readdir
tuple /man/2/regex
tuple /man/2/registries
+tuple /man/2/rfc822
tuple /man/2/secstore
tuple /man/2/security-ssl
tuple /man/2/sexprs
@@ -57932,6 +58537,7 @@ tuple /man/2/translate
tuple /man/2/ubfa
tuple /man/2/venti
tuple /man/2/w3c-css
+tuple /man/2/w3c-uris
tuple /man/2/w3c-xpointers
tuple /man/2/wait
tuple /man/2/wmlib
@@ -57949,6 +58555,7 @@ tuples /man/2/convcs
tuples /man/2/keyset
tuples /man/2/pop3
tuples /man/2/registries
+tuples /man/2/rfc822
tuples /man/2/sh
tuples /man/2/sys-0intro
tuples /man/2/sys-file2chan
@@ -57998,6 +58605,7 @@ twelve /man/2/ether
twelve /man/3/cons
twelve /man/3/ether
twelve /man/6/image
+twice /man/1/ar
twice /man/1/charon
twice /man/10/iar
twice /man/2/cfg
@@ -58096,6 +58704,7 @@ type /man/2/prefab-style
type /man/2/print
type /man/2/prof
type /man/2/registries
+type /man/2/rfc822
type /man/2/selectfile
type /man/2/sexprs
type /man/2/sh
@@ -58229,6 +58838,7 @@ types /man/2/prefab-0intro
types /man/2/prefab-element
types /man/2/prefab-environ
types /man/2/print
+types /man/2/rfc822
types /man/2/security-0intro
types /man/2/spki
types /man/2/styx
@@ -58437,6 +59047,7 @@ udpmsg /man/3/ip
uexp /man/1/yacc
ugo /man/1/chmod
uhci /man/10/plan9.ini
+uid /man/1/ar
uid /man/10/ar
uid /man/10/devattach
uid /man/10/iar
@@ -58699,6 +59310,7 @@ unfortunately /man/3/cmd
unfreeze /man/3/tv
ungetb /man/2/bufio
ungetc /man/2/bufio
+ungetc /man/2/rfc822
unhandled /man/2/0intro
unibrowse /man/1/wm-misc
unibrowse.b /man/1/wm-misc
@@ -58736,6 +59348,7 @@ unicode.9.font /man/9/types
unicode.b /man/1/unicode
unicoderange /man/2/w3c-css
unidata /man/1/wm-misc
+uniform /man/2/w3c-uris
uniformly /man/1/acme
uniformly /man/6/colour
uniformly /man/9/pack
@@ -58751,6 +59364,7 @@ uninitialized /man/5/attach
uninitialized /man/5/version
unintercepted /man/2/security-0intro
uninterpreted /man/1/sh-alphabet
+uninterpreted /man/2/rfc822
uninterpreted /man/2/w3c-css
uninterpreted /man/6/utf
uninterrupted /man/2/spree
@@ -58873,6 +59487,7 @@ universalstring /man/2/asn1
university /man/9/0intro
university /man/9/1copyright
unix /man/1/0intro
+unix /man/1/ar
unix /man/1/diff
unix /man/1/gzip
unix /man/1/mash
@@ -58965,6 +59580,7 @@ unless /man/9/menu
unless /man/9/pack
unless /man/9/radiobutton
unless /man/9/text
+unlex /man/2/rfc822
unlike /man/1/sh-std
unlike /man/1/sh-string
unlike /man/10/plan9.ini
@@ -59073,9 +59689,11 @@ unquoted /man/1/mk
unquoted /man/1/sh
unquoted /man/1/wm-sh
unquoted /man/10/mk
+unquoted /man/2/rfc822
unquoted /man/2/sexprs
unquoted /man/2/string
unquoted /man/6/sexprs
+unquotes /man/2/csv
unreachable /man/3/ip
unread /man/1/wm-sh
unread /man/10/allocb
@@ -59286,8 +59904,17 @@ ureg /man/3/dbg
ureg.h /man/10/0intro
ureg.h /man/10/intrenable
uri /man/2/w3c-css
+uri /man/2/w3c-uris
uri /man/2/w3c-xpointers
uri /man/8/httpd
+uri's /man/2/w3c-uris
+uri.authority /man/2/w3c-uris
+uri.parse /man/2/w3c-uris
+uri.query /man/2/w3c-uris
+uri.text /man/2/w3c-uris
+uris /man/2/w3c-uris
+uris.b /man/2/w3c-uris
+uris.m /man/2/w3c-uris
url /man/1/charon
url /man/1/webgrab
url /man/2/w3c-css
@@ -59338,6 +59965,7 @@ user /man/1/0intro
user /man/1/acme
user /man/1/alphabet-fs
user /man/1/alphabet-main
+user /man/1/ar
user /man/1/bind
user /man/1/cd
user /man/1/charon
@@ -59509,14 +60137,17 @@ user's /man/6/proto
user's /man/8/getauthinfo
userdir /man/1/charon
userid /man/8/virgild
+userinfo /man/2/w3c-uris
username /man/1/deb
username /man/1/rcmd
username /man/1/toolbar
username /man/10/odbc
+username /man/2/w3c-uris
username /man/3/ip
username /man/7/db
username /man/8/getauthinfo
usernames /man/10/eve
+userpw /man/2/w3c-uris
users /man/1/0intro
users /man/1/collab-clients
users /man/1/emu
@@ -59674,6 +60305,7 @@ using /man/2/timers
using /man/2/tk
using /man/2/translate
using /man/2/ubfa
+using /man/2/w3c-uris
using /man/2/w3c-xpointers
using /man/2/wmsrv
using /man/3/arch
@@ -59880,6 +60512,7 @@ utility /man/10/0intro
utility /man/10/styxserver
utility /man/2/exception
utility /man/2/keyring-ipint
+utility /man/2/rfc822
utility /man/2/sh
utility /man/2/styxservers
utils /man/1/idea
@@ -59949,6 +60582,7 @@ val /man/2/format
val /man/2/hash
val /man/2/plumbmsg
val /man/2/registries
+val /man/2/rfc822
val /man/2/spree
val /man/2/stringinttab
val /man/2/ubfa
@@ -60108,6 +60742,7 @@ value /man/2/bufio
value /man/2/cfg
value /man/2/convcs
value /man/2/crc
+value /man/2/csv
value /man/2/dbm
value /man/2/debug
value /man/2/dhcpclient
@@ -60145,6 +60780,7 @@ value /man/2/prof
value /man/2/pslib
value /man/2/readdir
value /man/2/registries
+value /man/2/rfc822
value /man/2/scsiio
value /man/2/secstore
value /man/2/security-0intro
@@ -60181,6 +60817,7 @@ value /man/2/sys-werrstr
value /man/2/timers
value /man/2/ubfa
value /man/2/w3c-css
+value /man/2/w3c-uris
value /man/2/w3c-xpointers
value /man/2/wait
value /man/2/wmsrv
@@ -60234,6 +60871,7 @@ value /man/6/sbl
value /man/6/sexprs
value /man/6/ubfa
value /man/6/utf
+value /man/7/cddb
value /man/7/db
value /man/8/bootpd
value /man/8/changelogin
@@ -60344,6 +60982,7 @@ values /man/2/attrdb
values /man/2/bufio-chanfill
values /man/2/cfg
values /man/2/convcs
+values /man/2/csv
values /man/2/daytime
values /man/2/dbm
values /man/2/dhcpclient
@@ -60365,6 +61004,7 @@ values /man/2/palmfile
values /man/2/popup
values /man/2/readdir
values /man/2/registries
+values /man/2/rfc822
values /man/2/secstore
values /man/2/security-0intro
values /man/2/sexprs
@@ -60381,6 +61021,7 @@ values /man/2/sys-stat
values /man/2/ubfa
values /man/2/volume
values /man/2/w3c-css
+values /man/2/w3c-uris
values /man/2/w3c-xpointers
values /man/3/audio
values /man/3/cons
@@ -60700,6 +61341,7 @@ verbatim /man/1/alphabet-abc
verbatim /man/1/alphabet-grid
verbatim /man/6/sexprs
verbatim /man/9/1copyright
+verbose /man/1/ar
verbose /man/1/secstore
verbose /man/10/iar
verbose /man/2/filter-deflate
@@ -61004,6 +61646,7 @@ visible /man/1/cpu
visible /man/1/listen
visible /man/1/mash-tk
visible /man/1/mk
+visible /man/1/sh-tk
visible /man/10/2c
visible /man/10/kproc
visible /man/10/mk
@@ -61153,12 +61796,15 @@ vseprint /man/10/print
vsmprint /man/10/print
vsnprint /man/10/print
vsync /man/3/vga
+vuaibclo /man/1/ar
vuaibclo /man/10/iar
vulnerable /man/2/security-0intro
vv /man/1/webgrab
vxxxx /man/10/iar
vy1 /man/3/tv
+w3c /man/2/rfc822
w3c /man/2/w3c-css
+w3c /man/2/w3c-uris
w3c /man/2/w3c-xpointers
wait /man/1/charon
wait /man/1/mash
@@ -61248,6 +61894,7 @@ wants /man/2/sh
warn /man/10/2c
warn /man/2/itslib
warning /man/1/acme
+warning /man/1/ar
warning /man/1/limbo
warning /man/1/mkdir
warning /man/10/2c
@@ -61906,6 +62553,7 @@ won't /man/9/image
won't /man/9/scale
wordend /man/9/text
wordstart /man/9/text
+wordval /man/2/rfc822
wordy /man/1/alphabet-abc
wordy /man/1/alphabet-grid
workdir /man/1/plumb
@@ -62024,6 +62672,7 @@ write /man/10/qlock
write /man/10/styxserver
write /man/2/bufio
write /man/2/bufio-chanfill
+write /man/2/csv
write /man/2/dbm
write /man/2/diskblocks
write /man/2/draw-context
@@ -62479,6 +63128,7 @@ xoff /man/3/eia
xon /man/3/eia
xor /man/1/fc
xor /man/1/sh-expr
+xor /man/2/keyring-ipint
xor /man/8/signer
xored /man/2/crc
xorigin /man/9/canvas
@@ -62517,6 +63167,7 @@ xview /man/9/scrollbar
xview /man/9/text
xx /man/1/fc
xx /man/2/draw-example
+xx /man/2/w3c-uris
xx /man/6/man
xx,yy /man/2/draw-example
xxx /man/10/plan9.ini
diff --git a/mkfile b/mkfile
index 8cb7dfa6..6035a61a 100644
--- a/mkfile
+++ b/mkfile
@@ -72,7 +72,7 @@ nukedist:V: nuke
for j in $DIRS utils tools
do
echo "(cd $j; mk $MKFLAGS $stem)"
- (cd $j; mk $MKFLAGS $stem)
+ (cd $j; mk $MKFLAGS $stem) || exit 1
done
&-Nt:QV:
@@ -100,7 +100,7 @@ emu/&-Posix:QV:
for j in $EMUDIRS
do
echo "(cd $j; mk $MKFLAGS $stem)"
- (cd $j; mk $MKFLAGS $stem)
+ (cd $j; mk $MKFLAGS $stem) || exit 1
done
emu/&-Nt:QV:
@@ -121,7 +121,7 @@ kernel/&-Posix:QV:
for j in $KERNEL_DIRS
do
echo "(cd $j; mk $MKFLAGS $stem)"
- (cd $j; mk $MKFLAGS $stem)
+ (cd $j; mk $MKFLAGS $stem) || exit 1
done
kernel/&-Nt:QV:
diff --git a/mkfiles/mkfile-FreeBSD-386 b/mkfiles/mkfile-FreeBSD-386
index f7846a76..8ac7d34b 100644
--- a/mkfiles/mkfile-FreeBSD-386
+++ b/mkfiles/mkfile-FreeBSD-386
@@ -6,7 +6,7 @@ O= o
OS= o
AR= ar
-ARFLAGS= crvs
+ARFLAGS= ruvs
AS= cc -c
ASFLAGS=
diff --git a/mkfiles/mkfile-Linux-386 b/mkfiles/mkfile-Linux-386
index fbbbc766..e772df87 100644
--- a/mkfiles/mkfile-Linux-386
+++ b/mkfiles/mkfile-Linux-386
@@ -6,7 +6,7 @@ O= o
OS= o
AR= ar
-ARFLAGS= crvs
+ARFLAGS= ruvs
AS= cc -c -m32
ASFLAGS=
diff --git a/mkfiles/mkfile-MacOSX-power b/mkfiles/mkfile-MacOSX-power
index df29d6a4..de1b29db 100644
--- a/mkfiles/mkfile-MacOSX-power
+++ b/mkfiles/mkfile-MacOSX-power
@@ -6,10 +6,10 @@ O= o
OS= o
AR= ar
-ARFLAGS= crvs
+ARFLAGS= ruvs
A= a
-AS= cc -c
+AS= cc -c -arch ppc
ASFLAGS=
CC= cc -c
@@ -23,7 +23,7 @@ COPTFLAGS= -O2
CDEBFLAGS= -g
CTHREADFLAGS=
-LD= cc
+LD= cc -arch ppc
LDFLAGS= -multiply_defined suppress
SYSLIBS=
diff --git a/mkfiles/mkfile-Unixware-386 b/mkfiles/mkfile-Unixware-386
index 28a183c8..b92d16b5 100644
--- a/mkfiles/mkfile-Unixware-386
+++ b/mkfiles/mkfile-Unixware-386
@@ -10,7 +10,7 @@ OS= o
AR= ar
-ARFLAGS= crvs
+ARFLAGS= ruvs
AS= cc -c
ASFLAGS=
diff --git a/mkfiles/mklibsubdirs b/mkfiles/mklibsubdirs
index 2a0424a7..09949cad 100644
--- a/mkfiles/mklibsubdirs
+++ b/mkfiles/mklibsubdirs
@@ -20,6 +20,6 @@ clean:V: clean-$SHELLTYPE
do
if test -d $j; then
echo "(cd $j; mk $MKFLAGS SYSTARG=$SYSTARG OBJTYPE=$OBJTYPE $stem)"
- (cd $j; mk $MKFLAGS 'SYSTARG='$SYSTARG 'OBJTYPE='$OBJTYPE $stem)
+ (cd $j; mk $MKFLAGS 'SYSTARG='$SYSTARG 'OBJTYPE='$OBJTYPE $stem) || exit 1
fi || test ! -e $j
done
diff --git a/mkfiles/mksubdirs b/mkfiles/mksubdirs
index 3192320e..7e1efe05 100644
--- a/mkfiles/mksubdirs
+++ b/mkfiles/mksubdirs
@@ -20,6 +20,6 @@ clean:V: clean-$SHELLTYPE
do
if test -d $j; then
echo "(cd $j; mk $MKFLAGS $stem)"
- (cd $j; mk $MKFLAGS $stem)
+ (cd $j; mk $MKFLAGS $stem) || exit 1
fi || test ! -e $j
done
diff --git a/module/keyring.m b/module/keyring.m
index 753aea12..08a3ef94 100644
--- a/module/keyring.m
+++ b/module/keyring.m
@@ -41,6 +41,12 @@ Keyring: module
# shifts
shl: fn(i: self ref IPint, n: int): ref IPint;
shr: fn(i: self ref IPint, n: int): ref IPint;
+
+ # bitwise
+ and: fn(i1: self ref IPint, i2: ref IPint): ref IPint;
+ ori: fn(i1: self ref IPint, i2: ref IPint): ref IPint;
+ xor: fn(i1: self ref IPint, i2: ref IPint): ref IPint;
+ not: fn(i1: self ref IPint): ref IPint;
};
# signature algorithm
diff --git a/module/xml.m b/module/xml.m
index ee83a0c1..a6d8e09e 100644
--- a/module/xml.m
+++ b/module/xml.m
@@ -75,4 +75,5 @@ Xml: module {
};
init: fn(): string;
open: fn(f: string, warning: chan of (Locator, string), preelem: string): (ref Parser, string);
+ fopen: fn(f: ref Bufio->Iobuf, srcname: string, warning: chan of (Locator, string), preelem: string): (ref Parser, string);
};
diff --git a/os/README b/os/README
index d3d45872..48beec74 100644
--- a/os/README
+++ b/os/README
@@ -5,10 +5,10 @@ ipaq1110 arm Strongarm SA1110 native kernel for Compaq iPAQ 36xx
sa1110 arm SA1110 code common to most/all SA1110 platforms (eg, ipaq, cerf)
cerf250 arm Intrinsyc Cerfboard250 (PXA250)
-gum arm Gumstix PXA255
+gum arm Gumstix PXA255 not yet ready for distribution
pxa arm general PXA support
-js sparc original port to Javastation-1, not recently tested
+js sparc original port to Javastation-1, included as sparc example but will not build
ks32 arm ARM Evaluator 7t demo
diff --git a/os/ip/loopbackmedium.c b/os/ip/loopbackmedium.c
index 69d87449..d2509d95 100644
--- a/os/ip/loopbackmedium.c
+++ b/os/ip/loopbackmedium.c
@@ -34,7 +34,7 @@ loopbackbind(Ipifc *ifc, int, char**)
ifc->arg = lb;
ifc->mbps = 1000;
- kproc("loopbackread", loopbackread, ifc);
+ kproc("loopbackread", loopbackread, ifc, 0);
}
diff --git a/os/ip/rudp.c b/os/ip/rudp.c
index ce431333..a1a70e9b 100644
--- a/os/ip/rudp.c
+++ b/os/ip/rudp.c
@@ -205,7 +205,7 @@ rudpstartackproc(Proto *rudp)
qlock(&rpriv->apl);
if(rpriv->ackprocstarted == 0){
sprint(kpname, "#I%drudpack", rudp->f->dev);
- kproc(kpname, relackproc, rudp);
+ kproc(kpname, relackproc, rudp, 0);
rpriv->ackprocstarted = 1;
}
qunlock(&rpriv->apl);
diff --git a/os/ipaq1110/NOTICE b/os/ipaq1110/NOTICE
index 11f5df58..c0c5d4c1 100644
--- a/os/ipaq1110/NOTICE
+++ b/os/ipaq1110/NOTICE
@@ -1,6 +1,6 @@
Inferno® Copyright © 1996-1999 Lucent Technologies Inc. All rights reserved.
iPAQ 36xx Inferno port Copyright © 2000-2003 Vita Nuova Holdings Limited. All rights reserved.
-This software is subject to the Vita Nuova Liberal Source Licence, except for the following:
+This software is subject to the terms of ../NOTICE, except for the following:
devaudio.c came from Plan 9 and is covered by the Lucent Public License 1.02
The etherwavelan.c driver was contributed to Plan 9 by nemo@gsyc.escet.urjc.es
diff --git a/os/port/devprof.c b/os/port/devprof.c
index f0ee3ba8..d9603b6e 100644
--- a/os/port/devprof.c
+++ b/os/port/devprof.c
@@ -640,7 +640,7 @@ memprof(int c, Heap *h, ulong n)
i = p-r->base;
k = (r->id<<24) | i;
if(c == 0){
- h->pad = k;
+ h->hprof = k;
k = sizeof(Heap);
}
else{
@@ -657,7 +657,7 @@ memprof(int c, Heap *h, ulong n)
if(c == 3)
k = *(ulong*)h;
else
- k = h->pad;
+ k = h->hprof;
if((r = getrec(k>>24)) == nil){
unlock(&profile.l);
return;
diff --git a/os/port/error.h b/os/port/error.h
index 5d5c2f66..88492770 100644
--- a/os/port/error.h
+++ b/os/port/error.h
@@ -30,9 +30,6 @@ extern char Ehungup[]; /* i/o on hungup channel */
extern char Ebadctl[]; /* bad process or channel control request */
extern char Enodev[]; /* no free devices */
extern char Enoenv[]; /* no free environment resources */
-extern char Emuxshutdown[]; /* mux server shut down */
-extern char Emuxbusy[]; /* all mux channels busy */
-extern char Emuxmsg[]; /* bad mux message format or mismatch */
extern char Ethread[]; /* thread exited */
extern char Estopped[]; /* thread must be stopped */
extern char Enochild[]; /* no living children */
diff --git a/os/port/exportfs.c b/os/port/exportfs.c
index 354574ef..c8755fa8 100644
--- a/os/port/exportfs.c
+++ b/os/port/exportfs.c
@@ -511,6 +511,7 @@ exslave(void*)
Export *fs;
Exq *q, *t, *fq, **last;
char *err;
+ int nstat;
for(;;){
qlock(&exq.qwait);
@@ -569,7 +570,11 @@ exslave(void*)
break;
case Tstat:
q->out.stat = q->buf + MSGHDRSZ + BIT16SZ; /* leaves it just where we want it */
- q->out.nstat = q->bsize-(MSGHDRSZ+BIT16SZ);
+ nstat = q->bsize;
+ if(nstat > STATMAX)
+ nstat = STATMAX;
+ nstat -= MSGHDRSZ+BIT16SZ;
+ q->out.nstat = nstat;
break;
}
err = (*fcalls[q->in.type])(fs, &q->in, &q->out);
diff --git a/os/port/inferno.c b/os/port/inferno.c
index de9ea600..82de83d6 100644
--- a/os/port/inferno.c
+++ b/os/port/inferno.c
@@ -586,6 +586,7 @@ Sys_dial(void *fp)
return;
f->ret->t1.dfd = mkfd(f->ret->t0);
+ f->ret->t0 = 0;
f->ret->t1.cfd = mkfd(cfd);
retstr(dir, &f->ret->t1.dir);
}
@@ -609,6 +610,7 @@ Sys_announce(void *fp)
return;
f->ret->t1.cfd = mkfd(f->ret->t0);
+ f->ret->t0 = 0;
retstr(dir, &f->ret->t1.dir);
}
@@ -632,6 +634,7 @@ Sys_listen(void *fp)
return;
f->ret->t1.cfd = mkfd(f->ret->t0);
+ f->ret->t0 = 0;
retstr(dir, &f->ret->t1.dir);
}
diff --git a/os/port/portmkfile b/os/port/portmkfile
index 9ee9a7f7..111cc81f 100644
--- a/os/port/portmkfile
+++ b/os/port/portmkfile
@@ -20,9 +20,6 @@ CLEANEXTRA=
%.$O: ../ip/%.c
$CC $CFLAGS -I. ../ip/$stem.c
-%.$O: ../kfs/%.c
- $CC $CFLAGS -I. ../kfs/$stem.c
-
&.$O: $HFILES $PORTHFILES
$INSTALLDIR/%: %
diff --git a/utils/0c/peep.c b/utils/0c/peep.c
index a9a43da4..a7a60403 100644
--- a/utils/0c/peep.c
+++ b/utils/0c/peep.c
@@ -403,6 +403,7 @@ copy1(Adr *v1, Adr *v2, Reg *r, int f)
* 4 if set and used
* 0 otherwise (not touched)
*/
+int
copyu(Prog *p, Adr *v, Adr *s)
{
@@ -410,7 +411,7 @@ copyu(Prog *p, Adr *v, Adr *s)
default:
if(debug['P'])
- print(" (???)");
+ print(" (?)");
return 2;
diff --git a/utils/0c/reg.c b/utils/0c/reg.c
index 0ed8d696..813ace1a 100644
--- a/utils/0c/reg.c
+++ b/utils/0c/reg.c
@@ -1115,6 +1115,7 @@ RtoB(int r)
return 1L << (r-3);
}
+int
BtoR(long b)
{
diff --git a/utils/5c/peep.c b/utils/5c/peep.c
index 4eded1dc..ba22e40d 100644
--- a/utils/5c/peep.c
+++ b/utils/5c/peep.c
@@ -884,7 +884,7 @@ copyu(Prog *p, Adr *v, Adr *s)
default:
if(debug['P'])
- print(" (???)");
+ print(" (?)");
return 2;
case AMOVM:
diff --git a/utils/5c/txt.c b/utils/5c/txt.c
index d1025e7f..af53e1de 100644
--- a/utils/5c/txt.c
+++ b/utils/5c/txt.c
@@ -1079,6 +1079,7 @@ gopcode(int o, Node *f1, Node *f2, Node *t)
print("%P\n", p);
}
+int
samaddr(Node *f, Node *t)
{
diff --git a/utils/5l/obj.c b/utils/5l/obj.c
index f70f7356..af9380dc 100644
--- a/utils/5l/obj.c
+++ b/utils/5l/obj.c
@@ -1417,6 +1417,7 @@ nuxiinit(void)
Bflush(&bso);
}
+int
find1(long l, int c)
{
char *p;
diff --git a/utils/acid/os-Nt.c b/utils/acid/os-Nt.c
index 5966d718..89358db2 100644
--- a/utils/acid/os-Nt.c
+++ b/utils/acid/os-Nt.c
@@ -168,6 +168,7 @@ runcmd(char *cmd)
void (*notefunc)(int);
+void
os_notify(void (*func)(int))
{
notefunc = func;
diff --git a/utils/acid/os-Posix.c b/utils/acid/os-Posix.c
index 58b4b255..3729db69 100644
--- a/utils/acid/os-Posix.c
+++ b/utils/acid/os-Posix.c
@@ -104,6 +104,7 @@ runcmd(char *cmd)
void (*notefunc)(int);
+void
os_notify(void (*func)(int))
{
notefunc = func;
diff --git a/utils/c2l/cc.h b/utils/c2l/cc.h
index 3900506d..2d16efb7 100644
--- a/utils/c2l/cc.h
+++ b/utils/c2l/cc.h
@@ -634,6 +634,7 @@ void pdecl(int, Type*, Sym*);
Decl* push(void);
Decl* push1(Sym*);
Node* revertdcl(void);
+#undef round
#define round ccround
long round(long, int);
int rsametype(Type*, Type*, int, int);
diff --git a/utils/data2s/data2s.c b/utils/data2s/data2s.c
index 97244fb1..56b2aadd 100644
--- a/utils/data2s/data2s.c
+++ b/utils/data2s/data2s.c
@@ -25,7 +25,10 @@ main(int argc, char *argv[])
Bprint(&bout, "\\z");
Bprint(&bout, "\"\n");
}
- Bprint(&bout, "GLOBL %scode+0(SB), $%ld\n", argv[1], len);
+ if(len == 0)
+ Bprint(&bout, "GLOBL %scode+0(SB), $1\n", argv[1]);
+ else
+ Bprint(&bout, "GLOBL %scode+0(SB), $%ld\n", argv[1], len);
Bprint(&bout, "GLOBL %slen+0(SB), $4\n", argv[1]);
Bprint(&bout, "DATA %slen+0(SB)/4, $%ld\n", argv[1], len);
exits(0);
diff --git a/utils/kc/peep.c b/utils/kc/peep.c
index da6c1449..541281d0 100644
--- a/utils/kc/peep.c
+++ b/utils/kc/peep.c
@@ -147,6 +147,7 @@ uniqs(Reg *r)
return r1;
}
+int
regzer(Adr *a)
{
@@ -160,6 +161,7 @@ regzer(Adr *a)
return 0;
}
+int
regtyp(Adr *a)
{
@@ -312,6 +314,7 @@ copyprop(Reg *r0)
return copy1(v1, v2, r0->s1, 0);
}
+int
copy1(Adr *v1, Adr *v2, Reg *r, int f)
{
int t;
@@ -404,7 +407,7 @@ copyu(Prog *p, Adr *v, Adr *s)
default:
if(debug['P'])
- print(" (???)");
+ print(" (?)");
return 2;
diff --git a/utils/kc/reg.c b/utils/kc/reg.c
index 35c2e7db..309827f7 100644
--- a/utils/kc/reg.c
+++ b/utils/kc/reg.c
@@ -1111,6 +1111,7 @@ FtoB(int f)
return 1L << (f/2 + 20);
}
+int
BtoF(long b)
{
diff --git a/utils/kc/txt.c b/utils/kc/txt.c
index 71f804ba..d377859a 100644
--- a/utils/kc/txt.c
+++ b/utils/kc/txt.c
@@ -1111,6 +1111,7 @@ gopcode(int o, Node *f1, Node *f2, Node *t)
print("%P\n", p);
}
+int
samaddr(Node *f, Node *t)
{
diff --git a/utils/lib/yaccpar b/utils/lib/yaccpar
index efc1da06..79a8d4e0 100644
--- a/utils/lib/yaccpar
+++ b/utils/lib/yaccpar
@@ -21,7 +21,7 @@ extern int sprint(char*, char*, ...);
char*
yytokname(int yyc)
{
- static char x[10];
+ static char x[16];
if(yyc > 0 && yyc <= sizeof(yytoknames)/sizeof(yytoknames[0]))
if(yytoknames[yyc-1])
@@ -33,7 +33,7 @@ yytokname(int yyc)
char*
yystatname(int yys)
{
- static char x[10];
+ static char x[16];
if(yys >= 0 && yys < sizeof(yystates)/sizeof(yystates[0]))
if(yystates[yys])
diff --git a/utils/libmach/5db.c b/utils/libmach/5db.c
index 1a125042..8312487c 100644
--- a/utils/libmach/5db.c
+++ b/utils/libmach/5db.c
@@ -689,7 +689,7 @@ armfmov(Map *map, Rgetter rget, Instr *i, ulong pc)
/* LDR */
/* BUG: Needs LDH/B, too */
- if((i->w>>26)&0x3 == 1) {
+ if(((i->w>>26)&0x3) == 1) {
if(get4(map, armaddr(map, rget, i), (long*)&v) < 0) {
werrstr("can't read instruction: %r");
return pc+4;
@@ -698,9 +698,7 @@ armfmov(Map *map, Rgetter rget, Instr *i, ulong pc)
}
/* MOV */
- v = armshiftval(map, rget, i);
-
- return v;
+ return armshiftval(map, rget, i);
}
static Opcode opcodes[] =
diff --git a/utils/mk/graph.c b/utils/mk/graph.c
index 018e4aea..a6886d8d 100644
--- a/utils/mk/graph.c
+++ b/utils/mk/graph.c
@@ -132,7 +132,7 @@ togo(Node *node)
}
}
-static
+static int
vacuous(Node *node)
{
Arc *la, *a;
diff --git a/utils/mk/mk.c b/utils/mk/mk.c
index 98d76623..ba257d7c 100644
--- a/utils/mk/mk.c
+++ b/utils/mk/mk.c
@@ -183,7 +183,7 @@ update(int fake, Node *node)
/* print("----node %s time=%ld flags=0x%x\n", node->name, node->time, node->flags);/**/
}
-static
+static int
pcmp(char *prog, char *p, char *q)
{
char buf[3*NAMEBLOCK];
diff --git a/utils/mkfile b/utils/mkfile
index c70e52d4..cf6bdf0d 100644
--- a/utils/mkfile
+++ b/utils/mkfile
@@ -99,7 +99,7 @@ nuke:QV: nuke-$TARGMODEL
do
test -d $j || continue
echo "(cd $j; mk $MKFLAGS $stem)"
- (cd $j; mk $MKFLAGS $stem)
+ (cd $j; mk $MKFLAGS $stem) || exit 1
done
%-Nt:QV:
diff --git a/utils/qa/lex.c b/utils/qa/lex.c
index 228ec4e1..e711a5c6 100644
--- a/utils/qa/lex.c
+++ b/utils/qa/lex.c
@@ -662,6 +662,7 @@ zaddr(Gen *a, int s)
case D_OPT:
break;
+ case D_DCR:
case D_SPR:
case D_OREG:
case D_CONST:
diff --git a/utils/qc/peep.c b/utils/qc/peep.c
index bb9a2b4f..69d021be 100644
--- a/utils/qc/peep.c
+++ b/utils/qc/peep.c
@@ -309,6 +309,7 @@ uniqs(Reg *r)
* if the system forces R0 to be zero,
* convert references to $0 to references to R0.
*/
+int
regzer(Adr *a)
{
if(R0ISZERO) {
@@ -323,6 +324,7 @@ regzer(Adr *a)
return 0;
}
+int
regtyp(Adr *a)
{
@@ -490,6 +492,7 @@ copyprop(Reg *r0)
return copy1(v1, v2, r0->s1, 0);
}
+int
copy1(Adr *v1, Adr *v2, Reg *r, int f)
{
int t;
@@ -582,7 +585,7 @@ copyu(Prog *p, Adr *v, Adr *s)
default:
if(debug['P'])
- print(" (???)");
+ print(" (?)");
return 2;
diff --git a/utils/ql/asm.c b/utils/ql/asm.c
index 6887a12b..0c546ee3 100644
--- a/utils/ql/asm.c
+++ b/utils/ql/asm.c
@@ -167,22 +167,22 @@ asmb(void)
lput(lcsize);
break;
case 1:
- lput(0x4a6f7921); /* Joy! */
- lput(0x70656666); /* peff */
- lput(0x70777063); /* pwpc */
+ lput(0x4a6f7921); /* Joy! */
+ lput(0x70656666); /* peff */
+ lput(0x70777063); /* pwpc */
lput(1);
lput(0);
lput(0);
lput(0);
lput(0);
- lput(0x30002); /*YY*/
+ lput(0x30002); /*YY*/
lput(0);
lput(~0);
lput(0);
lput(textsize+datsize);
lput(textsize+datsize);
lput(textsize+datsize);
- lput(0xd0); /* header size */
+ lput(0xd0); /* header size */
lput(0x10400);
lput(~0);
lput(0);
@@ -215,16 +215,16 @@ asmb(void)
lput(0);
lput(0);
lput(0);
- lput(0x3100); /* load address */
+ lput(0x3100); /* load address */
lput(0);
lput(0);
- lput(0); /* whew! */
+ lput(0); /* whew! */
break;
case 2:
if(dlm)
lput(0x80000000 | (4*21*21+7)); /* magic */
else
- lput(4*21*21+7); /* magic */
+ lput(4*21*21+7); /* magic */
lput(textsize); /* sizes */
lput(datsize);
lput(bsssize);
@@ -242,21 +242,21 @@ asmb(void)
lput(symsize); /* nsyms */
lput((0x48L<<16)|15L); /* size of optional hdr and flags */
- lput((0413<<16)|01L); /* magic and version */
+ lput((0413<<16)|01L); /* magic and version */
lput(textsize); /* sizes */
lput(datsize);
lput(bsssize);
lput(entryvalue()); /* va of entry */
lput(INITTEXT); /* va of base of text */
lput(INITDAT); /* va of base of data */
- lput(INITDAT); /* address of TOC */
- lput((1L<<16)|1); /* sn(entry) | sn(text) */
+ lput(INITDAT); /* address of TOC */
+ lput((1L<<16)|1); /* sn(entry) | sn(text) */
lput((2L<<16)|1); /* sn(data) | sn(toc) */
lput((0L<<16)|3); /* sn(loader) | sn(bss) */
lput((3L<<16)|3); /* maxalign(text) | maxalign(data) */
lput(('1'<<24)|('L'<<16)|0); /* type field, and reserved */
- lput(0); /* max stack allowed */
- lput(0); /* max data allowed */
+ lput(0); /* max stack allowed */
+ lput(0); /* max data allowed */
lput(0); lput(0); lput(0); /* reserved */
strnput(".text", 8); /* text segment */
@@ -273,7 +273,7 @@ asmb(void)
lput(INITDAT); /* address */
lput(INITDAT);
lput(datsize);
- lput(rnd(HEADR+textsize, 4096)); /* sizes */
+ lput(rnd(HEADR+textsize, 4096));/* sizes */
lput(0L);
lput(0L);
lput(0L);
@@ -291,46 +291,46 @@ asmb(void)
break;
case 5:
strnput("\177ELF", 4); /* e_ident */
- CPUT(1); /* class = 32 bit */
- CPUT(2); /* data = MSB */
- CPUT(1); /* version = CURRENT */
+ CPUT(1); /* class = 32 bit */
+ CPUT(2); /* data = MSB */
+ CPUT(1); /* version = CURRENT */
strnput("", 9);
- lput((2L<<16)|20L); /* type = EXEC; machine = PowerPC */
- lput(1L); /* version = CURRENT */
+ lput((2L<<16)|20L); /* type = EXEC; machine = PowerPC */
+ lput(1L); /* version = CURRENT */
lput(entryvalue() & ~KMASK); /* entry vaddr */
- lput(52L); /* offset to first phdr */
- lput(0L); /* offset to first shdr */
- lput(0L); /* flags = PPC */
- lput((52L<<16)|32L); /* Ehdr & Phdr sizes*/
- lput((3L<<16)|0L); /* # Phdrs & Shdr size */
- lput((0L<<16)|0L); /* # Shdrs & shdr string size */
-
- lput(1L); /* text - type = PT_LOAD */
- lput(HEADR); /* file offset */
- lput(INITTEXT & ~KMASK); /* vaddr */
- lput(INITTEXT); /* paddr */
- lput(textsize); /* file size */
- lput(textsize); /* memory size */
- lput(0x05L); /* protections = RX */
- lput(0x10000L); /* alignment code?? */
-
- lput(1L); /* data - type = PT_LOAD */
+ lput(52L); /* offset to first phdr */
+ lput(0L); /* offset to first shdr */
+ lput(0L); /* flags = PPC */
+ lput((52L<<16)|32L); /* Ehdr & Phdr sizes*/
+ lput((3L<<16)|0L); /* # Phdrs & Shdr size */
+ lput((0L<<16)|0L); /* # Shdrs & shdr string size */
+
+ lput(1L); /* text - type = PT_LOAD */
+ lput(HEADR); /* file offset */
+ lput(INITTEXT & ~KMASK); /* vaddr */
+ lput(INITTEXT); /* paddr */
+ lput(textsize); /* file size */
+ lput(textsize); /* memory size */
+ lput(0x05L); /* protections = RX */
+ lput(0x10000L); /* alignment */
+
+ lput(1L); /* data - type = PT_LOAD */
lput(HEADR+textsize); /* file offset */
lput(INITDAT & ~KMASK); /* vaddr */
- lput(INITDAT); /* paddr */
- lput(datsize); /* file size */
- lput(datsize); /* memory size */
- lput(0x07L); /* protections = RWX */
- lput(0x10000L); /* alignment code?? */
+ lput(INITDAT); /* paddr */
+ lput(datsize); /* file size */
+ lput(datsize); /* memory size */
+ lput(0x07L); /* protections = RWX */
+ lput(0x10000L); /* alignment */
- lput(0L); /* data - type = PT_NULL */
+ lput(0L); /* data - type = PT_NULL */
lput(HEADR+textsize+datsize); /* file offset */
lput(0L);
lput(0L);
- lput(symsize); /* symbol table size */
- lput(lcsize); /* line number size */
- lput(0x04L); /* protections = R */
- lput(0x04L); /* alignment code?? */
+ lput(symsize); /* symbol table size */
+ lput(lcsize); /* line number size */
+ lput(0x04L); /* protections = R */
+ lput(0x04L); /* alignment code?? */
break;
}
cflush();
diff --git a/utils/ql/l.h b/utils/ql/l.h
index 7ec4aa60..34cb742f 100644
--- a/utils/ql/l.h
+++ b/utils/ql/l.h
@@ -49,7 +49,7 @@ struct Prog
short line;
short mark;
short optab; /* could be uchar */
- uchar as;
+ ushort as;
char reg;
};
struct Sym
@@ -74,7 +74,7 @@ struct Autom
};
struct Optab
{
- uchar as;
+ ushort as;
char a1;
char a2;
char a3;
diff --git a/utils/sqz/sqz.c b/utils/sqz/sqz.c
index cf399e45..d5777a26 100644
--- a/utils/sqz/sqz.c
+++ b/utils/sqz/sqz.c
@@ -41,12 +41,10 @@ static Word* hash2[HSIZE];
static Sqhdr sqhdr;
static ulong chksum;
-static int aflag; /* all: both text (squeezed) and data (not) */
static int dflag; /* squeeze data, not text */
static int tflag; /* squeeze text, leave data as-is */
static int qflag = 1; /* enable powerpc option */
static int wflag; /* write output */
-static int zflag; /* use top==0 for data segment */
static int islittle; /* object code uses little-endian byte order */
static int debug;
static char* fname;
diff --git a/utils/tc/peep.c b/utils/tc/peep.c
index 2842b3e3..e53b0cdd 100644
--- a/utils/tc/peep.c
+++ b/utils/tc/peep.c
@@ -442,7 +442,7 @@ copyu(Prog *p, Adr *v, Adr *s)
default:
if(debug['P'])
- print(" (???)");
+ print(" (?)");
return 2;
case AMOVM:
diff --git a/utils/vc/peep.c b/utils/vc/peep.c
index a9a43da4..1feff699 100644
--- a/utils/vc/peep.c
+++ b/utils/vc/peep.c
@@ -410,7 +410,7 @@ copyu(Prog *p, Adr *v, Adr *s)
default:
if(debug['P'])
- print(" (???)");
+ print(" (?)");
return 2;
diff --git a/utils/vc/reg.c b/utils/vc/reg.c
index c0d294c9..bde52df0 100644
--- a/utils/vc/reg.c
+++ b/utils/vc/reg.c
@@ -1112,6 +1112,7 @@ RtoB(int r)
return 1L << (r-3);
}
+int
BtoR(long b)
{
diff --git a/utils/vl/obj.c b/utils/vl/obj.c
index 26c80683..4c9cafb7 100644
--- a/utils/vl/obj.c
+++ b/utils/vl/obj.c
@@ -1268,6 +1268,7 @@ nuxiinit(void)
Bflush(&bso);
}
+int
find1(long l, int c)
{
char *p;
diff --git a/utils/vl/span.c b/utils/vl/span.c
index 706d8b0e..488c93d3 100644
--- a/utils/vl/span.c
+++ b/utils/vl/span.c
@@ -179,6 +179,7 @@ regoff(Adr *a)
return instoffset;
}
+int
aclass(Adr *a)
{
Sym *s;
diff --git a/utils/yacc/yaccpar b/utils/yacc/yaccpar
index efc1da06..79a8d4e0 100644
--- a/utils/yacc/yaccpar
+++ b/utils/yacc/yaccpar
@@ -21,7 +21,7 @@ extern int sprint(char*, char*, ...);
char*
yytokname(int yyc)
{
- static char x[10];
+ static char x[16];
if(yyc > 0 && yyc <= sizeof(yytoknames)/sizeof(yytoknames[0]))
if(yytoknames[yyc-1])
@@ -33,7 +33,7 @@ yytokname(int yyc)
char*
yystatname(int yys)
{
- static char x[10];
+ static char x[16];
if(yys >= 0 && yys < sizeof(yystates)/sizeof(yystates[0]))
if(yystates[yys])