Browse Source

Plan 9 from Bell Labs 2007-09-13

David du Colombier 16 years ago
parent
commit
63603d6999

+ 23 - 22
dist/replica/_plan9.db

@@ -14,7 +14,7 @@
 386/9pxeload - 775 sys sys 1186619809 326380
 386/bin - 20000000775 sys sys 1018897690 0
 386/bin/8a - 775 sys sys 1168402260 116604
-386/bin/8c - 775 sys sys 1188446807 367214
+386/bin/8c - 775 sys sys 1189651279 367246
 386/bin/8l - 775 sys sys 1148500567 115711
 386/bin/9660srv - 775 sys sys 1168402261 104975
 386/bin/aan - 775 sys sys 1184731221 129822
@@ -236,9 +236,9 @@
 386/bin/fortune - 775 sys sys 1168402308 67356
 386/bin/fossil - 20000000775 sys sys 1042005470 0
 386/bin/fossil/conf - 775 sys sys 1085077052 1506
-386/bin/fossil/flchk - 775 sys sys 1189134784 238377
-386/bin/fossil/flfmt - 775 sys sys 1189134789 246382
-386/bin/fossil/fossil - 775 sys sys 1189134796 365084
+386/bin/fossil/flchk - 775 sys sys 1189651283 238380
+386/bin/fossil/flfmt - 775 sys sys 1189651287 246385
+386/bin/fossil/fossil - 775 sys sys 1189651294 365129
 386/bin/fossil/last - 775 sys sys 1168402310 63550
 386/bin/freq - 775 sys sys 1168402310 62040
 386/bin/fs - 20000000775 sys sys 954380769 0
@@ -270,7 +270,7 @@
 386/bin/grep - 775 sys sys 1168402312 79569
 386/bin/gs - 775 sys sys 1188447224 13278980
 386/bin/gunzip - 775 sys sys 1168402313 80523
-386/bin/gview - 775 sys sys 1179372091 239070
+386/bin/gview - 775 sys sys 1189627772 240774
 386/bin/gzip - 775 sys sys 1178568278 83518
 386/bin/hayes - 775 sys sys 1178568278 63329
 386/bin/hget - 775 sys sys 1188447230 233647
@@ -5829,7 +5829,7 @@ sys/games - 20000000775 sys sys 1117225532 0
 sys/games/lib - 20000000775 sys sys 1165337608 0
 sys/games/lib/4scores - 10000000666 sys sys 1118680448 0
 sys/games/lib/5scores - 10000000666 sys sys 1118680453 0
-sys/games/lib/fortunes - 664 sys sys 1188481493 266620
+sys/games/lib/fortunes - 664 sys sys 1189631972 266898
 sys/games/lib/mahjongg - 20000000775 sys sys 1095792278 0
 sys/games/lib/mahjongg/backgrounds - 20000000775 sys sys 1095792293 0
 sys/games/lib/mahjongg/backgrounds/default.bit - 664 sys sys 1095792293 346803
@@ -7303,6 +7303,7 @@ sys/log/aan - 10000000666 sys sys 1019856844 0
 sys/log/auth - 10000000666 sys sys 959261821 0
 sys/log/cs - 10000000666 sys sys 958934039 0
 sys/log/dns - 10000000666 sys sys 1022008449 0
+sys/log/fossil - 10000000666 sys sys 1189575963 0
 sys/log/ftp - 10000000666 sys sys 958934040 0
 sys/log/httpd - 20000000775 sys sys 1142177993 0
 sys/log/httpd/clf - 666 sys sys 1142177993 0
@@ -7313,7 +7314,7 @@ sys/log/imap4d - 10000000666 sys sys 958934039 0
 sys/log/ipboot - 10000000666 sys sys 958934040 0
 sys/log/ipconfig - 10000000666 sys sys 1185923302 0
 sys/log/listen - 10000000666 sys sys 958934040 0
-sys/log/mail - 10000000666 sys sys 1080177666 724
+sys/log/mail - 10000000666 sys sys 1189576467 914
 sys/log/nfs - 10000000666 sys sys 958934039 0
 sys/log/nfsserver - 10000000666 sys sys 958934040 0
 sys/log/pop3 - 10000000666 sys sys 958934040 0
@@ -7394,7 +7395,7 @@ sys/man/1/grap - 664 sys sys 944959675 6417
 sys/man/1/graph - 664 sys sys 1148227125 3061
 sys/man/1/grep - 664 sys sys 1139690020 2257
 sys/man/1/gs - 664 sys sys 1032054727 6906
-sys/man/1/gview - 664 sys sys 1136378273 4361
+sys/man/1/gview - 664 sys sys 1189617617 5230
 sys/man/1/gzip - 664 sys sys 1186715466 3965
 sys/man/1/hget - 664 sys sys 1141313152 1482
 sys/man/1/history - 664 sys sys 1176744024 1706
@@ -8002,8 +8003,8 @@ sys/src/9/ip/ipaux.c - 664 sys sys 1185486678 12341
 sys/src/9/ip/ipifc.c - 664 sys sys 1184794851 34006
 sys/src/9/ip/ipmux.c - 664 sys sys 1187047550 14991
 sys/src/9/ip/iproute.c - 664 sys sys 1168305878 14778
-sys/src/9/ip/ipv6.c - 664 sys sys 1187735957 14226
-sys/src/9/ip/ipv6.h - 664 sys sys 1187735924 4301
+sys/src/9/ip/ipv6.c - 664 sys sys 1189625381 14192
+sys/src/9/ip/ipv6.h - 664 sys sys 1189625361 4518
 sys/src/9/ip/loopbackmedium.c - 664 sys sys 1055701769 1671
 sys/src/9/ip/netdevmedium.c - 664 sys sys 1045063517 2675
 sys/src/9/ip/netlog.c - 664 sys sys 1188581818 3953
@@ -9958,7 +9959,7 @@ sys/src/cmd/cc/com.c - 664 sys sys 1168702346 22212
 sys/src/cmd/cc/com64.c - 664 sys sys 1143240308 10001
 sys/src/cmd/cc/compat - 664 sys sys 1014925177 684
 sys/src/cmd/cc/compat.c - 664 sys sys 1132451523 454
-sys/src/cmd/cc/dcl.c - 664 sys sys 1143759352 27003
+sys/src/cmd/cc/dcl.c - 664 sys sys 1189631756 27067
 sys/src/cmd/cc/dpchk.c - 664 sys sys 1175892134 7760
 sys/src/cmd/cc/funct.c - 664 sys sys 984718510 6167
 sys/src/cmd/cc/lex.c - 664 sys sys 1188413849 24667
@@ -10345,12 +10346,12 @@ sys/src/cmd/file.c - 664 sys sys 1172764226 28088
 sys/src/cmd/fmt.c - 664 sys sys 1137603598 4078
 sys/src/cmd/fortune.c - 664 sys sys 1072729222 1779
 sys/src/cmd/fossil - 20000000775 sys sys 1087005595 0
-sys/src/cmd/fossil/9.h - 664 sys sys 1138465941 4438
+sys/src/cmd/fossil/9.h - 664 sys sys 1189574983 4510
 sys/src/cmd/fossil/9auth.c - 664 sys sys 1189552651 3972
 sys/src/cmd/fossil/9dir.c - 664 sys sys 1085333382 2219
 sys/src/cmd/fossil/9excl.c - 664 sys sys 1042005502 1887
 sys/src/cmd/fossil/9fid.c - 664 sys sys 1189110070 5584
-sys/src/cmd/fossil/9fsys.c - 664 sys sys 1177432002 33485
+sys/src/cmd/fossil/9fsys.c - 664 sys sys 1189575340 33617
 sys/src/cmd/fossil/9lstn.c - 664 sys sys 1147355153 3038
 sys/src/cmd/fossil/9p.c - 664 sys sys 1189110070 22957
 sys/src/cmd/fossil/9ping.c - 664 sys sys 1042005503 1563
@@ -10360,15 +10361,15 @@ sys/src/cmd/fossil/9user.c - 664 sys sys 1181842829 17277
 sys/src/cmd/fossil/Ccli.c - 664 sys sys 1042005504 1624
 sys/src/cmd/fossil/Ccmd.c - 664 sys sys 1138465941 7985
 sys/src/cmd/fossil/Ccons.c - 664 sys sys 1055703737 6620
-sys/src/cmd/fossil/Clog.c - 664 sys sys 1042005505 591
+sys/src/cmd/fossil/Clog.c - 664 sys sys 1189638175 665
 sys/src/cmd/fossil/archive.c - 664 sys sys 1087005594 10230
 sys/src/cmd/fossil/build - 664 sys sys 1042005505 449
 sys/src/cmd/fossil/buildsh - 775 sys sys 1042005505 561
 sys/src/cmd/fossil/bwatch.c - 664 sys sys 1042005505 6754
 sys/src/cmd/fossil/cache.c - 664 sys sys 1180158132 43913
-sys/src/cmd/fossil/check.c - 664 sys sys 1187136398 17470
+sys/src/cmd/fossil/check.c - 664 sys sys 1189575296 17505
 sys/src/cmd/fossil/conf.rc - 775 sys sys 1084333190 1416
-sys/src/cmd/fossil/dat.h - 664 sys sys 1189552944 7822
+sys/src/cmd/fossil/dat.h - 664 sys sys 1189575011 7906
 sys/src/cmd/fossil/deadlock - 775 sys sys 1042005506 413
 sys/src/cmd/fossil/disk.c - 664 sys sys 1179296683 6993
 sys/src/cmd/fossil/dump.c - 664 sys sys 1042005506 1340
@@ -10376,8 +10377,8 @@ sys/src/cmd/fossil/epoch.c - 664 sys sys 1045600021 997
 sys/src/cmd/fossil/error.c - 664 sys sys 1073851927 1450
 sys/src/cmd/fossil/error.h - 664 sys sys 1073851928 796
 sys/src/cmd/fossil/file.c - 664 sys sys 1177432003 30146
-sys/src/cmd/fossil/flchk.c - 664 sys sys 1087005592 1771
-sys/src/cmd/fossil/flfmt.c - 664 sys sys 1080586881 10753
+sys/src/cmd/fossil/flchk.c - 664 sys sys 1189575301 1806
+sys/src/cmd/fossil/flfmt.c - 664 sys sys 1189575499 10757
 sys/src/cmd/fossil/flfmt9660.c - 664 sys sys 1132451844 12318
 sys/src/cmd/fossil/flfmt9660.h - 664 sys sys 1072830621 134
 sys/src/cmd/fossil/flproto - 664 sys sys 1173736837 222
@@ -10389,18 +10390,18 @@ sys/src/cmd/fossil/fs.h - 664 sys sys 1189552775 1606
 sys/src/cmd/fossil/history - 664 sys sys 1055703793 1400
 sys/src/cmd/fossil/invariants - 664 sys sys 1189552808 4073
 sys/src/cmd/fossil/last.c - 664 sys sys 1087005593 812
-sys/src/cmd/fossil/mkfile - 664 sys sys 1189020178 2641
+sys/src/cmd/fossil/mkfile - 664 sys sys 1189628168 2584
 sys/src/cmd/fossil/nobwatch.c - 664 sys sys 1042005509 329
 sys/src/cmd/fossil/pack.c - 664 sys sys 1187136436 4710
 sys/src/cmd/fossil/periodic.c - 664 sys sys 1061530726 1087
 sys/src/cmd/fossil/source.c - 664 sys sys 1187135867 20578
-sys/src/cmd/fossil/srcload.c - 664 sys sys 1042005510 4178
+sys/src/cmd/fossil/srcload.c - 664 sys sys 1189575580 4185
 sys/src/cmd/fossil/stdinc.h - 664 sys sys 1189020178 156
 sys/src/cmd/fossil/trunc.c - 664 sys sys 1042005511 280
 sys/src/cmd/fossil/unpack - 775 sys sys 1042005511 286
 sys/src/cmd/fossil/vac.c - 664 sys sys 1061530727 12483
 sys/src/cmd/fossil/vac.h - 664 sys sys 1061530727 2779
-sys/src/cmd/fossil/view.c - 664 sys sys 1089299187 19664
+sys/src/cmd/fossil/view.c - 664 sys sys 1189575308 19702
 sys/src/cmd/fossil/walk.c - 664 sys sys 1042005512 963
 sys/src/cmd/freq.c - 664 sys sys 1136378273 1728
 sys/src/cmd/getmap.c - 664 sys sys 954468786 3290
@@ -12353,7 +12354,7 @@ sys/src/cmd/gs/zlib/zlib.3 - 664 sys sys 1137452698 4488
 sys/src/cmd/gs/zlib/zlib.h - 664 sys sys 1137452698 57769
 sys/src/cmd/gs/zlib/zutil.c - 664 sys sys 1137452698 7057
 sys/src/cmd/gs/zlib/zutil.h - 664 sys sys 1137452698 6612
-sys/src/cmd/gview.c - 664 sys sys 1136378274 50883
+sys/src/cmd/gview.c - 664 sys sys 1189617614 54822
 sys/src/cmd/gzip - 20000000775 sys sys 1050689595 0
 sys/src/cmd/gzip/gunzip.c - 664 sys sys 1143759345 6037
 sys/src/cmd/gzip/gzip.c - 664 sys sys 1135487934 3655

+ 23 - 22
dist/replica/plan9.db

@@ -14,7 +14,7 @@
 386/9pxeload - 775 sys sys 1186619809 326380
 386/bin - 20000000775 sys sys 1018897690 0
 386/bin/8a - 775 sys sys 1168402260 116604
-386/bin/8c - 775 sys sys 1188446807 367214
+386/bin/8c - 775 sys sys 1189651279 367246
 386/bin/8l - 775 sys sys 1148500567 115711
 386/bin/9660srv - 775 sys sys 1168402261 104975
 386/bin/aan - 775 sys sys 1184731221 129822
@@ -236,9 +236,9 @@
 386/bin/fortune - 775 sys sys 1168402308 67356
 386/bin/fossil - 20000000775 sys sys 1042005470 0
 386/bin/fossil/conf - 775 sys sys 1085077052 1506
-386/bin/fossil/flchk - 775 sys sys 1189134784 238377
-386/bin/fossil/flfmt - 775 sys sys 1189134789 246382
-386/bin/fossil/fossil - 775 sys sys 1189134796 365084
+386/bin/fossil/flchk - 775 sys sys 1189651283 238380
+386/bin/fossil/flfmt - 775 sys sys 1189651287 246385
+386/bin/fossil/fossil - 775 sys sys 1189651294 365129
 386/bin/fossil/last - 775 sys sys 1168402310 63550
 386/bin/freq - 775 sys sys 1168402310 62040
 386/bin/fs - 20000000775 sys sys 954380769 0
@@ -270,7 +270,7 @@
 386/bin/grep - 775 sys sys 1168402312 79569
 386/bin/gs - 775 sys sys 1188447224 13278980
 386/bin/gunzip - 775 sys sys 1168402313 80523
-386/bin/gview - 775 sys sys 1179372091 239070
+386/bin/gview - 775 sys sys 1189627772 240774
 386/bin/gzip - 775 sys sys 1178568278 83518
 386/bin/hayes - 775 sys sys 1178568278 63329
 386/bin/hget - 775 sys sys 1188447230 233647
@@ -5829,7 +5829,7 @@ sys/games - 20000000775 sys sys 1117225532 0
 sys/games/lib - 20000000775 sys sys 1165337608 0
 sys/games/lib/4scores - 10000000666 sys sys 1118680448 0
 sys/games/lib/5scores - 10000000666 sys sys 1118680453 0
-sys/games/lib/fortunes - 664 sys sys 1188481493 266620
+sys/games/lib/fortunes - 664 sys sys 1189631972 266898
 sys/games/lib/mahjongg - 20000000775 sys sys 1095792278 0
 sys/games/lib/mahjongg/backgrounds - 20000000775 sys sys 1095792293 0
 sys/games/lib/mahjongg/backgrounds/default.bit - 664 sys sys 1095792293 346803
@@ -7303,6 +7303,7 @@ sys/log/aan - 10000000666 sys sys 1019856844 0
 sys/log/auth - 10000000666 sys sys 959261821 0
 sys/log/cs - 10000000666 sys sys 958934039 0
 sys/log/dns - 10000000666 sys sys 1022008449 0
+sys/log/fossil - 10000000666 sys sys 1189575963 0
 sys/log/ftp - 10000000666 sys sys 958934040 0
 sys/log/httpd - 20000000775 sys sys 1142177993 0
 sys/log/httpd/clf - 666 sys sys 1142177993 0
@@ -7313,7 +7314,7 @@ sys/log/imap4d - 10000000666 sys sys 958934039 0
 sys/log/ipboot - 10000000666 sys sys 958934040 0
 sys/log/ipconfig - 10000000666 sys sys 1185923302 0
 sys/log/listen - 10000000666 sys sys 958934040 0
-sys/log/mail - 10000000666 sys sys 1080177666 724
+sys/log/mail - 10000000666 sys sys 1189576467 914
 sys/log/nfs - 10000000666 sys sys 958934039 0
 sys/log/nfsserver - 10000000666 sys sys 958934040 0
 sys/log/pop3 - 10000000666 sys sys 958934040 0
@@ -7394,7 +7395,7 @@ sys/man/1/grap - 664 sys sys 944959675 6417
 sys/man/1/graph - 664 sys sys 1148227125 3061
 sys/man/1/grep - 664 sys sys 1139690020 2257
 sys/man/1/gs - 664 sys sys 1032054727 6906
-sys/man/1/gview - 664 sys sys 1136378273 4361
+sys/man/1/gview - 664 sys sys 1189617617 5230
 sys/man/1/gzip - 664 sys sys 1186715466 3965
 sys/man/1/hget - 664 sys sys 1141313152 1482
 sys/man/1/history - 664 sys sys 1176744024 1706
@@ -8002,8 +8003,8 @@ sys/src/9/ip/ipaux.c - 664 sys sys 1185486678 12341
 sys/src/9/ip/ipifc.c - 664 sys sys 1184794851 34006
 sys/src/9/ip/ipmux.c - 664 sys sys 1187047550 14991
 sys/src/9/ip/iproute.c - 664 sys sys 1168305878 14778
-sys/src/9/ip/ipv6.c - 664 sys sys 1187735957 14226
-sys/src/9/ip/ipv6.h - 664 sys sys 1187735924 4301
+sys/src/9/ip/ipv6.c - 664 sys sys 1189625381 14192
+sys/src/9/ip/ipv6.h - 664 sys sys 1189625361 4518
 sys/src/9/ip/loopbackmedium.c - 664 sys sys 1055701769 1671
 sys/src/9/ip/netdevmedium.c - 664 sys sys 1045063517 2675
 sys/src/9/ip/netlog.c - 664 sys sys 1188581818 3953
@@ -9958,7 +9959,7 @@ sys/src/cmd/cc/com.c - 664 sys sys 1168702346 22212
 sys/src/cmd/cc/com64.c - 664 sys sys 1143240308 10001
 sys/src/cmd/cc/compat - 664 sys sys 1014925177 684
 sys/src/cmd/cc/compat.c - 664 sys sys 1132451523 454
-sys/src/cmd/cc/dcl.c - 664 sys sys 1143759352 27003
+sys/src/cmd/cc/dcl.c - 664 sys sys 1189631756 27067
 sys/src/cmd/cc/dpchk.c - 664 sys sys 1175892134 7760
 sys/src/cmd/cc/funct.c - 664 sys sys 984718510 6167
 sys/src/cmd/cc/lex.c - 664 sys sys 1188413849 24667
@@ -10345,12 +10346,12 @@ sys/src/cmd/file.c - 664 sys sys 1172764226 28088
 sys/src/cmd/fmt.c - 664 sys sys 1137603598 4078
 sys/src/cmd/fortune.c - 664 sys sys 1072729222 1779
 sys/src/cmd/fossil - 20000000775 sys sys 1087005595 0
-sys/src/cmd/fossil/9.h - 664 sys sys 1138465941 4438
+sys/src/cmd/fossil/9.h - 664 sys sys 1189574983 4510
 sys/src/cmd/fossil/9auth.c - 664 sys sys 1189552651 3972
 sys/src/cmd/fossil/9dir.c - 664 sys sys 1085333382 2219
 sys/src/cmd/fossil/9excl.c - 664 sys sys 1042005502 1887
 sys/src/cmd/fossil/9fid.c - 664 sys sys 1189110070 5584
-sys/src/cmd/fossil/9fsys.c - 664 sys sys 1177432002 33485
+sys/src/cmd/fossil/9fsys.c - 664 sys sys 1189575340 33617
 sys/src/cmd/fossil/9lstn.c - 664 sys sys 1147355153 3038
 sys/src/cmd/fossil/9p.c - 664 sys sys 1189110070 22957
 sys/src/cmd/fossil/9ping.c - 664 sys sys 1042005503 1563
@@ -10360,15 +10361,15 @@ sys/src/cmd/fossil/9user.c - 664 sys sys 1181842829 17277
 sys/src/cmd/fossil/Ccli.c - 664 sys sys 1042005504 1624
 sys/src/cmd/fossil/Ccmd.c - 664 sys sys 1138465941 7985
 sys/src/cmd/fossil/Ccons.c - 664 sys sys 1055703737 6620
-sys/src/cmd/fossil/Clog.c - 664 sys sys 1042005505 591
+sys/src/cmd/fossil/Clog.c - 664 sys sys 1189638175 665
 sys/src/cmd/fossil/archive.c - 664 sys sys 1087005594 10230
 sys/src/cmd/fossil/build - 664 sys sys 1042005505 449
 sys/src/cmd/fossil/buildsh - 775 sys sys 1042005505 561
 sys/src/cmd/fossil/bwatch.c - 664 sys sys 1042005505 6754
 sys/src/cmd/fossil/cache.c - 664 sys sys 1180158132 43913
-sys/src/cmd/fossil/check.c - 664 sys sys 1187136398 17470
+sys/src/cmd/fossil/check.c - 664 sys sys 1189575296 17505
 sys/src/cmd/fossil/conf.rc - 775 sys sys 1084333190 1416
-sys/src/cmd/fossil/dat.h - 664 sys sys 1189552944 7822
+sys/src/cmd/fossil/dat.h - 664 sys sys 1189575011 7906
 sys/src/cmd/fossil/deadlock - 775 sys sys 1042005506 413
 sys/src/cmd/fossil/disk.c - 664 sys sys 1179296683 6993
 sys/src/cmd/fossil/dump.c - 664 sys sys 1042005506 1340
@@ -10376,8 +10377,8 @@ sys/src/cmd/fossil/epoch.c - 664 sys sys 1045600021 997
 sys/src/cmd/fossil/error.c - 664 sys sys 1073851927 1450
 sys/src/cmd/fossil/error.h - 664 sys sys 1073851928 796
 sys/src/cmd/fossil/file.c - 664 sys sys 1177432003 30146
-sys/src/cmd/fossil/flchk.c - 664 sys sys 1087005592 1771
-sys/src/cmd/fossil/flfmt.c - 664 sys sys 1080586881 10753
+sys/src/cmd/fossil/flchk.c - 664 sys sys 1189575301 1806
+sys/src/cmd/fossil/flfmt.c - 664 sys sys 1189575499 10757
 sys/src/cmd/fossil/flfmt9660.c - 664 sys sys 1132451844 12318
 sys/src/cmd/fossil/flfmt9660.h - 664 sys sys 1072830621 134
 sys/src/cmd/fossil/flproto - 664 sys sys 1173736837 222
@@ -10389,18 +10390,18 @@ sys/src/cmd/fossil/fs.h - 664 sys sys 1189552775 1606
 sys/src/cmd/fossil/history - 664 sys sys 1055703793 1400
 sys/src/cmd/fossil/invariants - 664 sys sys 1189552808 4073
 sys/src/cmd/fossil/last.c - 664 sys sys 1087005593 812
-sys/src/cmd/fossil/mkfile - 664 sys sys 1189020178 2641
+sys/src/cmd/fossil/mkfile - 664 sys sys 1189628168 2584
 sys/src/cmd/fossil/nobwatch.c - 664 sys sys 1042005509 329
 sys/src/cmd/fossil/pack.c - 664 sys sys 1187136436 4710
 sys/src/cmd/fossil/periodic.c - 664 sys sys 1061530726 1087
 sys/src/cmd/fossil/source.c - 664 sys sys 1187135867 20578
-sys/src/cmd/fossil/srcload.c - 664 sys sys 1042005510 4178
+sys/src/cmd/fossil/srcload.c - 664 sys sys 1189575580 4185
 sys/src/cmd/fossil/stdinc.h - 664 sys sys 1189020178 156
 sys/src/cmd/fossil/trunc.c - 664 sys sys 1042005511 280
 sys/src/cmd/fossil/unpack - 775 sys sys 1042005511 286
 sys/src/cmd/fossil/vac.c - 664 sys sys 1061530727 12483
 sys/src/cmd/fossil/vac.h - 664 sys sys 1061530727 2779
-sys/src/cmd/fossil/view.c - 664 sys sys 1089299187 19664
+sys/src/cmd/fossil/view.c - 664 sys sys 1189575308 19702
 sys/src/cmd/fossil/walk.c - 664 sys sys 1042005512 963
 sys/src/cmd/freq.c - 664 sys sys 1136378273 1728
 sys/src/cmd/getmap.c - 664 sys sys 954468786 3290
@@ -12353,7 +12354,7 @@ sys/src/cmd/gs/zlib/zlib.3 - 664 sys sys 1137452698 4488
 sys/src/cmd/gs/zlib/zlib.h - 664 sys sys 1137452698 57769
 sys/src/cmd/gs/zlib/zutil.c - 664 sys sys 1137452698 7057
 sys/src/cmd/gs/zlib/zutil.h - 664 sys sys 1137452698 6612
-sys/src/cmd/gview.c - 664 sys sys 1136378274 50883
+sys/src/cmd/gview.c - 664 sys sys 1189617614 54822
 sys/src/cmd/gzip - 20000000775 sys sys 1050689595 0
 sys/src/cmd/gzip/gunzip.c - 664 sys sys 1143759345 6037
 sys/src/cmd/gzip/gzip.c - 664 sys sys 1135487934 3655

+ 30 - 0
dist/replica/plan9.log

@@ -52740,3 +52740,33 @@
 1189553403 2 c sys/src/cmd/fossil/fns.h - 664 sys sys 1189552875 3262
 1189553403 3 c sys/src/cmd/fossil/fs.h - 664 sys sys 1189552775 1606
 1189553403 4 c sys/src/cmd/fossil/invariants - 664 sys sys 1189552808 4073
+1189575003 0 c sys/src/cmd/fossil/9.h - 664 sys sys 1189574983 4510
+1189575003 1 c sys/src/cmd/fossil/dat.h - 664 sys sys 1189575011 7906
+1189576806 0 a sys/log/fossil - 10000000666 sys sys 1189575963 0
+1189576806 1 c sys/log/mail - 10000000666 sys sys 1189576467 914
+1189576806 2 a sys/log/pqlook - 666 sys sys 1189576572 123
+1189576806 3 c sys/src/cmd/fossil/9fsys.c - 664 sys sys 1189575340 33617
+1189576806 4 c sys/src/cmd/fossil/Clog.c - 664 sys sys 1189575348 537
+1189576806 5 c sys/src/cmd/fossil/check.c - 664 sys sys 1189575296 17505
+1189576806 6 c sys/src/cmd/fossil/flchk.c - 664 sys sys 1189575301 1806
+1189576806 7 c sys/src/cmd/fossil/flfmt.c - 664 sys sys 1189575499 10757
+1189576806 8 c sys/src/cmd/fossil/srcload.c - 664 sys sys 1189575580 4185
+1189576806 9 c sys/src/cmd/fossil/view.c - 664 sys sys 1189575308 19702
+1189616404 0 d sys/log/pqlook - 666 sys sys 1189576572 0
+1189618205 0 c sys/man/1/gview - 664 sys sys 1189617617 5230
+1189618205 1 c sys/src/cmd/gview.c - 664 sys sys 1189617614 54822
+1189625405 0 c sys/src/9/ip/ipv6.c - 664 sys sys 1189625381 14192
+1189625405 1 c sys/src/9/ip/ipv6.h - 664 sys sys 1189625361 4518
+1189629005 0 c 386/bin/fossil/flchk - 775 sys sys 1189627751 241008
+1189629005 1 c 386/bin/fossil/flfmt - 775 sys sys 1189627757 248512
+1189629005 2 c 386/bin/fossil/fossil - 775 sys sys 1189627766 367256
+1189629005 3 c 386/bin/gview - 775 sys sys 1189627772 240774
+1189629005 4 c sys/src/cmd/fossil/mkfile - 664 sys sys 1189628168 2584
+1189632604 0 c sys/games/lib/fortunes - 664 sys sys 1189631972 266898
+1189632604 1 c sys/src/cmd/cc/dcl.c - 664 sys sys 1189631756 27067
+1189638004 0 c sys/src/cmd/fossil/Clog.c - 664 sys sys 1189636477 537
+1189639804 0 c sys/src/cmd/fossil/Clog.c - 664 sys sys 1189638175 665
+1189652404 0 c 386/bin/8c - 775 sys sys 1189651279 367246
+1189652404 1 c 386/bin/fossil/flchk - 775 sys sys 1189651283 238380
+1189652404 2 c 386/bin/fossil/flfmt - 775 sys sys 1189651287 246385
+1189652404 3 c 386/bin/fossil/fossil - 775 sys sys 1189651294 365129

+ 2 - 0
sys/games/lib/fortunes

@@ -4193,3 +4193,5 @@ Th' canny man keeps his money in sheep - or he keeps it in th' First Presbyteria
 ttcp-r: 3689238521928343900000000000000 bytes in 41.02 real seconds = 87829643931512629000000000.00 KB/sec +++
 By the time you finish reading this article, you will be able to take advantage of the coolest file system feature to be implemented since the symbolic link.  - CLI Magic: Use Extended Attributes for better file management By Ryan Paul
 Intel Pentium 4 2.0Hz processor - TigerDirect catalogue
+You are roughly 2^90 times more likely to win a U.S. state lottery *and* be struck by lightning simultaneously than you are to encounter [an accidental SHA1 collision] in your file system.  - J. Black
+prelink - prelink ELF shared libraries and binaries to speed up startup time

+ 0 - 0
sys/log/fossil


+ 2 - 0
sys/log/mail

@@ -5,3 +5,5 @@ achille Mar 24 08:24:34 remote local!jmk From presotto Wed Mar 24 08:24:28 EST 2
 achille Mar 24 08:46:24 remote local!jmk From presotto Wed Mar 24 08:46:18 EST 2004 (jmk) 436
 achille Mar 24 19:33:44 remote local!ehg From presotto Wed Mar 24 19:33:42 EST 2004 (ehg) 21973
 achille Mar 24 20:21:06 remote local!jmk From presotto Wed Mar 24 20:21:00 EST 2004 (jmk) 1204
+olive Sep 12 01:52:28 remote uce.gov!spam From geoff Wed Sep 12 01:52:26 EDT 2007 4431
+olive Sep 12 01:54:27 remote lsub.org!nemo From geoff Wed Sep 12 01:54:25 EDT 2007 (nemo@lsub.org) 428

+ 50 - 3
sys/man/1/gview

@@ -87,13 +87,18 @@ There is a
 .I recolor
 command on button 3 that lets you select a color and change everything
 to have that color, and a similar command on button 2 that only affects
-the selected polyline.  The
+the selected polyline.  If the input file uses the
+.B Multi(...)
+feature explained below, either flavor of
+.I recolor
+allows you to type a digit in lieu of selecting a color.
+.PP
+The
 .I thick
 or
 .I thin
 command on button 2 changes the thickness of the selected polyline
 and there is also an undo command for such edits.
-.PP
 Finally, button 3 has commands to
 .I read
 a new input file and display it on top of everything else,
@@ -116,6 +121,12 @@ on a line by itself.  The label at the end of the last polyline is
 optional.   It is not legal to have two consecutive labels, since that
 would denote a zero-vertex polyline and each polyline must have at least
 one vertex. (One-vertex polylines are useful for scatter plots.)
+Under the
+.B -l
+option, a newline causes the selected polyline's label to appear in
+the log file (where it could be seen by invoking
+.B tail -f
+in another window).
 
 If the label after a polyline contains the word
 .B "Thick"
@@ -137,6 +148,35 @@ or a color name
 .BR Black ,
 .BR White ),
 whichever color name comes first will be used to color the polyline.
+Alternatively, labels can contain
+.B Multi
+followed by single-letter versions of these names:
+.BR (R ,
+.BR P ,
+.BR r ,
+.BR O ,
+.BR Y ,
+.BR y ,
+.BR G ,
+.BR g ,
+.BR C ,
+.BR B ,
+.BR b ,
+.BR M ,
+.BR V ,
+.BR A ,
+.BR K ,
+.BR W ,
+each optionally preceded by
+.BR T ).
+Then
+.I recolor
+followed by a nonzero digit
+.I n
+selects the
+.IR n th
+alternative for each polyline.
+
 .SH EXAMPLE
 To see a graph of the function
 .IR y = sin( x )/ x ,
@@ -149,9 +189,16 @@ awk 'BEGIN{for(x=.1;x<500;x+=.1)print x,sin(x)/x}' | gview
 .SH SOURCE
 .B /sys/src/cmd/gview.c
 .SH SEE ALSO
-.IR awk (1)
+.IR awk (1),
+.IR tail (1)
 .SH BUGS
 The user interface for the
 .I slant
 command is counter-intuitive.  Perhaps it would be better to have a scheme
 for sweeping out a parallelogram.
+.PP
+The
+.B -p
+option makes the interactive point selection feature behave strangely, and
+is unnecessary since extra blank lines in the input achieve essentially the
+same effect.

+ 6 - 10
sys/src/9/ip/ipv6.c

@@ -527,16 +527,12 @@ unfraglen(Block *bp, uchar *nexthdr, int setfh)
 	ufl = IP6HDR;
 	p += ufl;
 
-	for(;;) {
-		if(*nexthdr == HBH || *nexthdr == RH) {
-			*nexthdr = *p;
-			hs = ((int)*(p+1) + 1) * 8;
-			ufl += hs;
-			q = p;
-			p += hs;
-		}
-		else
-			break;
+	while (*nexthdr == HBH || *nexthdr == RH) {
+		*nexthdr = *p;
+		hs = ((int)*(p+1) + 1) * 8;
+		ufl += hs;
+		q = p;
+		p += hs;
 	}
 
 	if(*nexthdr == FH)

+ 6 - 0
sys/src/9/ip/ipv6.h

@@ -131,6 +131,12 @@ struct	Opthdr {
 	uchar	len;
 };
 
+/*
+ * Beware routing header type 0 (loose source routing); see
+ * http://www.secdev.org/conf/IPv6_RH_security-csw07.pdf.
+ * Type 1 is unused.  Type 2 is for MIPv6 (mobile IPv6) filtering
+ * against type 0 header.
+ */
 struct	Routinghdr {
 	uchar	nexthdr;
 	uchar	len;

+ 2 - 0
sys/src/cmd/cc/dcl.c

@@ -975,6 +975,8 @@ rsametype(Type *t1, Type *t2, int n, int f)
 				snap(t1);
 			if(t2->link == T)
 				snap(t2);
+			if(t1 != t2 && t1->link == T && t2->link == T)
+				return 0;
 			t1 = t1->link;
 			t2 = t2->link;
 			for(;;) {

+ 4 - 2
sys/src/cmd/fossil/9.h

@@ -55,8 +55,8 @@ struct Con {
 	char*	name;
 	uchar*	data;			/* max, not negotiated */
 	int	isconsole;		/* immutable */
-	int	flags;		/* immutable */
-	char		remote[128];	/* immutable */
+	int	flags;			/* immutable */
+	char	remote[128];		/* immutable */
 	VtLock*	lock;
 	int	state;
 	int	fd;
@@ -229,6 +229,7 @@ extern int cliAddCmd(char*, int (*)(int, char*[]));
 extern int cliError(char*, ...);
 extern int cliInit(void);
 extern int cliExec(char*);
+#pragma	varargck	argpos	cliError	1
 
 /*
  * Ccmd.c
@@ -249,6 +250,7 @@ extern int consWrite(char*, int);
  */
 extern int consPrint(char*, ...);
 extern int consVPrint(char*, va_list);
+#pragma	varargck	argpos	consPrint	1
 
 /*
  * fossil.c

+ 8 - 7
sys/src/cmd/fossil/9fsys.c

@@ -1,7 +1,6 @@
 #include "stdinc.h"
 #include "dat.h"
 #include "fns.h"
-
 #include "9.h"
 
 typedef struct Fsys Fsys;
@@ -9,7 +8,7 @@ typedef struct Fsys Fsys;
 struct Fsys {
 	VtLock* lock;
 
-	char*	name;
+	char*	name;		/* copy here & Fs to ease error reporting */
 	char*	dev;
 	char*	venti;
 
@@ -82,7 +81,8 @@ cmdPrintConfig(int argc, char* argv[])
 	for(fsys = sbox.head; fsys != nil; fsys = fsys->next){
 		consPrint("\tfsys %s config %s\n", fsys->name, fsys->dev);
 		if(fsys->venti && fsys->venti[0])
-			consPrint("\tfsys %s venti %q\n", fsys->name, fsys->venti);
+			consPrint("\tfsys %s venti %q\n", fsys->name,
+				fsys->venti);
 	}
 	vtRUnlock(sbox.lock);
 	return 1;
@@ -754,7 +754,7 @@ fsysBfree(Fsys* fsys, int argc, char* argv[])
 	while(argc > 0){
 		addr = strtoul(argv[0], &p, 0);
 		if(*p != '\0'){
-			consPrint("bad address - '%s'\n", addr);
+			consPrint("bad address - '%ud'\n", addr);
 			/* syntax error; let's stop */
 			vtRUnlock(fs->elk);
 			return 0;
@@ -803,7 +803,7 @@ fsysDf(Fsys *fsys, int argc, char* argv[])
 
 	fs = fsys->fs;
 	cacheCountUsed(fs->cache, fs->elo, &used, &tot, &bsize);
-	consPrint("\t%s: %,llud used + %,llud free = %,llud (%ud%% used)\n",
+	consPrint("\t%s: %,llud used + %,llud free = %,llud (%llud%% used)\n",
 		fsys->name, used*(vlong)bsize, (tot-used)*(vlong)bsize,
 		tot*(vlong)bsize, used*100LL/tot);
 	return 1;
@@ -1150,11 +1150,11 @@ fsysStat(Fsys* fsys, int argc, char* argv[])
 	vtRLock(fsys->fs->elk);
 	for(i=0; i<argc; i++){
 		if((f = fileOpen(fsys->fs, argv[i])) == nil){
-			consPrint("%s: %R\n");
+			consPrint("%s: %R\n", argv[i]);
 			continue;
 		}
 		if(!fileGetDir(f, &de)){
-			consPrint("%s: %R\n");
+			consPrint("%s: %R\n", argv[i]);
 			fileDecRef(f);
 			continue;
 		}
@@ -1534,6 +1534,7 @@ fsysOpen(char* name, int argc, char* argv[])
 		fsysPut(fsys);
 		return 0;
 	}
+	fsys->fs->name = fsys->name;	/* for better error messages */
 	fsys->noauth = noauth;
 	fsys->noperm = noperm;
 	fsys->wstatallow = wstatallow;

+ 24 - 25
sys/src/cmd/fossil/Clog.c

@@ -1,41 +1,40 @@
 #include "stdinc.h"
-
 #include "9.h"
 
 /*
- * Dummy for now.
+ * To do: This will become something else ('vprint'?).
  */
-
 int
-consPrint(char* fmt, ...)
+consVPrint(char* fmt, va_list args)
 {
-	int len;
-	va_list args;
-	char buf[ERRMAX];
+	int len, ret;
+	char buf[256];
 
-	/*
-	 * To do:
-	 * This will be integrated with logging and become 'print'.
-	 */
-	va_start(args, fmt);
 	len = vsnprint(buf, sizeof(buf), fmt, args);
-	va_end(args);
+	ret = consWrite(buf, len);
 
-	return consWrite(buf, len);
+	while (len-- > 0 && buf[len] == '\n')
+		buf[len] = '\0';
+	/*
+	 * if we do this, checking the root fossil (if /sys/log/fossil is there)
+	 * will spew all over the console.
+	 */
+	if (0)
+		syslog(0, "fossil", "%s", buf);
+	return ret;
 }
 
+/*
+ * To do: This will become 'print'.
+ */
 int
-consVPrint(char* fmt, va_list args)
+consPrint(char* fmt, ...)
 {
-	int len;
-	char buf[ERRMAX];
-
-	/*
-	 * To do:
-	 * This will be integrated with logging and become
-	 * something else ('vprint'?).
-	 */
-	len = vsnprint(buf, sizeof(buf), fmt, args);
+	int ret;
+	va_list args;
 
-	return consWrite(buf, len);
+	va_start(args, fmt);
+	ret = consVPrint(fmt, args);
+	va_end(args);
+	return ret;
 }

+ 1 - 0
sys/src/cmd/fossil/check.c

@@ -17,6 +17,7 @@ static int	walkEpoch(Fsck *chk, Block *b, uchar score[VtScoreSize],
 static void	warn(Fsck*, char*, ...);
 
 #pragma varargck argpos error 2
+#pragma varargck argpos printnop 1
 #pragma varargck argpos warn 2
 
 static Fsck*

+ 3 - 1
sys/src/cmd/fossil/dat.h

@@ -77,6 +77,8 @@ struct Fs {
 	int	blockSize;	/* immutable */
 	VtSession *z;		/* immutable */
 	Snap	*snap;		/* immutable */
+	/* immutable; copy here & Fsys to ease error reporting */
+	char	*name;
 
 	Periodic *metaFlush; /* periodically flushes metadata cached in files */
 
@@ -128,7 +130,7 @@ struct Source {
 	int	dir;		/* immutable */
 
 	Source	*parent;	/* immutable */
-	File	*file;		/* immutable */
+	File	*file;		/* immutable; point back */
 
 	VtLock	*lk;
 	int	ref;

+ 2 - 0
sys/src/cmd/fossil/flchk.c

@@ -13,6 +13,8 @@ usage(void)
 	exits("usage");
 }
 
+#pragma	varargck	argpos	flprint	1
+
 static int
 flprint(char *fmt, ...)
 {

+ 2 - 2
sys/src/cmd/fossil/flfmt.c

@@ -179,7 +179,8 @@ fdsize(int fd)
 static void
 usage(void)
 {
-	fprint(2, "usage: %s [-b blocksize] [-h host] [-i file offset] [-l label] [-v score] [-y] file\n", argv0);
+	fprint(2, "usage: %s [-b blocksize] [-h host] [-i file offset] "
+		"[-l label] [-v score] [-y] file\n", argv0);
 	exits("usage");
 }
 
@@ -569,4 +570,3 @@ parseScore(uchar *score, char *buf)
 	}
 	return 1;
 }
-

+ 1 - 4
sys/src/cmd/fossil/mkfile

@@ -34,7 +34,7 @@ LIBFILES=\
 
 LIBCFILES=${LIBFILES:%=%.c}
 LIBOFILES=${LIBFILES:%=%.$O}
-LIB=libfs.a.$O
+LIB=libfs.a$O
 
 HFILES=\
 	/sys/include/oventi.h\
@@ -61,8 +61,6 @@ test:V: all
 	slay 8.flfmt | rc
 	slay 8.fossil | rc
 	unmount /n/fossil || status=''
-	9fs emelieother
-	bind -c /n/emelieother/rsc/tmp /tmp
 	{syscall seek 1 6400000000 0; echo} >>/tmp/fossil
 	8.flfmt -y /tmp/fossil
 	8.conf -w /tmp/fossil flproto
@@ -85,7 +83,6 @@ test:V: all
 	echo check >>/srv/test.fscons
 	echo check >>/srv/test.fscons
 	echo check >>/srv/test.fscons
-	
 
 #	cp /env/timezone /n/fossil/tmp
 #	cp /lib/words /n/fossil/tmp

+ 6 - 7
sys/src/cmd/fossil/srcload.c

@@ -67,15 +67,15 @@ main(int argc, char *argv[])
 	srand(0);
 
 	r = fs->source;
-dump(r, 0, 0);
+	dump(r, 0, 0);
 
 	fprint(2, "count = %d\n", count(r, 1));
 	for(i=0; i<num; i++)
 		new(r, 0, 0);
 
 	for(i=0; i<iter; i++){
-if(i % 10000 == 0)
-stats(r);
+		if(i % 10000 == 0)
+			stats(r);
 		new(r, 0, 0);
 		delete(r);
 	}
@@ -85,7 +85,7 @@ stats(r);
 	fprint(2, "count = %d\n", count(r, 1));
 //	cacheCheck(c);
 
-fprint(2, "deleting\n");
+	fprint(2, "deleting\n");
 	for(i=0; i<num; i++)
 		delete(r);
 //	dump(r, 0, 0);
@@ -94,9 +94,7 @@ fprint(2, "deleting\n");
 	fprint(2, "total time = %ld\n", time(0)-t);
 	
 	fsClose(fs);
-
 	vtDetach();
-
 	exits(0);
 }
 
@@ -210,7 +208,8 @@ dump(Source *s, int ident, ulong entry)
 		return;
 	}
 
-	Bprint(bout, "%4lud: gen %4ud depth %d tag=%x score=%V", entry, e.gen, e.depth, e.tag, e.score);
+	Bprint(bout, "%4lud: gen %4ud depth %d tag=%x score=%V",
+		entry, e.gen, e.depth, e.tag, e.score);
 	if(!s->dir){
 		Bprint(bout, " data size: %llud\n", e.size);
 		return;

+ 2 - 0
sys/src/cmd/fossil/view.c

@@ -301,6 +301,8 @@ copyMetaBlock(MetaBlock mb)
  * visualizer 
  */
 
+#pragma	varargck	argpos	stringnode	1
+
 Tnode*
 stringnode(char *fmt, ...)
 {

+ 206 - 83
sys/src/cmd/gview.c

@@ -117,6 +117,7 @@ Cursor	bullseye =
 	}
 };
 
+/* Wait for a mouse click and return 0 for failue if not button but (curs can be 0) */
 int get_1click(int but, Mouse* m, Cursor* curs)
 {
 	if (curs)
@@ -129,6 +130,26 @@ int get_1click(int but, Mouse* m, Cursor* curs)
 }
 
 
+/* Wait for a mouse click or keyboard event from the string of expected characters.  Return
+   the character code or -1 for a button-but mouse event or 0 for wrong button.
+*/
+int get_click_or_kbd(int but, Mouse* m, const char* expected)
+{
+	Event ev;
+	ulong expbits[4], ty;
+	expbits[0] = expbits[1] = expbits[2] = expbits[3];
+	for (; *expected!=0; expected++)
+		expbits[((*expected)>>5)&3] |= 1 << (*expected&31);
+	do ty = eread(Emouse|Ekeyboard, &ev);
+	while ((ty&Emouse) ? ev.mouse.buttons==0
+		: (ev.kbdc&~127) || !(expbits[(ev.kbdc>>5)&3] & (1<<(ev.kbdc&31))) );
+	if (ty&Ekeyboard)
+		return ev.kbdc;
+	*m = ev.mouse;
+	return (ev.mouse.buttons==Button_bit(but)) ? -1 : 0;
+}
+
+
 /* Wait until but goes up or until a mouse event's msec passes tlimit.
    Return a boolean result that tells whether the button went up.
 */
@@ -163,40 +184,53 @@ enum {	DOrange=0xffaa00FF, Dgray=0xbbbbbbFF, DDkgreen=0x009900FF,
 		DCyan, DMagenta, DWhite */
 };
 
+
+typedef struct thick_color {
+	int thick;			/* use 1+2*thick pixel wide lines */
+	Image* clr;			/* Color to use when drawing this */
+} thick_color;
+
+
 typedef struct color_ref {
 	ulong c;			/* RGBA pixel color */
 	char* nam;			/* ASCII name (matched to input, used in output)*/
+	int nam1;			/* single-letter version of color name */
 	Image* im;			/* replicated solid-color image */
 } color_ref;
 
 color_ref clrtab[] = {
-	DRed,		"Red",		0,
-	DPink,		"Pink",		0,
-	DDkred,		"Dkred",	0,
-	DOrange,	"Orange",	0,
-	DYellow,	"Yellow",	0,
-	DDkyellow,	"Dkyellow",	0,
-	DGreen,		"Green",	0,
-	DDkgreen,	"Dkgreen",	0,
-	DCyan,		"Cyan",		0,
-	DBlue,		"Blue",		0,
-	DLtblue,	"Ltblue",	0,
-	DMagenta,	"Magenta",	0,
-	DViolet,	"Violet",	0,
-	Dgray,		"Gray",		0,
-	DBlack,		"Black",	0,
-	DWhite,		"White",	0,
-	DNofill,	0,		0	/* DNofill means "end of data" */
+	DRed,		"Red",		'R', 0,
+	DPink,		"Pink",		'P', 0,
+	DDkred,		"Dkred",	'r', 0,
+	DOrange,	"Orange",	'O', 0,
+	DYellow,	"Yellow",	'Y', 0,
+	DDkyellow,	"Dkyellow",	'y', 0,
+	DGreen,		"Green",	'G', 0,
+	DDkgreen,	"Dkgreen",	'g', 0,
+	DCyan,		"Cyan",		'C', 0,
+	DBlue,		"Blue",		'B', 0,
+	DLtblue,	"Ltblue",	'b', 0,
+	DMagenta,	"Magenta",	'M', 0,
+	DViolet,	"Violet",	'V', 0,
+	Dgray,		"Gray",		'A', 0,
+	DBlack,		"Black",	'K', 0,
+	DWhite,		"White",	'W', 0,
+	DNofill,	0,		0,   0	/* DNofill means "end of data" */
 };
 
+short nam1_idx[128];			/* the clrtab[] index for each nam1, else -1 */
+
 
 void  init_clrtab(void)
 {
 	int i;
 	Rectangle r = Rect(0,0,1,1);
-	for (i=0; clrtab[i].c!=DNofill; i++)
+	memset(&nam1_idx[0], -1, sizeof(nam1_idx));
+	for (i=0; clrtab[i].c!=DNofill; i++) {
 		clrtab[i].im = allocimage(display, r, CMAP8, 1, clrtab[i].c);
 		/* should check for 0 result? */
+		nam1_idx[clrtab[i].nam1] = i;
+	}
 }
 
 
@@ -218,58 +252,117 @@ int clr_id(int clr)
 	return i;
 }
 
+
 #define clr_im(clr)	clrtab[clr_id(clr)].im
+#define is_Multi  -2			/* dummy clrtab[] less than -1 */
+
+
+thick_color* tc_default(thick_color *buf)
+{
+	buf[0].thick = 1;
+	buf[1].clr = clr_im(DBlack);
+	buf[1].thick = 0;
+	return buf;
+}
+
+
+/* Return an allocated array that describes the color letters (clrtab[].nam1 values,
+   optionally prefixed by 'T') in the string that starts at c0 and ends just before
+   fin.  The first entry is a dummy whose thick field tells how many data entries follow.
+   If buf!=0, it should point to an array of length 2 that is to hold the output
+   (truncated to a dummy and one data entry).  The error indication is 1 data entry
+   of default color and thickness; e.g., "Multi(xxbadxx)" in a label prevents gview
+   from recognizing anything that follows.
+*/
+thick_color* parse_color_chars(const char* c0, const char* fin, thick_color *buf)
+{
+	thick_color* tc;		/* Pending return value */
+	int i, j, n=fin-c0;		/* n is an upper bound on how many data members */
+	const char* c;
+	for (c=c0; c<fin-1; c++)
+		if (*c=='T')
+			n--;
+	if (buf==0)
+		tc = (thick_color*) malloc((n+1)*sizeof(thick_color));
+	else {tc=buf; n=1;}
+	i = 0;
+	for (c=c0; c<fin && i<n; c++) {
+		tc[++i].thick = 0;
+		if (*c=='T')
+			if (++c==fin)
+				return tc_default(tc);
+			else tc[i].thick=1;
+		j = (*c&~127) ? -1 : nam1_idx[*c];
+		if (j < 0)
+			return tc_default(tc);
+		tc[i].clr = clrtab[j].im;
+	}
+	tc[0].thick = i;
+	return tc;
+}
 
 
-/* This decides what color to use for a polyline based on the label it has in the
-   input file.  Whichever color name comes first is the winner, otherwise return black.
+/* Decide what color and thickness to use for a polyline based on the label it has in the
+   input file.  The winner is whichever color name comes first, or otherwise black; and
+   thickness is determined by the presence of "Thick" in the string.  Place the result
+   in *r1 and return 0 unless a Multi(...) spec is found, in which case the result is
+   an allocated array of alternative color and thickness values.  A nonzero idxdest
+   requests the clrtab[] index in *idxdest and no allocated array.
 */
-Image* nam2clr(const char* nam, int *idxdest)
+thick_color* nam2thclr(const char* nam, thick_color *r1, int *idxdest)
 {
-	char *c, *cbest=nam;
+	char *c, *cbest=0, *rp=0;
 	int i, ibest=-1;
-	if (*nam!=0)
+	thick_color* tc = 0;
+	thick_color buf[2];
+	if (*nam!=0) {
+		c = strstr(nam, "Multi(");
+		if (c!=0 && (rp=strchr(c+6,')'))!=0)
+			{ibest=is_Multi; cbest=c;}
 		for (i=0; clrtab[i].nam!=0; i++) {
 			c = strstr(nam,clrtab[i].nam);
-			if (c!=0 && (ibest<0 || c<cbest))
+			if (c!=0 && (ibest==-1 || c<cbest))
 				{ibest=i; cbest=c;}
 		}
+	}
+	if (ibest==is_Multi) {
+		tc = parse_color_chars(cbest+6, rp, (idxdest==0 ? 0 : &buf[0]));
+		ibest = clrim_id(tc[1].clr);
+	}
 	if (idxdest!=0)
 		*idxdest = (ibest<0) ? clr_id(DBlack) : ibest;
-	return (ibest<0) ? clr_im(DBlack) : clrtab[ibest].im;
-}
-
-/* A polyline is initial drawn in thick mode iff its label in the file contains "Thick" */
-int nam2thick(const char* nam)
-{
-	return strstr(nam,"Thick")==0 ? 0 : 1;
+	r1->clr = (ibest<0) ? clr_im(DBlack) : clrtab[ibest].im;
+	r1->thick = (tc!=0) ? tc[1].thick : (strstr(nam,"Thick")==0 ? 0 : 1);
+	return tc;
 }
 
 
-/* Alter string nam so that nam2thick() and nam2clr() agree with th and clr, using
+/* Alter string nam so that nam2thick() and nam2clr() agree with *tc, using
    buf[] (a buffer of length bufn) to store the result if it differs from nam.
    We go to great pains to perform this alteration in a manner that will seem natural
    to the user, i.e., we try removing a suitably isolated color name before inserting
    a new one.
 */
-char* nam_with_thclr(char* nam, int th, Image* clr, char* buf, int bufn)
+char* nam_with_thclr(char* nam, const thick_color *tc, char* buf, int bufn)
 {
-	int clr0i, th0=nam2thick(nam);
-	Image* clr0 = nam2clr(nam, &clr0i);
+	thick_color c0;
+	int clr0i;
+	nam2thclr(nam, &c0, &clr0i);
 	char *clr0s;
-	if (th0==th && clr0==clr)
+	if (c0.thick==tc->thick && c0.clr==tc->clr)
 		return nam;
 	clr0s = clrtab[clr0i].nam;
 	if (strlen(nam)<bufn) strcpy(buf,nam);
 	else {strncpy(buf,nam,bufn); buf[bufn-1]='\0';}
-	if (clr0 != clr)
+	if (c0.clr != tc->clr)
 		remove_substr(buf, clr0s);
-	if (th0 > th)
+	if (c0.thick > tc->thick)
 		while (remove_substr(buf, "Thick"))
 			/* do nothing */;
-	if (nam2clr(buf,0) != clr)
-		str_insert(buf, clrtab[clrim_id(clr)].nam, bufn);
-	if (th0 < th)
+	nam2thclr(nam, &c0, &clr0i);
+	if (c0.clr != tc->clr)
+		str_insert(buf, clrtab[clrim_id(tc->clr)].nam, bufn);
+	if (c0.thick < tc->thick)
 		str_insert(buf, "Thick", bufn);
 	return buf;
 }
@@ -340,8 +433,8 @@ typedef struct fpolygon {
 	int n;				/* p[] has n elements: p[0..n] */
 	frectangle bb;			/* bounding box */
 	char* nam;			/* name of this polygon (malloc'ed) */
-	int thick;			/* use 1+2*thick pixel wide lines */
-	Image* clr;			/* Color to use when drawing this */
+	thick_color c;			/* the current color and line thickness */
+	thick_color* ct;		/* 0 or malloc'ed color schemes, ct[1..ct->thick] */
 	struct fpolygon* link;
 } fpolygon;
 
@@ -361,13 +454,20 @@ fpolygons univ = {			/* everything there is to display */
 };
 
 
+void free_fp_etc(fpolygon* fp)
+{
+	if (fp->ct != 0)
+		free(fp->ct);
+	free(fp->p);
+	free(fp);
+}
+
+
 void set_default_clrs(fpolygons* fps, fpolygon* fpstop)
 {
 	fpolygon* fp;
-	for (fp=fps->p; fp!=0 && fp!=fpstop; fp=fp->link) {
-		fp->clr = nam2clr(fp->nam,0);
-		fp->thick = nam2thick(fp->nam);
-	}
+	for (fp=fps->p; fp!=0 && fp!=fpstop; fp=fp->link)
+		fp->ct = nam2thclr(fp->nam, &fp->c, 0);
 }
 
 
@@ -696,28 +796,29 @@ int is_valid_label(char* lab)
 */
 fpolygon* rd_fpoly(FILE* fin, int *lineno)
 {
-	char buf[256], junk[2];
+	char buf[4096], junk[2];
 	fpoint q;
 	fpolygon* fp;
 	int allocn;
-	if (!fgets(buf,256,fin))
+	if (!fgets(buf,4096,fin))
 		return 0;
 	(*lineno)++;
 	if (sscanf(buf,"%lg%lg%1s",&q.x,&q.y,junk) != 2)
 		return 0;
 	fp = malloc(sizeof(fpolygon));
-	allocn = 16;
+	allocn = 4;
 	fp->p = malloc(allocn*sizeof(fpoint));
 	fp->p[0] = q;
 	fp->n = 0;
 	fp->nam = "";
-	fp->thick = 0;
-	fp->clr = clr_im(DBlack);
-	while (fgets(buf,256,fin)) {
+	fp->c.thick = 0;
+	fp->c.clr = clr_im(DBlack);
+	fp->ct = 0;
+	while (fgets(buf,4096,fin)) {
 		(*lineno)++;
 		if (sscanf(buf,"%lg%lg%1s",&q.x,&q.y,junk) != 2) {
 			if (!is_valid_label(buf))
-				{free(fp->p); free(fp); return 0;}
+				{free_fp_etc(fp); return 0;}
 			fp->nam = (buf[0]=='"') ? buf+1 : buf;
 			break;
 		}
@@ -784,7 +885,7 @@ void wr_fpoly(FILE* fout, const fpolygon* fp)
 	int i;
 	for (i=0; i<=fp->n; i++)
 		fprintf(fout,"%.12g\t%.12g\n", fp->p[i].x, fp->p[i].y);
-	fprintf(fout,"\"%s\"\n", nam_with_thclr(fp->nam, fp->thick, fp->clr, buf, 256));
+	fprintf(fout,"\"%s\"\n", nam_with_thclr(fp->nam, &fp->c, buf, 256));
 }
 
 void wr_fpolys(FILE* fout, fpolygons* fps)
@@ -1447,7 +1548,7 @@ void draw_1fpoly(const fpolygon* fp, const transform* tr, Image* clr,
 	fpoint *p0=fp->p, *pn=fp->p+fp->n;
 	double l1, l2;
 	if (p0==pn && fcontains(udisp,*p0))
-		{draw_fpts(p0, 0, tr, fp->thick, clr); return;}
+		{draw_fpts(p0, 0, tr, fp->c.thick, clr); return;}
 	while ((l1=out_length(p0,pn,*udisp,slant)) < pn-p0) {
 		fpoint p0sav;
 		int i1 = (int) l1;
@@ -1456,7 +1557,7 @@ void draw_1fpoly(const fpolygon* fp, const transform* tr, Image* clr,
 		p0[0].x += l1*(p0[1].x - p0[0].x);
 		p0[0].y += l1*(p0[1].y - p0[0].y);
 		l2 = in_length(p0, pn, *udisp, slant);
-		draw_fpts(p0, l2, tr, fp->thick, clr);
+		draw_fpts(p0, l2, tr, fp->c.thick, clr);
 		*p0 = p0sav;
 		p0 += (l2>0) ? ((int) ceil(l2)) : 1;
 	}
@@ -1495,7 +1596,7 @@ void eresized(int new)
 	slant = get_clip_data(&univ, &clipr);
 	for (fp=univ.p; fp!=0; fp=fp->link)
 		if (fintersects(&clipr, &fp->bb, slant))
-			draw_1fpoly(fp, &tr, fp->clr, &clipr, slant);
+			draw_1fpoly(fp, &tr, fp->c.clr, &clipr, slant);
 	reselect(0);
 	if (mv_bkgd!=0 && mv_bkgd->repl==0) {
 		freeimage(mv_bkgd);
@@ -1544,27 +1645,45 @@ void all_set_clr(fpolygons* fps, Image* clr)
 {
 	fpolygon* p;
 	for (p=fps->p; p!=0; p=p->link)
-		p->clr = clr;
+		p->c.clr = clr;
+}
+	
+
+void all_set_scheme(fpolygons* fps, int scheme)
+{
+	fpolygon* p;
+	for (p=fps->p; p!=0; p=p->link)
+		if (p->ct!=0 && scheme <= p->ct[0].thick)
+			p->c = p->ct[scheme];
 }
 	
 
 void do_recolor(int but, Mouse* m, int alluniv)
 {
-	int nclr = clr_id(DWhite);
+	int sel, clkk, nclr = clr_id(DWhite);
 	int dy = draw_palette(nclr);
 	Image* clr;
-	if (!get_1click(but, m, 0)) {
+	clkk = get_click_or_kbd(but, m, "123456789abcdefghijklmnopqrstuvwxyz");
+	if (clkk < 0) {
+		clr = palette_color(m->xy, dy, nclr);
+		if (clr != 0) {
+			if (alluniv)
+				all_set_clr(&univ, clr);
+			else cur_sel.fp->c.clr = clr;
+		}
 		eresized(0);
-		return;
-	}
-	clr = palette_color(m->xy, dy, nclr);
-	if (clr != 0) {
+		lift_button(but, m, Never);
+	} else if (clkk > 0) {
+		sel = ('0'<clkk&&clkk<='9') ? 0 : 10+(clkk-'a')*10;
+		while (!('0'<=clkk&&clkk<='9'))
+			clkk = ekbd();
+		sel += clkk-'0';
 		if (alluniv)
-			all_set_clr(&univ, clr);
-		else	cur_sel.fp->clr = clr;
+			all_set_scheme(&univ, sel);
+		else if (sel <= cur_sel.fp->ct[0].thick)
+			cur_sel.fp->c = cur_sel.fp->ct[sel];
 	}
 	eresized(0);
-	lift_button(but, m, Never);
 }
 
 
@@ -1574,7 +1693,7 @@ void prepare_mv(const fpolygon* fp)
 {
 	Rectangle r = screen->r;
 	Image* scr0;
-	int dt = 1 + fp->thick;
+	int dt = 1 + fp->c.thick;
 	r.min.x+=lft_border-dt;  r.min.y+=top_border-dt;
 	r.max.x-=rt_border-dt;   r.max.y-=bot_border-dt;
 	if (mv_bkgd!=0 && mv_bkgd->repl==0)
@@ -1631,13 +1750,13 @@ fpoint do_move(int but, Mouse* m)
 	double tsav = cur_sel.t;
 	unselect(&tr);
 	do {	latest_mouse(but, m);
-		(fp->thick)++;		/* line() DISAGREES WITH ITSELF */
+		(fp->c.thick)++;		/* line() DISAGREES WITH ITSELF */
 		draw_fpoly(fp, &tr, mv_bkgd);
-		(fp->thick)--;
+		(fp->c.thick)--;
 		do_untransform(&loc, &tr, &m->xy);
 		move_fp(fp, loc.x-cur_sel.p.x, loc.y-cur_sel.p.y);
 		cur_sel.p = loc;
-		draw_fpoly(fp, &tr, fp->clr);
+		draw_fpoly(fp, &tr, fp->c.clr);
 	} while (m->buttons & bbit);
 	cur_sel.t = tsav;
 	reselect(&tr);
@@ -1669,13 +1788,13 @@ double do_rotate(int but, Mouse* m)
 	double theta0 = dir_angle(&m->xy, &tr);
 	double th, theta = theta0;
 	do {	latest_mouse(but, m);
-		(fp->thick)++;		/* line() DISAGREES WITH ITSELF */
+		(fp->c.thick)++;		/* line() DISAGREES WITH ITSELF */
 		draw_fpoly(fp, &tr, mv_bkgd);
-		(fp->thick)--;
+		(fp->c.thick)--;
 		th = dir_angle(&m->xy, &tr);
 		rotate_fp(fp, cur_sel.p, th-theta);
 		theta = th;
-		draw_fpoly(fp, &tr, fp->clr);
+		draw_fpoly(fp, &tr, fp->c.clr);
 	} while (m->buttons & bbit);
 	unselect(&tr);
 	cur_sel = prev_sel;
@@ -1725,11 +1844,11 @@ void init_e_menu(void)
 	e_items[Edelete] = "delete";
 	e_items[Erotate] = "rotate";
 	e_items[Eoptions-cantmv] = 0;
-	e_items[Ethick] = (cur_sel.fp->thick >0) ? "thin" : "thick";
+	e_items[Ethick] = (cur_sel.fp->c.thick >0) ? "thin" : "thick";
 	if (unact!=0)
 		switch (unact->typ) {
 		case Erecolor: u="uncolor"; break;
-		case Ethick: u=(unact->fp->thick==0) ? "unthin" : "unthicken";
+		case Ethick: u=(unact->fp->c.thick==0) ? "unthin" : "unthicken";
 			break;
 		case Edelete: u="undelete"; break;
 		case Emove: u="unmove"; break;
@@ -1748,7 +1867,7 @@ void do_emenu(int but, Mouse* m)
 	h = emenuhit(but, m, &e_menu);
 	switch(h) {
 	case Ethick: unact = save_act(unact, h);
-		cur_sel.fp->thick ^= 1;
+		cur_sel.fp->c.thick ^= 1;
 		eresized(0);
 		break;
 	case Edelete: unact = save_act(unact, h);
@@ -1780,8 +1899,8 @@ e_action* save_act(e_action* a0, e_index typ)
 	e_action* a = malloc(sizeof(e_action));
 	a->link = a0;
 	a->pt.x = a->pt.y = 0.0;
-	a->amt = cur_sel.fp->thick;
-	a->clr = cur_sel.fp->clr;
+	a->amt = cur_sel.fp->c.thick;
+	a->clr = cur_sel.fp->c.clr;
 	a->fp = cur_sel.fp;
 	a->typ = typ;
 	return a;
@@ -1812,10 +1931,10 @@ e_action* do_undo(e_action* a0)		/* pop off an e_action and (un)do it */
 	if (a==0)
 		return 0;
 	switch(a->typ) {
-	case Ethick: a->fp->thick = a->amt;
+	case Ethick: a->fp->c.thick = a->amt;
 		eresized(0);
 		break;
-	case Erecolor: a->fp->clr = a->clr;
+	case Erecolor: a->fp->c.clr = a->clr;
 		eresized(0);
 		break;
 	case Edelete: 
@@ -1945,8 +2064,12 @@ void doevent(void)
 			do_emenu(2, &ev.mouse);
 		else if (ev.mouse.buttons & But3)
 			do_mmenu(3, &ev.mouse);
+	} else if (etype & Ekeyboard) {
+		if (ev.kbdc=='\n' && cur_sel.t>=0 && logfil!=0) {
+			fprintf(logfil,"%s\n", cur_sel.fp->nam);
+			fflush(logfil);
+		}
 	}
-	/* no need to check (etype & Ekeyboard)--there are no keyboard commands */
 }