Browse Source

Plan 9 from Bell Labs 2007-08-08

David du Colombier 16 years ago
parent
commit
47b636e3f7

+ 32 - 32
dist/replica/_plan9.db

@@ -5517,7 +5517,7 @@ rc/bin/kmem - 775 sys sys 1141940177 468
 rc/bin/label - 775 sys sys 1173737765 189
 rc/bin/label - 775 sys sys 1173737765 189
 rc/bin/lc - 775 sys sys 945617207 24
 rc/bin/lc - 775 sys sys 945617207 24
 rc/bin/leak - 775 sys sys 1172760642 1921
 rc/bin/leak - 775 sys sys 1172760642 1921
-rc/bin/lookman - 775 sys sys 1017679344 686
+rc/bin/lookman - 775 sys sys 1186528516 687
 rc/bin/lp - 775 sys sys 1162105982 5201
 rc/bin/lp - 775 sys sys 1162105982 5201
 rc/bin/mail - 775 sys sys 1045504003 138
 rc/bin/mail - 775 sys sys 1045504003 138
 rc/bin/man - 775 sys sys 1174803269 2639
 rc/bin/man - 775 sys sys 1174803269 2639
@@ -7445,7 +7445,7 @@ sys/man/1/size - 664 sys sys 944959674 393
 sys/man/1/sleep - 664 sys sys 1167774352 420
 sys/man/1/sleep - 664 sys sys 1167774352 420
 sys/man/1/sort - 664 sys sys 1113743328 4719
 sys/man/1/sort - 664 sys sys 1113743328 4719
 sys/man/1/spell - 664 sys sys 1113743329 1876
 sys/man/1/spell - 664 sys sys 1113743329 1876
-sys/man/1/spin - 664 sys sys 1142177238 7246
+sys/man/1/spin - 664 sys sys 1186525444 6685
 sys/man/1/split - 664 sys sys 1038183072 1171
 sys/man/1/split - 664 sys sys 1038183072 1171
 sys/man/1/src - 664 sys sys 954266293 1138
 sys/man/1/src - 664 sys sys 954266293 1138
 sys/man/1/ssh - 664 sys sys 1048643947 6622
 sys/man/1/ssh - 664 sys sys 1048643947 6622
@@ -13419,45 +13419,45 @@ sys/src/cmd/spell/spell.rc - 775 sys sys 964457135 312
 sys/src/cmd/spell/sprog.c - 664 sys sys 1143759342 23038
 sys/src/cmd/spell/sprog.c - 664 sys sys 1143759342 23038
 sys/src/cmd/spell/stop - 664 sys sys 944961232 18702
 sys/src/cmd/spell/stop - 664 sys sys 944961232 18702
 sys/src/cmd/spin - 20000000775 sys sys 1125514861 0
 sys/src/cmd/spin - 20000000775 sys sys 1125514861 0
-sys/src/cmd/spin/README - 664 sys sys 1125514858 311
-sys/src/cmd/spin/dstep.c - 664 sys sys 1125514858 9958
-sys/src/cmd/spin/flow.c - 664 sys sys 1125514858 17345
-sys/src/cmd/spin/guided.c - 664 sys sys 1125514858 6948
-sys/src/cmd/spin/main.c - 664 sys sys 1125514858 21713
-sys/src/cmd/spin/mesg.c - 664 sys sys 1125514858 13722
+sys/src/cmd/spin/README - 664 sys sys 1186525913 311
+sys/src/cmd/spin/dstep.c - 664 sys sys 1186525913 10009
+sys/src/cmd/spin/flow.c - 664 sys sys 1186525914 17303
+sys/src/cmd/spin/guided.c - 664 sys sys 1186525914 7045
+sys/src/cmd/spin/main.c - 664 sys sys 1186525914 21670
+sys/src/cmd/spin/mesg.c - 664 sys sys 1186525914 14109
 sys/src/cmd/spin/mkfile - 664 sys sys 1125514859 696
 sys/src/cmd/spin/mkfile - 664 sys sys 1125514859 696
-sys/src/cmd/spin/pangen1.c - 664 sys sys 1125514859 29801
-sys/src/cmd/spin/pangen1.h - 664 sys sys 1125514859 134192
-sys/src/cmd/spin/pangen2.c - 664 sys sys 1125514859 74348
-sys/src/cmd/spin/pangen2.h - 664 sys sys 1125514860 23109
-sys/src/cmd/spin/pangen3.c - 664 sys sys 1125514860 8941
-sys/src/cmd/spin/pangen3.h - 664 sys sys 1125514860 22484
-sys/src/cmd/spin/pangen4.c - 664 sys sys 1125514860 8180
-sys/src/cmd/spin/pangen4.h - 664 sys sys 1125514860 19033
-sys/src/cmd/spin/pangen5.c - 664 sys sys 1125514860 16851
+sys/src/cmd/spin/pangen1.c - 664 sys sys 1186525914 31423
+sys/src/cmd/spin/pangen1.h - 664 sys sys 1186525915 137482
+sys/src/cmd/spin/pangen2.c - 664 sys sys 1186525916 75808
+sys/src/cmd/spin/pangen2.h - 664 sys sys 1186525916 23811
+sys/src/cmd/spin/pangen3.c - 664 sys sys 1186525916 8914
+sys/src/cmd/spin/pangen3.h - 664 sys sys 1186525916 22760
+sys/src/cmd/spin/pangen4.c - 664 sys sys 1186525916 8138
+sys/src/cmd/spin/pangen4.h - 664 sys sys 1186525917 19034
+sys/src/cmd/spin/pangen5.c - 664 sys sys 1186525917 16809
 sys/src/cmd/spin/pangen5.h - 664 sys sys 1125514861 11145
 sys/src/cmd/spin/pangen5.h - 664 sys sys 1125514861 11145
-sys/src/cmd/spin/pangen6.c - 664 sys sys 1125514861 48633
-sys/src/cmd/spin/pc_zpp.c - 664 sys sys 1125514861 8737
+sys/src/cmd/spin/pangen6.c - 664 sys sys 1186525917 48587
+sys/src/cmd/spin/pc_zpp.c - 664 sys sys 1186525918 8745
 sys/src/cmd/spin/ps_msc.c - 664 sys sys 1125514861 11872
 sys/src/cmd/spin/ps_msc.c - 664 sys sys 1125514861 11872
-sys/src/cmd/spin/reprosrc.c - 664 sys sys 1125514861 2978
-sys/src/cmd/spin/run.c - 664 sys sys 1125514862 14405
-sys/src/cmd/spin/sched.c - 664 sys sys 1125514862 21096
-sys/src/cmd/spin/spin.h - 664 sys sys 1125514862 12286
-sys/src/cmd/spin/spin.y - 664 sys sys 1125514862 18876
-sys/src/cmd/spin/spinlex.c - 664 sys sys 1125514862 30767
-sys/src/cmd/spin/structs.c - 664 sys sys 1125514863 14150
-sys/src/cmd/spin/sym.c - 664 sys sys 1125514863 11863
+sys/src/cmd/spin/reprosrc.c - 664 sys sys 1186525918 2936
+sys/src/cmd/spin/run.c - 664 sys sys 1186525918 14364
+sys/src/cmd/spin/sched.c - 664 sys sys 1186525918 21862
+sys/src/cmd/spin/spin.h - 664 sys sys 1186525918 12331
+sys/src/cmd/spin/spin.y - 664 sys sys 1186525919 19060
+sys/src/cmd/spin/spinlex.c - 664 sys sys 1186525919 31555
+sys/src/cmd/spin/structs.c - 664 sys sys 1186525920 14108
+sys/src/cmd/spin/sym.c - 664 sys sys 1186525920 11879
 sys/src/cmd/spin/tl.h - 664 sys sys 1125514863 3332
 sys/src/cmd/spin/tl.h - 664 sys sys 1125514863 3332
 sys/src/cmd/spin/tl_buchi.c - 664 sys sys 1125514863 13080
 sys/src/cmd/spin/tl_buchi.c - 664 sys sys 1125514863 13080
 sys/src/cmd/spin/tl_cache.c - 664 sys sys 1125514863 5831
 sys/src/cmd/spin/tl_cache.c - 664 sys sys 1125514863 5831
-sys/src/cmd/spin/tl_lex.c - 664 sys sys 1125514863 3243
-sys/src/cmd/spin/tl_main.c - 664 sys sys 1125514863 4412
+sys/src/cmd/spin/tl_lex.c - 664 sys sys 1186525920 3244
+sys/src/cmd/spin/tl_main.c - 664 sys sys 1186525920 4679
 sys/src/cmd/spin/tl_mem.c - 664 sys sys 1125514864 2670
 sys/src/cmd/spin/tl_mem.c - 664 sys sys 1125514864 2670
-sys/src/cmd/spin/tl_parse.c - 664 sys sys 1125514864 8257
+sys/src/cmd/spin/tl_parse.c - 664 sys sys 1186525921 8348
 sys/src/cmd/spin/tl_rewrt.c - 664 sys sys 1125514864 5962
 sys/src/cmd/spin/tl_rewrt.c - 664 sys sys 1125514864 5962
 sys/src/cmd/spin/tl_trans.c - 664 sys sys 1125514864 16758
 sys/src/cmd/spin/tl_trans.c - 664 sys sys 1125514864 16758
-sys/src/cmd/spin/vars.c - 664 sys sys 1125514864 8393
-sys/src/cmd/spin/version.h - 664 sys sys 1125514864 53
+sys/src/cmd/spin/vars.c - 664 sys sys 1186525921 8374
+sys/src/cmd/spin/version.h - 664 sys sys 1186525921 53
 sys/src/cmd/split.c - 664 sys sys 1116770353 3225
 sys/src/cmd/split.c - 664 sys sys 1116770353 3225
 sys/src/cmd/srv.c - 664 sys sys 1144685254 4003
 sys/src/cmd/srv.c - 664 sys sys 1144685254 4003
 sys/src/cmd/srvfs.c - 664 sys sys 1161442157 1726
 sys/src/cmd/srvfs.c - 664 sys sys 1161442157 1726

+ 32 - 32
dist/replica/plan9.db

@@ -5517,7 +5517,7 @@ rc/bin/kmem - 775 sys sys 1141940177 468
 rc/bin/label - 775 sys sys 1173737765 189
 rc/bin/label - 775 sys sys 1173737765 189
 rc/bin/lc - 775 sys sys 945617207 24
 rc/bin/lc - 775 sys sys 945617207 24
 rc/bin/leak - 775 sys sys 1172760642 1921
 rc/bin/leak - 775 sys sys 1172760642 1921
-rc/bin/lookman - 775 sys sys 1017679344 686
+rc/bin/lookman - 775 sys sys 1186528516 687
 rc/bin/lp - 775 sys sys 1162105982 5201
 rc/bin/lp - 775 sys sys 1162105982 5201
 rc/bin/mail - 775 sys sys 1045504003 138
 rc/bin/mail - 775 sys sys 1045504003 138
 rc/bin/man - 775 sys sys 1174803269 2639
 rc/bin/man - 775 sys sys 1174803269 2639
@@ -7445,7 +7445,7 @@ sys/man/1/size - 664 sys sys 944959674 393
 sys/man/1/sleep - 664 sys sys 1167774352 420
 sys/man/1/sleep - 664 sys sys 1167774352 420
 sys/man/1/sort - 664 sys sys 1113743328 4719
 sys/man/1/sort - 664 sys sys 1113743328 4719
 sys/man/1/spell - 664 sys sys 1113743329 1876
 sys/man/1/spell - 664 sys sys 1113743329 1876
-sys/man/1/spin - 664 sys sys 1142177238 7246
+sys/man/1/spin - 664 sys sys 1186525444 6685
 sys/man/1/split - 664 sys sys 1038183072 1171
 sys/man/1/split - 664 sys sys 1038183072 1171
 sys/man/1/src - 664 sys sys 954266293 1138
 sys/man/1/src - 664 sys sys 954266293 1138
 sys/man/1/ssh - 664 sys sys 1048643947 6622
 sys/man/1/ssh - 664 sys sys 1048643947 6622
@@ -13419,45 +13419,45 @@ sys/src/cmd/spell/spell.rc - 775 sys sys 964457135 312
 sys/src/cmd/spell/sprog.c - 664 sys sys 1143759342 23038
 sys/src/cmd/spell/sprog.c - 664 sys sys 1143759342 23038
 sys/src/cmd/spell/stop - 664 sys sys 944961232 18702
 sys/src/cmd/spell/stop - 664 sys sys 944961232 18702
 sys/src/cmd/spin - 20000000775 sys sys 1125514861 0
 sys/src/cmd/spin - 20000000775 sys sys 1125514861 0
-sys/src/cmd/spin/README - 664 sys sys 1125514858 311
-sys/src/cmd/spin/dstep.c - 664 sys sys 1125514858 9958
-sys/src/cmd/spin/flow.c - 664 sys sys 1125514858 17345
-sys/src/cmd/spin/guided.c - 664 sys sys 1125514858 6948
-sys/src/cmd/spin/main.c - 664 sys sys 1125514858 21713
-sys/src/cmd/spin/mesg.c - 664 sys sys 1125514858 13722
+sys/src/cmd/spin/README - 664 sys sys 1186525913 311
+sys/src/cmd/spin/dstep.c - 664 sys sys 1186525913 10009
+sys/src/cmd/spin/flow.c - 664 sys sys 1186525914 17303
+sys/src/cmd/spin/guided.c - 664 sys sys 1186525914 7045
+sys/src/cmd/spin/main.c - 664 sys sys 1186525914 21670
+sys/src/cmd/spin/mesg.c - 664 sys sys 1186525914 14109
 sys/src/cmd/spin/mkfile - 664 sys sys 1125514859 696
 sys/src/cmd/spin/mkfile - 664 sys sys 1125514859 696
-sys/src/cmd/spin/pangen1.c - 664 sys sys 1125514859 29801
-sys/src/cmd/spin/pangen1.h - 664 sys sys 1125514859 134192
-sys/src/cmd/spin/pangen2.c - 664 sys sys 1125514859 74348
-sys/src/cmd/spin/pangen2.h - 664 sys sys 1125514860 23109
-sys/src/cmd/spin/pangen3.c - 664 sys sys 1125514860 8941
-sys/src/cmd/spin/pangen3.h - 664 sys sys 1125514860 22484
-sys/src/cmd/spin/pangen4.c - 664 sys sys 1125514860 8180
-sys/src/cmd/spin/pangen4.h - 664 sys sys 1125514860 19033
-sys/src/cmd/spin/pangen5.c - 664 sys sys 1125514860 16851
+sys/src/cmd/spin/pangen1.c - 664 sys sys 1186525914 31423
+sys/src/cmd/spin/pangen1.h - 664 sys sys 1186525915 137482
+sys/src/cmd/spin/pangen2.c - 664 sys sys 1186525916 75808
+sys/src/cmd/spin/pangen2.h - 664 sys sys 1186525916 23811
+sys/src/cmd/spin/pangen3.c - 664 sys sys 1186525916 8914
+sys/src/cmd/spin/pangen3.h - 664 sys sys 1186525916 22760
+sys/src/cmd/spin/pangen4.c - 664 sys sys 1186525916 8138
+sys/src/cmd/spin/pangen4.h - 664 sys sys 1186525917 19034
+sys/src/cmd/spin/pangen5.c - 664 sys sys 1186525917 16809
 sys/src/cmd/spin/pangen5.h - 664 sys sys 1125514861 11145
 sys/src/cmd/spin/pangen5.h - 664 sys sys 1125514861 11145
-sys/src/cmd/spin/pangen6.c - 664 sys sys 1125514861 48633
-sys/src/cmd/spin/pc_zpp.c - 664 sys sys 1125514861 8737
+sys/src/cmd/spin/pangen6.c - 664 sys sys 1186525917 48587
+sys/src/cmd/spin/pc_zpp.c - 664 sys sys 1186525918 8745
 sys/src/cmd/spin/ps_msc.c - 664 sys sys 1125514861 11872
 sys/src/cmd/spin/ps_msc.c - 664 sys sys 1125514861 11872
-sys/src/cmd/spin/reprosrc.c - 664 sys sys 1125514861 2978
-sys/src/cmd/spin/run.c - 664 sys sys 1125514862 14405
-sys/src/cmd/spin/sched.c - 664 sys sys 1125514862 21096
-sys/src/cmd/spin/spin.h - 664 sys sys 1125514862 12286
-sys/src/cmd/spin/spin.y - 664 sys sys 1125514862 18876
-sys/src/cmd/spin/spinlex.c - 664 sys sys 1125514862 30767
-sys/src/cmd/spin/structs.c - 664 sys sys 1125514863 14150
-sys/src/cmd/spin/sym.c - 664 sys sys 1125514863 11863
+sys/src/cmd/spin/reprosrc.c - 664 sys sys 1186525918 2936
+sys/src/cmd/spin/run.c - 664 sys sys 1186525918 14364
+sys/src/cmd/spin/sched.c - 664 sys sys 1186525918 21862
+sys/src/cmd/spin/spin.h - 664 sys sys 1186525918 12331
+sys/src/cmd/spin/spin.y - 664 sys sys 1186525919 19060
+sys/src/cmd/spin/spinlex.c - 664 sys sys 1186525919 31555
+sys/src/cmd/spin/structs.c - 664 sys sys 1186525920 14108
+sys/src/cmd/spin/sym.c - 664 sys sys 1186525920 11879
 sys/src/cmd/spin/tl.h - 664 sys sys 1125514863 3332
 sys/src/cmd/spin/tl.h - 664 sys sys 1125514863 3332
 sys/src/cmd/spin/tl_buchi.c - 664 sys sys 1125514863 13080
 sys/src/cmd/spin/tl_buchi.c - 664 sys sys 1125514863 13080
 sys/src/cmd/spin/tl_cache.c - 664 sys sys 1125514863 5831
 sys/src/cmd/spin/tl_cache.c - 664 sys sys 1125514863 5831
-sys/src/cmd/spin/tl_lex.c - 664 sys sys 1125514863 3243
-sys/src/cmd/spin/tl_main.c - 664 sys sys 1125514863 4412
+sys/src/cmd/spin/tl_lex.c - 664 sys sys 1186525920 3244
+sys/src/cmd/spin/tl_main.c - 664 sys sys 1186525920 4679
 sys/src/cmd/spin/tl_mem.c - 664 sys sys 1125514864 2670
 sys/src/cmd/spin/tl_mem.c - 664 sys sys 1125514864 2670
-sys/src/cmd/spin/tl_parse.c - 664 sys sys 1125514864 8257
+sys/src/cmd/spin/tl_parse.c - 664 sys sys 1186525921 8348
 sys/src/cmd/spin/tl_rewrt.c - 664 sys sys 1125514864 5962
 sys/src/cmd/spin/tl_rewrt.c - 664 sys sys 1125514864 5962
 sys/src/cmd/spin/tl_trans.c - 664 sys sys 1125514864 16758
 sys/src/cmd/spin/tl_trans.c - 664 sys sys 1125514864 16758
-sys/src/cmd/spin/vars.c - 664 sys sys 1125514864 8393
-sys/src/cmd/spin/version.h - 664 sys sys 1125514864 53
+sys/src/cmd/spin/vars.c - 664 sys sys 1186525921 8374
+sys/src/cmd/spin/version.h - 664 sys sys 1186525921 53
 sys/src/cmd/split.c - 664 sys sys 1116770353 3225
 sys/src/cmd/split.c - 664 sys sys 1116770353 3225
 sys/src/cmd/srv.c - 664 sys sys 1144685254 4003
 sys/src/cmd/srv.c - 664 sys sys 1144685254 4003
 sys/src/cmd/srvfs.c - 664 sys sys 1161442157 1726
 sys/src/cmd/srvfs.c - 664 sys sys 1161442157 1726

+ 32 - 0
dist/replica/plan9.log

@@ -49866,3 +49866,35 @@
 1186371003 0 c 386/bin/htmlfmt - 775 sys sys 1186370974 163412
 1186371003 0 c 386/bin/htmlfmt - 775 sys sys 1186370974 163412
 1186371003 1 c 386/lib/libhtml.a - 664 sys sys 1186370975 229202
 1186371003 1 c 386/lib/libhtml.a - 664 sys sys 1186370975 229202
 1186407005 0 c sys/src/9/ip/tcp.c - 664 sys sys 1186406232 65963
 1186407005 0 c sys/src/9/ip/tcp.c - 664 sys sys 1186406232 65963
+1186525804 0 c sys/man/1/spin - 664 sys sys 1186525444 6685
+1186527604 0 c sys/src/cmd/spin/README - 664 sys sys 1186525913 311
+1186527604 1 c sys/src/cmd/spin/dstep.c - 664 sys sys 1186525913 10009
+1186527604 2 c sys/src/cmd/spin/flow.c - 664 sys sys 1186525914 17303
+1186527604 3 c sys/src/cmd/spin/guided.c - 664 sys sys 1186525914 7045
+1186527604 4 c sys/src/cmd/spin/main.c - 664 sys sys 1186525914 21670
+1186527604 5 c sys/src/cmd/spin/mesg.c - 664 sys sys 1186525914 14109
+1186527604 6 c sys/src/cmd/spin/pangen1.c - 664 sys sys 1186525914 31423
+1186527604 7 c sys/src/cmd/spin/pangen1.h - 664 sys sys 1186525915 137482
+1186527604 8 c sys/src/cmd/spin/pangen2.c - 664 sys sys 1186525916 75808
+1186527604 9 c sys/src/cmd/spin/pangen2.h - 664 sys sys 1186525916 23811
+1186527604 10 c sys/src/cmd/spin/pangen3.c - 664 sys sys 1186525916 8914
+1186527604 11 c sys/src/cmd/spin/pangen3.h - 664 sys sys 1186525916 22760
+1186527604 12 c sys/src/cmd/spin/pangen4.c - 664 sys sys 1186525916 8138
+1186527604 13 c sys/src/cmd/spin/pangen4.h - 664 sys sys 1186525917 19034
+1186527604 14 c sys/src/cmd/spin/pangen5.c - 664 sys sys 1186525917 16809
+1186527604 15 c sys/src/cmd/spin/pangen6.c - 664 sys sys 1186525917 48587
+1186527604 16 c sys/src/cmd/spin/pc_zpp.c - 664 sys sys 1186525918 8745
+1186527604 17 c sys/src/cmd/spin/reprosrc.c - 664 sys sys 1186525918 2936
+1186527604 18 c sys/src/cmd/spin/run.c - 664 sys sys 1186525918 14364
+1186527604 19 c sys/src/cmd/spin/sched.c - 664 sys sys 1186525918 21862
+1186527604 20 c sys/src/cmd/spin/spin.h - 664 sys sys 1186525918 12331
+1186527604 21 c sys/src/cmd/spin/spin.y - 664 sys sys 1186525919 19060
+1186527604 22 c sys/src/cmd/spin/spinlex.c - 664 sys sys 1186525919 31555
+1186527604 23 c sys/src/cmd/spin/structs.c - 664 sys sys 1186525920 14108
+1186527604 24 c sys/src/cmd/spin/sym.c - 664 sys sys 1186525920 11879
+1186527604 25 c sys/src/cmd/spin/tl_lex.c - 664 sys sys 1186525920 3244
+1186527604 26 c sys/src/cmd/spin/tl_main.c - 664 sys sys 1186525920 4679
+1186527604 27 c sys/src/cmd/spin/tl_parse.c - 664 sys sys 1186525921 8348
+1186527604 28 c sys/src/cmd/spin/vars.c - 664 sys sys 1186525921 8374
+1186527604 29 c sys/src/cmd/spin/version.h - 664 sys sys 1186525921 53
+1186529404 0 c rc/bin/lookman - 775 sys sys 1186528516 687

+ 1 - 1
rc/bin/lookman

@@ -8,7 +8,7 @@ fn sigexit sigint sighup sigterm{
 	rm -f $t1 $t2
 	rm -f $t1 $t2
 	exit 1
 	exit 1
 }
 }
-*=`{echo $*|tr A-Z a-z|tr -dc 'a-z0-9_ \012'}	# fold case, delete funny chars
+*=`{echo $*|tr A-Z a-z|tr -dc 'a-z0-9_. \012'}	# fold case, delete funny chars
 if(~ $#* 0){
 if(~ $#* 0){
 	echo Usage: lookman key ... >/fd/2
 	echo Usage: lookman key ... >/fd/2
 	exit 1
 	exit 1

+ 61 - 61
sys/man/1/spin

@@ -1,6 +1,6 @@
 .TH SPIN 1
 .TH SPIN 1
 .SH NAME
 .SH NAME
-spin \- verification tool for models of concurrent systems
+spin - verification tool for models of concurrent systems
 .SH SYNOPSIS
 .SH SYNOPSIS
 .B spin
 .B spin
 .B -a
 .B -a
@@ -93,7 +93,8 @@ is a tool for analyzing the logical consistency of
 asynchronous systems, specifically distributed software
 asynchronous systems, specifically distributed software
 amd communication protocols.
 amd communication protocols.
 A verification model of the system is first specified
 A verification model of the system is first specified
-in a guarded command language called Promela.
+in a guarded command language called
+.IR Promela .
 This specification language, described in the reference,
 This specification language, described in the reference,
 allows for the modeling of dynamic creation of
 allows for the modeling of dynamic creation of
 asynchronous processes,
 asynchronous processes,
@@ -103,18 +104,15 @@ It also allows for a concise specification of logical
 correctness requirements, including, but not restricted
 correctness requirements, including, but not restricted
 to requirements expressed in linear temporal logic.
 to requirements expressed in linear temporal logic.
 .PP
 .PP
-Given a Promela model
-stored in
-.I file ,
+Given a Promela model stored in
+.IR file ,
 .I spin
 .I spin
 can perform interactive, guided, or random simulations
 can perform interactive, guided, or random simulations
 of the system's execution.
 of the system's execution.
 It can also generate a C program that performs an exhaustive
 It can also generate a C program that performs an exhaustive
 or approximate verification of the correctness requirements
 or approximate verification of the correctness requirements
 for the system.
 for the system.
-.PP
-The basic command options are:
-.\"----------------------a----------------
+.
 .TP
 .TP
 .B -a
 .B -a
 Generate a verifier (model checker) for the specification.
 Generate a verifier (model checker) for the specification.
@@ -127,20 +125,19 @@ The online
 .I spin
 .I spin
 manuals (see below) contain
 manuals (see below) contain
 the details on compilation and use of the verifiers.
 the details on compilation and use of the verifiers.
-.\"--------------------------c------------
+.
 .TP
 .TP
 .B -c
 .B -c
 Produce an ASCII approximation of a message sequence
 Produce an ASCII approximation of a message sequence
-chart for a random or guided (when combined with 
+chart for a random or guided (when combined with
 .BR -t )
 .BR -t )
-simulation run. 
-See also option
+simulation run. See also option
 .BR -M .
 .BR -M .
-.\"--------------------------d------------
+.
 .TP
 .TP
-.BI -d
+.B -d
 Produce symbol table information for the model specified in
 Produce symbol table information for the model specified in
-.I file .
+.IR file .
 For each Promela object this information includes the type, name and
 For each Promela object this information includes the type, name and
 number of elements (if declared as an array), the initial
 number of elements (if declared as an array), the initial
 value (if a data object) or size (if a message channel), the
 value (if a data object) or size (if a message channel), the
@@ -149,24 +146,28 @@ a variable or as a parameter.  For message channels, the data types
 of the message fields are listed.
 of the message fields are listed.
 For structure variables, the third field defines the
 For structure variables, the third field defines the
 name of the structure declaration that contains the variable.
 name of the structure declaration that contains the variable.
-.\"--------------------------f------------
+.
 .TP
 .TP
-.B "-f \f2ltl\f1"
+.BI -f " ltl"
 Translate the LTL formula
 Translate the LTL formula
 .I ltl
 .I ltl
-into a never claim.
+into a
+.I never
+claim.
 .br
 .br
 This option reads a formula in LTL syntax from the second argument
 This option reads a formula in LTL syntax from the second argument
-and translates it into Promela syntax (a never claim, which is Promela's
+and translates it into Promela syntax (a
+.I never
+claim, which is Promela's
 equivalent of a Büchi Automaton).
 equivalent of a Büchi Automaton).
-The LTL operators are written: 
+The LTL operators are written:
 .B []
 .B []
 (always),
 (always),
 .B <>
 .B <>
 (eventually),
 (eventually),
 and
 and
 .B U
 .B U
-(strong until).  There is no 
+(strong until).  There is no
 .B X
 .B X
 (next) operator, to secure
 (next) operator, to secure
 compatibility with the partial order reduction rules that are
 compatibility with the partial order reduction rules that are
@@ -175,14 +176,16 @@ If the formula contains spaces, it should be quoted to form a
 single argument to the
 single argument to the
 .I spin
 .I spin
 command.
 command.
-.\"--------------------------F------------
+.
 .TP
 .TP
-.B "-F \f2file\f1"
+.BI -F " file"
 Translate the LTL formula stored in
 Translate the LTL formula stored in
 .I file
 .I file
-into a never claim.
+into a
+.I never
+claim.
 .br
 .br
-This behaves identical to option
+This behaves identically to option
 .B -f
 .B -f
 but will read the formula from the
 but will read the formula from the
 .I file
 .I file
@@ -196,64 +199,63 @@ the use of option
 Option
 Option
 .B -F
 .B -F
 is meant to solve those problems.)
 is meant to solve those problems.)
-.\"--------------------------i------------
+.
 .TP
 .TP
 .B -i
 .B -i
 Perform an interactive simulation, prompting the user at
 Perform an interactive simulation, prompting the user at
 every execution step that requires a nondeterministic choice
 every execution step that requires a nondeterministic choice
 to be made.  The simulation proceeds without user intervention
 to be made.  The simulation proceeds without user intervention
 when execution is deterministic.
 when execution is deterministic.
-.\"--------------------------M------------
+.
 .TP
 .TP
 .B -M
 .B -M
 Produce a message sequence chart in Postscript form for a
 Produce a message sequence chart in Postscript form for a
 random simulation or a guided simulation
 random simulation or a guided simulation
-(when combined with 
+(when combined with
 .BR -t ),
 .BR -t ),
 for the model in
 for the model in
-.I file ,
+.IR file ,
 and write the result into
 and write the result into
-.I file.ps .
+.IR file.ps .
 See also option
 See also option
 .BR -c .
 .BR -c .
-.\"--------------------------m------------
+.
 .TP
 .TP
 .B -m
 .B -m
 Changes the semantics of send events.
 Changes the semantics of send events.
 Ordinarily, a send action will be (blocked) if the
 Ordinarily, a send action will be (blocked) if the
 target message buffer is full.
 target message buffer is full.
 With this option a message sent to a full buffer is lost.
 With this option a message sent to a full buffer is lost.
-.\"--------------------------n------------
+.
 .TP
 .TP
-.B "-n\f2N"
+.BI -n N
 Set the seed for a random simulation to the integer value
 Set the seed for a random simulation to the integer value
-.I N .
+.IR N .
 There is no space between the
 There is no space between the
 .B -n
 .B -n
 and the integer
 and the integer
 .IR N .
 .IR N .
-.\"--------------------------t------------
+.
 .TP
 .TP
 .B -t
 .B -t
 Perform a guided simulation, following the error trail that
 Perform a guided simulation, following the error trail that
 was produces by an earlier verification run, see the online manuals
 was produces by an earlier verification run, see the online manuals
 for the details on verification.
 for the details on verification.
-.\"--------------------------V------------
+.
 .TP
 .TP
 .B -V
 .B -V
 Prints the
 Prints the
 .I spin
 .I spin
 version number and exits.
 version number and exits.
-.\"--------------------------.------------
-.PD
+.
 .PP
 .PP
-With only a filename as an argument and no option flags,
+With only a filename as an argument and no options,
 .I spin
 .I spin
 performs a random simulation of the model specified in
 performs a random simulation of the model specified in
 the file (standard input is the default if the filename is omitted).
 the file (standard input is the default if the filename is omitted).
 If option
 If option
 .B -i
 .B -i
-is added, the simulation is 
+is added, the simulation is
 .IR interactive ,
 .IR interactive ,
 or if option
 or if option
 .B -t
 .B -t
@@ -262,21 +264,20 @@ is added, the simulation is
 .PP
 .PP
 The simulation normally does not generate output, except what is generated
 The simulation normally does not generate output, except what is generated
 explicitly by the user within the model with
 explicitly by the user within the model with
-.B printf
+.I printf
 statements, and some details about the final state that is
 statements, and some details about the final state that is
 reached after the simulation completes.
 reached after the simulation completes.
 The group of options
 The group of options
-.B -bglprsv
+.B -bglmprsv
 sets the desired level of information that the user wants
 sets the desired level of information that the user wants
 about a random, guided, or interactive simulation run.
 about a random, guided, or interactive simulation run.
 Every line of output normally contains a reference to the source
 Every line of output normally contains a reference to the source
 line in the specification that generated it.
 line in the specification that generated it.
-The options are:
-.\"--------------------------bglprsv------------
+.
 .TP
 .TP
 .B -b
 .B -b
 Suppress the execution of
 Suppress the execution of
-.B printf
+.I printf
 statements within the model.
 statements within the model.
 .TP
 .TP
 .B -g
 .B -g
@@ -302,30 +303,29 @@ the message type and the message channel number and name.
 Show all message-send events.
 Show all message-send events.
 .TP
 .TP
 .B -v
 .B -v
-Verbose mode, add some more detail, and generat more
+Verbose mode, add some more detail, and generate more
 hints and warnings about the model.
 hints and warnings about the model.
-.PD
 .SH SOURCE
 .SH SOURCE
 .B /sys/src/cmd/spin
 .B /sys/src/cmd/spin
 .SH SEE ALSO
 .SH SEE ALSO
+.in +4
+.ti -4
+.BR http://spinroot.com :
+.BR GettingStarted.pdf ,
+.BR Roadmap.pdf ,
+.BR Manual.pdf ,
+.BR WhatsNew.pdf ,
+.B Exercises.pdf
+.br
+.in -4
 G.J. Holzmann,
 G.J. Holzmann,
 .IR "Design and Validation of Computer Protocols" ,
 .IR "Design and Validation of Computer Protocols" ,
 Prentice Hall, 1991.
 Prentice Hall, 1991.
 .br
 .br
-\(em, ``Design and validation of protocols: a tutorial,''
-.I "Computer Networks and ISDN Systems" ,
+—, `Design and validation of protocols: a tutorial,'
+.IR "Computer Networks and ISDN Systems" ,
 Vol. 25, No. 9, 1993, pp. 981-1017.
 Vol. 25, No. 9, 1993, pp. 981-1017.
 .br
 .br
-\(em, ``The model checker
-.SM SPIN\c
-\&,''
-.I "IEEE Trans. on Software Engineering" ,
+—, `The model checker Spin,'
+.IR "IEEE Trans. on SE" ,
 Vol, 23, No. 5, May 1997.
 Vol, 23, No. 5, May 1997.
-.br
-\(em, ``Using
-.SM SPIN\c
-\&,''
-this manual.
-.PP
-.B http://spinroot.com/
-

+ 1 - 1
sys/src/cmd/spin/README

@@ -2,7 +2,7 @@ the latest version of spin is always
 available via:
 available via:
 	http://spinroot.com/spin/whatispin.html
 	http://spinroot.com/spin/whatispin.html
 
 
-to make the sources compile with the mkfile on plan 9
+to make the sources compile with the mkfile on Plan 9
 the following changes were made:
 the following changes were made:
 
 
 	omitted memory.h from spin.h
 	omitted memory.h from spin.h

+ 5 - 6
sys/src/cmd/spin/dstep.c

@@ -10,11 +10,7 @@
 /* Send all bug-reports and/or questions to: bugs@spinroot.com            */
 /* Send all bug-reports and/or questions to: bugs@spinroot.com            */
 
 
 #include "spin.h"
 #include "spin.h"
-#ifdef PC
-#include "y_tab.h"
-#else
 #include "y.tab.h"
 #include "y.tab.h"
-#endif
 
 
 #define MAXDSTEP	1024	/* was 512 */
 #define MAXDSTEP	1024	/* was 512 */
 
 
@@ -168,7 +164,10 @@ CollectGuards(FILE *fd, Element *e, int inh)
 			break;
 			break;
 		case ELSE:
 		case ELSE:
 			if (inh++ > 0) fprintf(fd, " || ");
 			if (inh++ > 0) fprintf(fd, " || ");
-			fprintf(fd, "(1 /* else */)");
+/* 4.2.5 */		if (Pid != claimnr)
+				fprintf(fd, "(boq == -1 /* else */)");
+			else
+				fprintf(fd, "(1 /* else */)");
 			break;
 			break;
 		case 'R':
 		case 'R':
 			if (inh++ > 0) fprintf(fd, " || ");
 			if (inh++ > 0) fprintf(fd, " || ");
@@ -387,7 +386,7 @@ putCode(FILE *fd, Element *f, Element *last, Element *next, int isguard)
 			{	sprintf(NextOpt, "goto S_%.3d_%d",
 			{	sprintf(NextOpt, "goto S_%.3d_%d",
 					e->Seqno, i);
 					e->Seqno, i);
 				NextLab[++Level] = NextOpt;
 				NextLab[++Level] = NextOpt;
-				N = (e->n->ntyp == DO) ? e : e->nxt;
+				N = (e->n && e->n->ntyp == DO) ? e : e->nxt;
 				putCode(fd, h->this->frst,
 				putCode(fd, h->this->frst,
 					h->this->extent, N, 1);
 					h->this->extent, N, 1);
 				Level--;
 				Level--;

+ 0 - 4
sys/src/cmd/spin/flow.c

@@ -10,11 +10,7 @@
 /* Send all bug-reports and/or questions to: bugs@spinroot.com            */
 /* Send all bug-reports and/or questions to: bugs@spinroot.com            */
 
 
 #include "spin.h"
 #include "spin.h"
-#ifdef PC
-#include "y_tab.h"
-#else
 #include "y.tab.h"
 #include "y.tab.h"
-#endif
 
 
 extern Symbol	*Fname;
 extern Symbol	*Fname;
 extern int	nr_errs, lineno, verbose;
 extern int	nr_errs, lineno, verbose;

+ 16 - 11
sys/src/cmd/spin/guided.c

@@ -12,11 +12,7 @@
 #include "spin.h"
 #include "spin.h"
 #include <sys/types.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/stat.h>
-#ifdef PC
-#include "y_tab.h"
-#else
 #include "y.tab.h"
 #include "y.tab.h"
-#endif
 
 
 extern RunList	*run, *X;
 extern RunList	*run, *X;
 extern Element	*Al_El;
 extern Element	*Al_El;
@@ -45,7 +41,12 @@ whichproc(int p)
 
 
 static int
 static int
 newer(char *f1, char *f2)
 newer(char *f1, char *f2)
-{	struct stat x, y;
+{
+#if defined(WIN32) || defined(WIN64)
+	struct _stat x, y;
+#else
+	struct stat x, y;
+#endif
 
 
 	if (stat(f1, (struct stat *)&x) < 0) return 0;
 	if (stat(f1, (struct stat *)&x) < 0) return 0;
 	if (stat(f2, (struct stat *)&y) < 0) return 1;
 	if (stat(f2, (struct stat *)&y) < 0) return 1;
@@ -222,7 +223,9 @@ okay:
 				}
 				}
 				og = g;
 				og = g;
 			} while (g && g != dothis->nxt);
 			} while (g && g != dothis->nxt);
-			X->pc = g?huntele(g, 0, -1):g;
+			if (X != NULL)
+			{	X->pc = g?huntele(g, 0, -1):g;
+			}
 		} else
 		} else
 		{
 		{
 keepgoing:		if (dothis->merge_start)
 keepgoing:		if (dothis->merge_start)
@@ -230,8 +233,10 @@ keepgoing:		if (dothis->merge_start)
 			else
 			else
 				a = dothis->merge;
 				a = dothis->merge;
 
 
-			X->pc = eval_sub(dothis);
-			if (X->pc) X->pc = huntele(X->pc, 0, a);
+			if (X != NULL)
+			{	X->pc = eval_sub(dothis);
+				if (X->pc) X->pc = huntele(X->pc, 0, a);
+			}
 
 
 			if (depth >= jumpsteps
 			if (depth >= jumpsteps
 			&& ((verbose&32) || ((verbose&4) && not_claim())))	/* -v or -p */
 			&& ((verbose&32) || ((verbose&4) && not_claim())))	/* -v or -p */
@@ -247,20 +252,20 @@ keepgoing:		if (dothis->merge_start)
 					if (a && (verbose&32))
 					if (a && (verbose&32))
 					printf("\t<merge %d now @%d>",
 					printf("\t<merge %d now @%d>",
 						dothis->merge,
 						dothis->merge,
-						X->pc?X->pc->seqno:-1);
+						(X && X->pc)?X->pc->seqno:-1);
 					printf("\n");
 					printf("\n");
 				}
 				}
 				if (verbose&1) dumpglobals();
 				if (verbose&1) dumpglobals();
 				if (verbose&2) dumplocal(X);
 				if (verbose&2) dumplocal(X);
 				if (xspin) printf("\n");
 				if (xspin) printf("\n");
 
 
-				if (!X->pc)
+				if (X && !X->pc)
 				{	X->pc = dothis;
 				{	X->pc = dothis;
 					printf("\ttransition failed\n");
 					printf("\ttransition failed\n");
 					a = 0;	/* avoid inf loop */
 					a = 0;	/* avoid inf loop */
 				}
 				}
 			}
 			}
-			if (a && X->pc && X->pc->seqno != a)
+			if (a && X && X->pc && X->pc->seqno != a)
 			{	dothis = X->pc;
 			{	dothis = X->pc;
 				goto keepgoing;
 				goto keepgoing;
 		}	}
 		}	}

+ 7 - 14
sys/src/cmd/spin/main.c

@@ -17,14 +17,11 @@
 #include <time.h>
 #include <time.h>
 #ifdef PC
 #ifdef PC
 #include <io.h>
 #include <io.h>
-#include "y_tab.h"
-
 extern int unlink(const char *);
 extern int unlink(const char *);
-
 #else
 #else
 #include <unistd.h>
 #include <unistd.h>
-#include "y.tab.h"
 #endif
 #endif
+#include "y.tab.h"
 
 
 extern int	DstepStart, lineno, tl_terse;
 extern int	DstepStart, lineno, tl_terse;
 extern FILE	*yyin, *yyout, *tl_out;
 extern FILE	*yyin, *yyout, *tl_out;
@@ -82,7 +79,7 @@ static void	explain(int);
 #ifdef SOLARIS
 #ifdef SOLARIS
 #define CPP	"/usr/ccs/lib/cpp"
 #define CPP	"/usr/ccs/lib/cpp"
 #else
 #else
-#if defined(__FreeBSD__) || defined(__OpenBSD__)
+#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)
 #define CPP	"cpp"
 #define CPP	"cpp"
 #else
 #else
 #define CPP	"/bin/cpp"	/* classic Unix systems */
 #define CPP	"/bin/cpp"	/* classic Unix systems */
@@ -356,7 +353,7 @@ main(int argc, char *argv[])
 
 
 		default : usage(); break;
 		default : usage(); break;
 		}
 		}
-		argc--, argv++;
+		argc--; argv++;
 	}
 	}
 	if (usedopts && !analyze)
 	if (usedopts && !analyze)
 		printf("spin: warning -o[123] option ignored in simulations\n");
 		printf("spin: warning -o[123] option ignored in simulations\n");
@@ -490,13 +487,6 @@ non_fatal(char *s1, char *s2)
 		printf(s1, s2);
 		printf(s1, s2);
 	else
 	else
 		printf(s1);
 		printf(s1);
-#if 0
-	if (yychar != -1 && yychar != 0)
-	{	printf("	saw '");
-		explain(yychar);
-		printf("'");
-	}
-#endif
 	if (yytext && strlen(yytext)>1)
 	if (yytext && strlen(yytext)>1)
 		printf(" near '%s'", yytext);
 		printf(" near '%s'", yytext);
 	printf("\n");
 	printf("\n");
@@ -514,6 +504,9 @@ char *
 emalloc(int n)
 emalloc(int n)
 {	char *tmp;
 {	char *tmp;
 
 
+	if (n == 0)
+		return NULL;	/* robert shelton 10/20/06 */
+
 	if (!(tmp = (char *) malloc(n)))
 	if (!(tmp = (char *) malloc(n)))
 		fatal("not enough memory", (char *)0);
 		fatal("not enough memory", (char *)0);
 	memset(tmp, 0, n);
 	memset(tmp, 0, n);
@@ -534,7 +527,7 @@ trapwonly(Lextok *n, char *unused)
 		return;
 		return;
 
 
 	if (realread)
 	if (realread)
-	n->sym->hidden |= 32;	/* var is read at least once */
+	n->sym->hidden |= 128;	/* var is read at least once */
 }
 }
 
 
 void
 void

+ 22 - 6
sys/src/cmd/spin/mesg.c

@@ -10,11 +10,7 @@
 /* Send all bug-reports and/or questions to: bugs@spinroot.com            */
 /* Send all bug-reports and/or questions to: bugs@spinroot.com            */
 
 
 #include "spin.h"
 #include "spin.h"
-#ifdef PC
-#include "y_tab.h"
-#else
 #include "y.tab.h"
 #include "y.tab.h"
-#endif
 
 
 #ifndef MAXQ
 #ifndef MAXQ
 #define MAXQ	2500		/* default max # queues  */
 #define MAXQ	2500		/* default max # queues  */
@@ -538,11 +534,15 @@ sr_talk(Lextok *n, int v, char *tr, char *a, int j, Queue *q)
 void
 void
 sr_buf(int v, int j)
 sr_buf(int v, int j)
 {	int cnt = 1; Lextok *n;
 {	int cnt = 1; Lextok *n;
-	char lbuf[256];
+	char lbuf[512];
 
 
 	for (n = Mtype; n && j; n = n->rgt, cnt++)
 	for (n = Mtype; n && j; n = n->rgt, cnt++)
 		if (cnt == v)
 		if (cnt == v)
-		{	sprintf(lbuf, "%s", n->lft->sym->name);
+		{	if(strlen(n->lft->sym->name) >= sizeof(lbuf))
+			{	non_fatal("mtype name %s too long", n->lft->sym->name);
+				break;
+			}
+			sprintf(lbuf, "%s", n->lft->sym->name);
 			strcat(Buf, lbuf);
 			strcat(Buf, lbuf);
 			return;
 			return;
 		}
 		}
@@ -626,3 +626,19 @@ nochan_manip(Lextok *p, Lextok *n, int d)
 	nochan_manip(p, n->lft, e);
 	nochan_manip(p, n->lft, e);
 	nochan_manip(p, n->rgt, 1);
 	nochan_manip(p, n->rgt, 1);
 }
 }
+
+void
+no_internals(Lextok *n)
+{	char *sp;
+
+	if (!n->sym
+	||  !n->sym->name)
+		return;
+
+	sp = n->sym->name;
+
+	if ((strlen(sp) == strlen("_nr_pr") && strcmp(sp, "_nr_pr") == 0)
+	||  (strlen(sp) == strlen("_p") && strcmp(sp, "_p") == 0))
+	{	fatal("attempt to assign value to system variable %s", sp);
+	}
+}

+ 116 - 58
sys/src/cmd/spin/pangen1.c

@@ -10,11 +10,7 @@
 /* Send all bug-reports and/or questions to: bugs@spinroot.com            */
 /* Send all bug-reports and/or questions to: bugs@spinroot.com            */
 
 
 #include "spin.h"
 #include "spin.h"
-#ifdef PC
-#include "y_tab.h"
-#else
 #include "y.tab.h"
 #include "y.tab.h"
-#endif
 #include "pangen1.h"
 #include "pangen1.h"
 #include "pangen3.h"
 #include "pangen3.h"
 
 
@@ -372,40 +368,53 @@ dolocal(FILE *ofd, char *pre, int dowhat, int p, char *s)
 	Symbol *sp;
 	Symbol *sp;
 	char buf[64], buf2[128], buf3[128];
 	char buf[64], buf2[128], buf3[128];
 
 
-	for (j = 0; j < 8; j++)
-	for (h = 0; h <= 1; h++)
-	for (walk = all_names; walk; walk = walk->next)
-	{	sp = walk->entry;
-		if (sp->context
-		&& !sp->owner
-		&&  sp->type == Types[j]
-		&&  ((h == 0 && sp->nel == 1) || (h == 1 && sp->nel > 1))
-		&&  strcmp(s, sp->context->name) == 0)
-		{	switch (dowhat) {
-			case LOGV:
-				if (sp->type == CHAN
-				&&  verbose == 0)
-					break;
-				sprintf(buf, "%s%s:", pre, s);
-				{ sprintf(buf2, "\", ((P%d *)pptr(h))->", p);
-				  sprintf(buf3, ");\n");
+	if (dowhat == INIV)
+	{	/* initialize in order of declaration */
+		for (walk = all_names; walk; walk = walk->next)
+		{	sp = walk->entry;
+			if (sp->context
+			&& !sp->owner
+			&&  strcmp(s, sp->context->name) == 0)
+			{	checktype(sp, s); /* fall through */
+				if (!(sp->hidden&16))
+				{	sprintf(buf, "((P%d *)pptr(h))->", p);
+					do_var(ofd, dowhat, buf, sp, "", " = ", ";\n");
 				}
 				}
-				do_var(ofd, dowhat, "", sp, buf, buf2, buf3);
-				break;
-			case INIV:
-				checktype(sp, s); /* fall through */
-				if (sp->hidden&16) { k++; break; }
-			case PUTV:
-				sprintf(buf, "((P%d *)pptr(h))->", p);
-				do_var(ofd, dowhat, buf, sp, "", " = ", ";\n");
 				k++;
 				k++;
-				break;
-			}
-			if (strcmp(s, ":never:") == 0)
-			{	printf("error: %s defines local %s\n",
-					s, sp->name);
-				nr_errs++;
-	}	}	}
+		}	}
+	} else
+	{	for (j = 0; j < 8; j++)
+		for (h = 0; h <= 1; h++)
+		for (walk = all_names; walk; walk = walk->next)
+		{	sp = walk->entry;
+			if (sp->context
+			&& !sp->owner
+			&&  sp->type == Types[j]
+			&&  ((h == 0 && sp->nel == 1) || (h == 1 && sp->nel > 1))
+			&&  strcmp(s, sp->context->name) == 0)
+			{	switch (dowhat) {
+				case LOGV:
+					if (sp->type == CHAN
+					&&  verbose == 0)
+						break;
+					sprintf(buf, "%s%s:", pre, s);
+					{ sprintf(buf2, "\", ((P%d *)pptr(h))->", p);
+					  sprintf(buf3, ");\n");
+					}
+					do_var(ofd, dowhat, "", sp, buf, buf2, buf3);
+					break;
+				case PUTV:
+					sprintf(buf, "((P%d *)pptr(h))->", p);
+					do_var(ofd, dowhat, buf, sp, "", " = ", ";\n");
+					k++;
+					break;
+				}
+				if (strcmp(s, ":never:") == 0)
+				{	printf("error: %s defines local %s\n",
+						s, sp->name);
+					nr_errs++;
+	}	}	}	}
+
 	return k;
 	return k;
 }
 }
 
 
@@ -472,12 +481,17 @@ c_var(FILE *fd, char *pref, Symbol *sp)
 	case UNSIGNED:
 	case UNSIGNED:
 		sputtype(buf, sp->type);
 		sputtype(buf, sp->type);
 		if (sp->nel == 1)
 		if (sp->nel == 1)
-		fprintf(fd, "\tprintf(\"\t%s %s:\t%%d\\n\", %s%s);\n",
-			buf, sp->name, pref, sp->name);
-		else
-		for (i = 0; i < sp->nel; i++)
-		fprintf(fd, "\tprintf(\"\t%s %s[%d]:\t%%d\\n\", %s%s[%d]);\n",
-			buf, sp->name, i, pref, sp->name, i);
+		{	fprintf(fd, "\tprintf(\"\t%s %s:\t%%d\\n\", %s%s);\n",
+				buf, sp->name, pref, sp->name);
+		} else
+		{	fprintf(fd, "\t{\tint l_in;\n");
+			fprintf(fd, "\t\tfor (l_in = 0; l_in < %d; l_in++)\n", sp->nel);
+			fprintf(fd, "\t\t{\n");
+			fprintf(fd, "\t\t\tprintf(\"\t%s %s[%%d]:\t%%d\\n\", l_in, %s%s[l_in]);\n",
+						buf, sp->name, pref, sp->name);
+			fprintf(fd, "\t\t}\n");
+			fprintf(fd, "\t}\n");
+		}
 		break;
 		break;
 	case CHAN:
 	case CHAN:
 		if (sp->nel == 1)
 		if (sp->nel == 1)
@@ -499,6 +513,28 @@ c_var(FILE *fd, char *pref, Symbol *sp)
 	}
 	}
 }
 }
 
 
+int
+c_splurge_any(ProcList *p)
+{	Ordered *walk;
+	Symbol *sp;
+
+	if (strcmp(p->n->name, ":never:") != 0
+	&&  strcmp(p->n->name, ":trace:") != 0
+	&&  strcmp(p->n->name, ":notrace:") != 0)
+	for (walk = all_names; walk; walk = walk->next)
+	{	sp = walk->entry;
+		if (!sp->context
+		||  sp->type == 0
+		||  strcmp(sp->context->name, p->n->name) != 0
+		||  sp->owner || (sp->hidden&1)
+		|| (sp->type == MTYPE && ismtype(sp->name)))
+			continue;
+
+		return 1;
+	}
+	return 0;
+}
+
 void
 void
 c_splurge(FILE *fd, ProcList *p)
 c_splurge(FILE *fd, ProcList *p)
 {	Ordered *walk;
 {	Ordered *walk;
@@ -511,6 +547,7 @@ c_splurge(FILE *fd, ProcList *p)
 	for (walk = all_names; walk; walk = walk->next)
 	for (walk = all_names; walk; walk = walk->next)
 	{	sp = walk->entry;
 	{	sp = walk->entry;
 		if (!sp->context
 		if (!sp->context
+		||  sp->type == 0
 		||  strcmp(sp->context->name, p->n->name) != 0
 		||  strcmp(sp->context->name, p->n->name) != 0
 		||  sp->owner || (sp->hidden&1)
 		||  sp->owner || (sp->hidden&1)
 		|| (sp->type == MTYPE && ismtype(sp->name)))
 		|| (sp->type == MTYPE && ismtype(sp->name)))
@@ -548,7 +585,13 @@ c_wrapper(FILE *fd)	/* allow pan.c to print out global sv entries */
 	{	fprintf(fd, "	case %d:\n", p->tn);
 	{	fprintf(fd, "	case %d:\n", p->tn);
 		fprintf(fd, "	\tprintf(\"local vars proc %%d (%s):\\n\", pid);\n",
 		fprintf(fd, "	\tprintf(\"local vars proc %%d (%s):\\n\", pid);\n",
 			p->n->name);
 			p->n->name);
-		c_splurge(fd, p);
+		if (c_splurge_any(p))
+		{	fprintf(fd, "	\tprintf(\"local vars proc %%d (%s):\\n\", pid);\n",
+				p->n->name);
+			c_splurge(fd, p);
+		} else
+		{	fprintf(fd, "	\t/* none */\n");
+		}
 		fprintf(fd, "	\tbreak;\n");
 		fprintf(fd, "	\tbreak;\n");
 	}
 	}
 	fprintf(fd, "	}\n}\n");
 	fprintf(fd, "	}\n}\n");
@@ -648,16 +691,31 @@ do_var(FILE *ofd, int dowhat, char *s, Symbol *sp,
 				do_init(ofd, sp);
 				do_init(ofd, sp);
 			fprintf(ofd, "%s", ter);
 			fprintf(ofd, "%s", ter);
 		} else
 		} else
-		for (i = 0; i < sp->nel; i++)
-		{	fprintf(ofd, "\t\t%s%s%s[%d]%s",
-				pre, s, sp->name, i, sep);
-			if (dowhat == LOGV)
-				fprintf(ofd, "%s%s[%d]",
-					s, sp->name, i);
-			else
-				do_init(ofd, sp);
-			fprintf(ofd, "%s", ter);
-		}
+		{	if (sp->ini && sp->ini->ntyp == CHAN)
+			{	for (i = 0; i < sp->nel; i++)
+				{	fprintf(ofd, "\t\t%s%s%s[%d]%s",
+						pre, s, sp->name, i, sep);
+					if (dowhat == LOGV)
+						fprintf(ofd, "%s%s[%d]",
+							s, sp->name, i);
+					else
+						do_init(ofd, sp);
+					fprintf(ofd, "%s", ter);
+				}
+			} else
+			{	fprintf(ofd, "\t{\tint l_in;\n");
+				fprintf(ofd, "\t\tfor (l_in = 0; l_in < %d; l_in++)\n", sp->nel);
+				fprintf(ofd, "\t\t{\n");
+				fprintf(ofd, "\t\t\t%s%s%s[l_in]%s",
+						pre, s, sp->name, sep);
+				if (dowhat == LOGV)
+					fprintf(ofd, "%s%s[l_in]", s, sp->name);
+				else
+					putstmnt(ofd, sp->ini, 0);
+				fprintf(ofd, "%s", ter);
+				fprintf(ofd, "\t\t}\n");
+				fprintf(ofd, "\t}\n");
+		}	}
 		break;
 		break;
 	}
 	}
 }
 }
@@ -753,7 +811,7 @@ tc_predef_np(void)
 {	int i = nrRdy;	/* 1+ highest proctype nr */
 {	int i = nrRdy;	/* 1+ highest proctype nr */
 
 
 	fprintf(th, "#define _NP_	%d\n", i);
 	fprintf(th, "#define _NP_	%d\n", i);
-	if (separate == 2) fprintf(th, "extern ");
+/*	if (separate == 2) fprintf(th, "extern ");	*/
 	fprintf(th, "uchar reached%d[3];  /* np_ */\n", i);
 	fprintf(th, "uchar reached%d[3];  /* np_ */\n", i);
 
 
 	fprintf(th, "#define nstates%d	3 /* np_ */\n", i);
 	fprintf(th, "#define nstates%d	3 /* np_ */\n", i);
@@ -861,7 +919,7 @@ huntstart(Element *f)
 	Element *elast = (Element *) 0;
 	Element *elast = (Element *) 0;
 	int cnt = 0;
 	int cnt = 0;
 
 
-	while (elast != e && cnt++ < 20)	/* new 4.0.8 */
+	while (elast != e && cnt++ < 200)	/* new 4.0.8 */
 	{	elast = e;
 	{	elast = e;
 		if (e->n)
 		if (e->n)
 		{	if (e->n->ntyp == '.' && e->nxt)
 		{	if (e->n->ntyp == '.' && e->nxt)
@@ -870,7 +928,7 @@ huntstart(Element *f)
 				e = e->sub->this->frst;
 				e = e->sub->this->frst;
 	}	}
 	}	}
 
 
-	if (cnt >= 20 || !e)
+	if (cnt >= 200 || !e)
 		fatal("confusing control structure", (char *) 0);
 		fatal("confusing control structure", (char *) 0);
 	return e;
 	return e;
 }
 }
@@ -881,7 +939,7 @@ huntele(Element *f, int o, int stopat)
 	int cnt=0; /* a precaution against loops */
 	int cnt=0; /* a precaution against loops */
 
 
 	if (e)
 	if (e)
-	for (cnt = 0; cnt < 20 && e->n; cnt++)
+	for (cnt = 0; cnt < 200 && e->n; cnt++)
 	{
 	{
 		if (e->seqno == stopat)
 		if (e->seqno == stopat)
 			break;
 			break;
@@ -910,7 +968,7 @@ huntele(Element *f, int o, int stopat)
 			return e;
 			return e;
 		e = g;
 		e = g;
 	}
 	}
-	if (cnt >= 20 || !e)
+	if (cnt >= 200 || !e)
 		fatal("confusing control structure", (char *) 0);
 		fatal("confusing control structure", (char *) 0);
 	return e;
 	return e;
 }
 }

+ 199 - 99
sys/src/cmd/spin/pangen1.h

@@ -1,6 +1,6 @@
 /***** spin: pangen1.h *****/
 /***** spin: pangen1.h *****/
 
 
-/* Copyright (c) 1989-2003 by Lucent Technologies, Bell Laboratories.     */
+/* Copyright (c) 1989-2005 by Lucent Technologies, Bell Laboratories.     */
 /* All Rights Reserved.  This software is for educational purposes only.  */
 /* All Rights Reserved.  This software is for educational purposes only.  */
 /* No guarantee whatsoever is expressed or implied by the distribution of */
 /* No guarantee whatsoever is expressed or implied by the distribution of */
 /* this code.  Permission is given to distribute this code provided that  */
 /* this code.  Permission is given to distribute this code provided that  */
@@ -185,7 +185,7 @@ static char *Code2a[] = { /* the tail of procedure run() */
 	"	static char buf[2][2048];",
 	"	static char buf[2][2048];",
 	"	int i, toggle = 0;",
 	"	int i, toggle = 0;",
 
 
-	"	if (strlen(s) > 2047) return s;",
+	"	if (!s || strlen(s) > 2047) return s;",
 	"	memset(buf[0], 0, 2048);",
 	"	memset(buf[0], 0, 2048);",
 	"	memset(buf[1], 0, 2048);",
 	"	memset(buf[1], 0, 2048);",
 	"	strcpy(buf[toggle], s);",
 	"	strcpy(buf[toggle], s);",
@@ -225,7 +225,7 @@ static char *Code2a[] = { /* the tail of procedure run() */
 	"	{	printf(\"\\t\\t\");",
 	"	{	printf(\"\\t\\t\");",
 
 
 	"		q = transmognify(t->tp);",
 	"		q = transmognify(t->tp);",
-	"		for ( ; *q; q++)",
+	"		for ( ; q && *q; q++)",
 	"			if (*q == '\\n')",
 	"			if (*q == '\\n')",
 	"				printf(\"\\\\n\");",
 	"				printf(\"\\\\n\");",
 	"			else",
 	"			else",
@@ -241,12 +241,12 @@ static char *Code2a[] = { /* the tail of procedure run() */
 	"",
 	"",
 	"	if (wrap_in_progress++) return;",
 	"	if (wrap_in_progress++) return;",
 	"",
 	"",
-	"	printf(\"spin: trail ends after %%d steps\\n\", depth);",
+	"	printf(\"spin: trail ends after %%ld steps\\n\", depth);",
 	"	if (onlyproc >= 0)",
 	"	if (onlyproc >= 0)",
 	"	{	if (onlyproc >= now._nr_pr) pan_exit(0);",
 	"	{	if (onlyproc >= now._nr_pr) pan_exit(0);",
 	"		II = onlyproc;",
 	"		II = onlyproc;",
 	"		z = (P0 *)pptr(II);",
 	"		z = (P0 *)pptr(II);",
-	"		printf(\"%%3d:\tproc %%d (%%s) \",",
+	"		printf(\"%%3ld:\tproc %%d (%%s) \",",
 	"			depth, II, procname[z->_t]);",
 	"			depth, II, procname[z->_t]);",
 	"		for (i = 0; src_all[i].src; i++)",
 	"		for (i = 0; src_all[i].src; i++)",
 	"			if (src_all[i].tp == (int) z->_t)",
 	"			if (src_all[i].tp == (int) z->_t)",
@@ -265,7 +265,7 @@ static char *Code2a[] = { /* the tail of procedure run() */
 	"	if (depth < 0) depth = 0;",
 	"	if (depth < 0) depth = 0;",
 	"	for (II = 0; II < now._nr_pr; II++)",
 	"	for (II = 0; II < now._nr_pr; II++)",
 	"	{	z = (P0 *)pptr(II);",
 	"	{	z = (P0 *)pptr(II);",
-	"		printf(\"%%3d:\tproc %%d (%%s) \",",
+	"		printf(\"%%3ld:\tproc %%d (%%s) \",",
 	"			depth, II, procname[z->_t]);",
 	"			depth, II, procname[z->_t]);",
 	"		for (i = 0; src_all[i].src; i++)",
 	"		for (i = 0; src_all[i].src; i++)",
 	"			if (src_all[i].tp == (int) z->_t)",
 	"			if (src_all[i].tp == (int) z->_t)",
@@ -293,30 +293,34 @@ static char *Code2a[] = { /* the tail of procedure run() */
 	"findtrail(void)",
 	"findtrail(void)",
 	"{	FILE *fd;",
 	"{	FILE *fd;",
 	"	char fnm[512], *q;",
 	"	char fnm[512], *q;",
+	"	char MyFile[512];",
+	"",
+	"	strcpy(MyFile, TrailFile);",	/* avoid problem with non-writable strings */
+	"",
 	"	if (whichtrail)",
 	"	if (whichtrail)",
-	"	{	sprintf(fnm, \"%%s%%d.%%s\", TrailFile, whichtrail, tprefix);",
+	"	{	sprintf(fnm, \"%%s%%d.%%s\", MyFile, whichtrail, tprefix);",
 	"		fd = fopen(fnm, \"r\");",
 	"		fd = fopen(fnm, \"r\");",
-	"		if (fd == NULL && (q = strchr(TrailFile, \'.\')))",
+	"		if (fd == NULL && (q = strchr(MyFile, \'.\')))",
 	"		{	*q = \'\\0\';",	/* e.g., strip .pml on original file */
 	"		{	*q = \'\\0\';",	/* e.g., strip .pml on original file */
-	"			sprintf(fnm, \"%%s%%d.%%s\", TrailFile, whichtrail, tprefix);",
+	"			sprintf(fnm, \"%%s%%d.%%s\", MyFile, whichtrail, tprefix);",
 	"			*q = \'.\';",
 	"			*q = \'.\';",
 	"			fd = fopen(fnm, \"r\");",
 	"			fd = fopen(fnm, \"r\");",
 	"			if (fd == NULL)",
 	"			if (fd == NULL)",
 	"			{	printf(\"pan: cannot find %%s%%d.%%s or %%s\\n\", ",
 	"			{	printf(\"pan: cannot find %%s%%d.%%s or %%s\\n\", ",
-	"					TrailFile, whichtrail, tprefix, fnm);",
+	"					MyFile, whichtrail, tprefix, fnm);",
 	"				pan_exit(1);",
 	"				pan_exit(1);",
 	"		}	}",
 	"		}	}",
 	"	} else",
 	"	} else",
-	"	{	sprintf(fnm, \"%%s.%%s\", TrailFile, tprefix);",
+	"	{	sprintf(fnm, \"%%s.%%s\", MyFile, tprefix);",
 	"		fd = fopen(fnm, \"r\");",
 	"		fd = fopen(fnm, \"r\");",
-	"		if (fd == NULL && (q = strchr(TrailFile, \'.\')))",
+	"		if (fd == NULL && (q = strchr(MyFile, \'.\')))",
 	"		{	*q = \'\\0\';",	/* e.g., strip .pml on original file */
 	"		{	*q = \'\\0\';",	/* e.g., strip .pml on original file */
-	"			sprintf(fnm, \"%%s.%%s\", TrailFile, tprefix);",
+	"			sprintf(fnm, \"%%s.%%s\", MyFile, tprefix);",
 	"			*q = \'.\';",
 	"			*q = \'.\';",
 	"			fd = fopen(fnm, \"r\");",
 	"			fd = fopen(fnm, \"r\");",
 	"			if (fd == NULL)",
 	"			if (fd == NULL)",
 	"			{	printf(\"pan: cannot find %%s.%%s or %%s\\n\", ",
 	"			{	printf(\"pan: cannot find %%s.%%s or %%s\\n\", ",
-	"					TrailFile, tprefix, fnm);",
+	"					MyFile, tprefix, fnm);",
 	"				pan_exit(1);",
 	"				pan_exit(1);",
 	"	}	}	}",
 	"	}	}	}",
 	"	if (fd == NULL)",
 	"	if (fd == NULL)",
@@ -337,11 +341,16 @@ static char *Code2a[] = { /* the tail of procedure run() */
 	"	P0 *z;",
 	"	P0 *z;",
 	"",
 	"",
 	"	fd = findtrail();	/* exits if unsuccessful */",
 	"	fd = findtrail();	/* exits if unsuccessful */",
-	"	while (fscanf(fd, \"%%d:%%d:%%d\\n\", &depth, &i, &t_id) == 3)",
+	"	while (fscanf(fd, \"%%ld:%%d:%%d\\n\", &depth, &i, &t_id) == 3)",
 	"	{	if (depth == -1)",
 	"	{	if (depth == -1)",
 	"			printf(\"<<<<<START OF CYCLE>>>>>\\n\");",
 	"			printf(\"<<<<<START OF CYCLE>>>>>\\n\");",
 	"		if (depth < 0)",
 	"		if (depth < 0)",
 	"			continue;",
 	"			continue;",
+	"		if (i > now._nr_pr)",
+	"		{	printf(\"pan: Error, proc %%d invalid pid \", i);",
+	"			printf(\"transition %%d\\n\", t_id);",
+	"			break;",
+	"		}",
 	"		II = i;",
 	"		II = i;",
 	"",
 	"",
 	"		z = (P0 *)pptr(II);",
 	"		z = (P0 *)pptr(II);",
@@ -382,7 +391,7 @@ static char *Code2a[] = { /* the tail of procedure run() */
 	"			goto moveon;",
 	"			goto moveon;",
 
 
 	"		if (verbose)",
 	"		if (verbose)",
-	"		{	printf(\"depth: %%3d proc: %%3d trans: %%3d (%%d procs)  \",",
+	"		{	printf(\"depth: %%3ld proc: %%3d trans: %%3d (%%d procs)  \",",
 	"				depth, II, t_id, now._nr_pr);",
 	"				depth, II, t_id, now._nr_pr);",
 	"			printf(\"forw=%%3d [%%s]\\n\", t->forw, q);",
 	"			printf(\"forw=%%3d [%%s]\\n\", t->forw, q);",
 	"",
 	"",
@@ -409,14 +418,14 @@ static char *Code2a[] = { /* the tail of procedure run() */
 	"		{",
 	"		{",
 	"sameas:		if (no_rck) goto moveon;",
 	"sameas:		if (no_rck) goto moveon;",
 	"			if (coltrace)",
 	"			if (coltrace)",
-	"			{	printf(\"%%d: \", depth);",
+	"			{	printf(\"%%ld: \", depth);",
 	"				for (i = 0; i < II; i++)",
 	"				for (i = 0; i < II; i++)",
 	"					printf(\"\\t\\t\");",
 	"					printf(\"\\t\\t\");",
 	"				printf(\"%%s(%%d):\", procname[z->_t], II);",
 	"				printf(\"%%s(%%d):\", procname[z->_t], II);",
-	"				printf(\"[%%s]\\n\", q);",
-	"			} else",
+	"				printf(\"[%%s]\\n\", q?q:\"\");",
+	"			} else if (!silent)",
 	"			{	if (strlen(simvals) > 0) {",
 	"			{	if (strlen(simvals) > 0) {",
-	"				printf(\"%%3d:	proc %%2d (%%s)\", ",
+	"				printf(\"%%3ld:	proc %%2d (%%s)\", ",
 	"					depth, II, procname[z->_t]);",
 	"					depth, II, procname[z->_t]);",
 	"				for (i = 0; src_all[i].src; i++)",
 	"				for (i = 0; src_all[i].src; i++)",
 	"					if (src_all[i].tp == (int) z->_t)",
 	"					if (src_all[i].tp == (int) z->_t)",
@@ -426,7 +435,7 @@ static char *Code2a[] = { /* the tail of procedure run() */
 	"					}",
 	"					}",
 	"				printf(\"(state %%d)\t[values: %%s]\\n\", z->_p, simvals);",
 	"				printf(\"(state %%d)\t[values: %%s]\\n\", z->_p, simvals);",
 	"				}",
 	"				}",
-	"				printf(\"%%3d:	proc %%2d (%%s)\", ",
+	"				printf(\"%%3ld:	proc %%2d (%%s)\", ",
 	"					depth, II, procname[z->_t]);",
 	"					depth, II, procname[z->_t]);",
 	"				for (i = 0; src_all[i].src; i++)",
 	"				for (i = 0; src_all[i].src; i++)",
 	"					if (src_all[i].tp == (int) z->_t)",
 	"					if (src_all[i].tp == (int) z->_t)",
@@ -434,7 +443,7 @@ static char *Code2a[] = { /* the tail of procedure run() */
 	"							src_all[i].src[z->_p]);",
 	"							src_all[i].src[z->_p]);",
 	"						break;",
 	"						break;",
 	"					}",
 	"					}",
-	"				printf(\"(state %%d)\t[%%s]\\n\", z->_p, q);",
+	"				printf(\"(state %%d)\t[%%s]\\n\", z->_p, q?q:\"\");",
 	"				printf(\"\\n\");",
 	"				printf(\"\\n\");",
 	"		}	}",
 	"		}	}",
 	"moveon:	z->_p = t->st;",
 	"moveon:	z->_p = t->st;",
@@ -491,6 +500,9 @@ static char *Code2a[] = { /* the tail of procedure run() */
 		"#ifdef DEBUG",
 		"#ifdef DEBUG",
 	"	printf(\"New bitstate\\n\");",
 	"	printf(\"New bitstate\\n\");",
 		"#endif",
 		"#endif",
+	"	if (now._a_t&1)",
+	"	{	nShadow++;",
+	"	}",
 	"	return 0;",
 	"	return 0;",
 	"}",
 	"}",
 #endif
 #endif
@@ -526,6 +538,9 @@ static char *Code2a[] = { /* the tail of procedure run() */
 		"#ifdef DEBUG",
 		"#ifdef DEBUG",
 	"	printf(\"New bitstate\\n\");",
 	"	printf(\"New bitstate\\n\");",
 		"#endif",
 		"#endif",
+	"	if (now._a_t&1)",
+	"	{	nShadow++;",
+	"	}",
 	"	return 0;",
 	"	return 0;",
 	"}",
 	"}",
 	"#endif",
 	"#endif",
@@ -538,30 +553,35 @@ static char *Code2a[] = { /* the tail of procedure run() */
 	"make_trail(void)",
 	"make_trail(void)",
 	"{	int fd;",
 	"{	int fd;",
 	"	char *q;",
 	"	char *q;",
+	"	char MyFile[512];",
+	"",
+	"	q = strrchr(TrailFile, \'/\');",
+	"	if (q == NULL) q = TrailFile; else q++;",
+	"	strcpy(MyFile, q); /* TrailFile is not a writable string */",
 	"",
 	"",
 	"	if (iterative == 0 && Nr_Trails++ > 0)",
 	"	if (iterative == 0 && Nr_Trails++ > 0)",
 	"		sprintf(fnm, \"%%s%%d.%%s\",",
 	"		sprintf(fnm, \"%%s%%d.%%s\",",
-	"			TrailFile, Nr_Trails-1, tprefix);",
+	"			MyFile, Nr_Trails-1, tprefix);",
 	"	else",
 	"	else",
-	"		sprintf(fnm, \"%%s.%%s\", TrailFile, tprefix);",
+	"		sprintf(fnm, \"%%s.%%s\", MyFile, tprefix);",
 	"",
 	"",
-	"	if ((fd = creat(fnm, (unsigned short) TMODE)) < 0)",
-	"	{	if ((q = strchr(TrailFile, \'.\')))",
+	"	if ((fd = creat(fnm, TMODE)) < 0)",
+	"	{	if ((q = strchr(MyFile, \'.\')))",
 	"		{	*q = \'\\0\';",		/* strip .pml */
 	"		{	*q = \'\\0\';",		/* strip .pml */
 	"			if (iterative == 0 && Nr_Trails-1 > 0)",
 	"			if (iterative == 0 && Nr_Trails-1 > 0)",
 	"				sprintf(fnm, \"%%s%%d.%%s\",",
 	"				sprintf(fnm, \"%%s%%d.%%s\",",
-	"					TrailFile, Nr_Trails-1, tprefix);",
+	"					MyFile, Nr_Trails-1, tprefix);",
 	"			else",
 	"			else",
-	"				sprintf(fnm, \"%%s.%%s\", TrailFile, tprefix);",
+	"				sprintf(fnm, \"%%s.%%s\", MyFile, tprefix);",
 	"			*q = \'.\';",
 	"			*q = \'.\';",
-	"			fd = creat(fnm, (unsigned short) TMODE);",
+	"			fd = creat(fnm, TMODE);",
 	"	}	}",
 	"	}	}",
 	"	if (fd < 0)",
 	"	if (fd < 0)",
-	"	{	printf(\"cannot create %%s\\n\", fnm);",
+	"	{	printf(\"pan: cannot create %%s\\n\", fnm);",
 	"		perror(\"cause\");",
 	"		perror(\"cause\");",
 	"	} else",
 	"	} else",
-	"		printf(\"pan: wrote %%s\\n\", fnm);",
-	"",
+	"	{	printf(\"pan: wrote %%s\\n\", fnm);",
+	"	}",
 	"	return fd;",
 	"	return fd;",
 	"}",
 	"}",
 	0
 	0
@@ -569,7 +589,7 @@ static char *Code2a[] = { /* the tail of procedure run() */
 
 
 static char *Code2b[] = {	/* breadth-first search option */
 static char *Code2b[] = {	/* breadth-first search option */
 	"#ifdef BFS",
 	"#ifdef BFS",
-	"#define QPROVISO",
+	"#define Q_PROVISO",
 	"#ifndef INLINE_REV",
 	"#ifndef INLINE_REV",
 	"#define INLINE_REV",
 	"#define INLINE_REV",
 	"#endif",
 	"#endif",
@@ -585,8 +605,13 @@ static char *Code2b[] = {	/* breadth-first search option */
 	"	int  sz;",	/* vsize */
 	"	int  sz;",	/* vsize */
 	"	int nrpr;",
 	"	int nrpr;",
 	"	int nrqs;",
 	"	int nrqs;",
-	"	int *po, *ps;",
-	"	int *qo, *qs;",
+	"#if VECTORSZ>32000",
+	"	int *po;",
+	"#else",
+	"	short *po;",
+	"#endif",
+	"	int *qo;",
+	"	uchar *ps, *qs;",
 	"	struct EV_Hold *nxt;",
 	"	struct EV_Hold *nxt;",
 	"} EV_Hold;",
 	"} EV_Hold;",
 	"",
 	"",
@@ -594,7 +619,7 @@ static char *Code2b[] = {	/* breadth-first search option */
 	"	Trail	*frame;",
 	"	Trail	*frame;",
 	"	SV_Hold *onow;",
 	"	SV_Hold *onow;",
 	"	EV_Hold *omask;",
 	"	EV_Hold *omask;",
-	"#ifdef QPROVISO",
+	"#ifdef Q_PROVISO",
 	"	struct H_el *lstate;",
 	"	struct H_el *lstate;",
 	"#endif",
 	"#endif",
 	"	short boq;",
 	"	short boq;",
@@ -647,10 +672,15 @@ static char *Code2b[] = {	/* breadth-first search option */
 	"		&&  (memcmp((char *) Mask, (char *) h->sv, n) == 0)",
 	"		&&  (memcmp((char *) Mask, (char *) h->sv, n) == 0)",
 	"		&&  (now._nr_pr == h->nrpr)",
 	"		&&  (now._nr_pr == h->nrpr)",
 	"		&&  (now._nr_qs == h->nrqs)",
 	"		&&  (now._nr_qs == h->nrqs)",
+	"#if VECTORSZ>32000",
 	"		&&  (memcmp((char *) proc_offset, (char *) h->po, now._nr_pr * sizeof(int)) == 0)",
 	"		&&  (memcmp((char *) proc_offset, (char *) h->po, now._nr_pr * sizeof(int)) == 0)",
-	"		&&  (memcmp((char *) proc_skip,   (char *) h->ps, now._nr_pr * sizeof(int)) == 0)",
 	"		&&  (memcmp((char *) q_offset, (char *) h->qo, now._nr_qs * sizeof(int)) == 0)",
 	"		&&  (memcmp((char *) q_offset, (char *) h->qo, now._nr_qs * sizeof(int)) == 0)",
-	"		&&  (memcmp((char *) q_skip,   (char *) h->qs, now._nr_qs * sizeof(int)) == 0))",
+	"#else",
+	"		&&  (memcmp((char *) proc_offset, (char *) h->po, now._nr_pr * sizeof(short)) == 0)",
+	"		&&  (memcmp((char *) q_offset, (char *) h->qo, now._nr_qs * sizeof(short)) == 0)",
+	"#endif",
+	"		&&  (memcmp((char *) proc_skip,   (char *) h->ps, now._nr_pr * sizeof(uchar)) == 0)",
+	"		&&  (memcmp((char *) q_skip,   (char *) h->qs, now._nr_qs * sizeof(uchar)) == 0))",
 	"			break;",
 	"			break;",
 	"	if (!h)",
 	"	if (!h)",
 	"	{	h = (EV_Hold *) emalloc(sizeof(EV_Hold));",
 	"	{	h = (EV_Hold *) emalloc(sizeof(EV_Hold));",
@@ -664,14 +694,22 @@ static char *Code2b[] = {	/* breadth-first search option */
 	"		if (now._nr_pr > 0)",
 	"		if (now._nr_pr > 0)",
 	"		{	h->po = (int *) emalloc(now._nr_pr * sizeof(int));",
 	"		{	h->po = (int *) emalloc(now._nr_pr * sizeof(int));",
 	"			h->ps = (int *) emalloc(now._nr_pr * sizeof(int));",
 	"			h->ps = (int *) emalloc(now._nr_pr * sizeof(int));",
+	"#if VECTORSZ>32000",
 	"			memcpy((char *) h->po, (char *) proc_offset, now._nr_pr * sizeof(int));",
 	"			memcpy((char *) h->po, (char *) proc_offset, now._nr_pr * sizeof(int));",
-	"			memcpy((char *) h->ps, (char *) proc_skip,   now._nr_pr * sizeof(int));",
+	"#else",
+	"			memcpy((char *) h->po, (char *) proc_offset, now._nr_pr * sizeof(short));",
+	"#endif",
+	"			memcpy((char *) h->ps, (char *) proc_skip,   now._nr_pr * sizeof(uchar));",
 	"		}",
 	"		}",
 	"		if (now._nr_qs > 0)",
 	"		if (now._nr_qs > 0)",
 	"		{	h->qo = (int *) emalloc(now._nr_qs * sizeof(int));",
 	"		{	h->qo = (int *) emalloc(now._nr_qs * sizeof(int));",
 	"			h->qs = (int *) emalloc(now._nr_qs * sizeof(int));",
 	"			h->qs = (int *) emalloc(now._nr_qs * sizeof(int));",
+	"#if VECTORSZ>32000",
 	"			memcpy((char *) h->qo, (char *) q_offset, now._nr_qs * sizeof(int));",
 	"			memcpy((char *) h->qo, (char *) q_offset, now._nr_qs * sizeof(int));",
-	"			memcpy((char *) h->qs, (char *) q_skip,   now._nr_qs * sizeof(int));",
+	"#else",
+	"			memcpy((char *) h->qo, (char *) q_offset, now._nr_qs * sizeof(short));",
+	"#endif",
+	"			memcpy((char *) h->qs, (char *) q_skip,   now._nr_qs * sizeof(uchar));",
 	"		}",
 	"		}",
 	"",
 	"",
 	"		h->nxt = kept;",
 	"		h->nxt = kept;",
@@ -725,7 +763,7 @@ static char *Code2b[] = {	/* breadth-first search option */
 	"	t->onow = getsv(vsize);",
 	"	t->onow = getsv(vsize);",
 	"	memcpy((char *)t->onow->sv, (char *)&now, vsize);",
 	"	memcpy((char *)t->onow->sv, (char *)&now, vsize);",
 	"	t->omask = getsv_mask(vsize);",
 	"	t->omask = getsv_mask(vsize);",
-	"#if defined(FULLSTACK) && defined(QPROVISO)",
+	"#if defined(FULLSTACK) && defined(Q_PROVISO)",
 	"	t->lstate = Lstate;",
 	"	t->lstate = Lstate;",
 	"#endif",
 	"#endif",
 	"	if (!bfs_bot)",
 	"	if (!bfs_bot)",
@@ -750,7 +788,7 @@ static char *Code2b[] = {	/* breadth-first search option */
 	"	bfs_trail = t->nxt;",
 	"	bfs_trail = t->nxt;",
 	"	if (!bfs_trail)",
 	"	if (!bfs_trail)",
 	"		bfs_bot = (BFS_Trail *) 0;",
 	"		bfs_bot = (BFS_Trail *) 0;",
-	"#if defined(QPROVISO) && !defined(BITSTATE) && !defined(NOREDUCE)",
+	"#if defined(Q_PROVISO) && !defined(BITSTATE) && !defined(NOREDUCE)",
 	"	if (t->lstate) t->lstate->tagged = 0;",
 	"	if (t->lstate) t->lstate->tagged = 0;",
 	"#endif",
 	"#endif",
 	"",
 	"",
@@ -764,12 +802,20 @@ static char *Code2b[] = {	/* breadth-first search option */
 	"	memcpy((uchar *) Mask, (uchar *) t->omask->sv, vsize);",
 	"	memcpy((uchar *) Mask, (uchar *) t->omask->sv, vsize);",
 
 
 	"	if (now._nr_pr > 0)",
 	"	if (now._nr_pr > 0)",
+	"#if VECTORSZ>32000",
 	"	{	memcpy((char *)proc_offset, (char *)t->omask->po, now._nr_pr * sizeof(int));",
 	"	{	memcpy((char *)proc_offset, (char *)t->omask->po, now._nr_pr * sizeof(int));",
-	"		memcpy((char *)proc_skip,   (char *)t->omask->ps, now._nr_pr * sizeof(int));",
+	"#else",
+	"	{	memcpy((char *)proc_offset, (char *)t->omask->po, now._nr_pr * sizeof(short));",
+	"#endif",
+	"		memcpy((char *)proc_skip,   (char *)t->omask->ps, now._nr_pr * sizeof(uchar));",
 	"	}",
 	"	}",
 	"	if (now._nr_qs > 0)",
 	"	if (now._nr_qs > 0)",
+	"#if VECTORSZ>32000",
 	"	{	memcpy((uchar *)q_offset, (uchar *)t->omask->qo, now._nr_qs * sizeof(int));",
 	"	{	memcpy((uchar *)q_offset, (uchar *)t->omask->qo, now._nr_qs * sizeof(int));",
-	"		memcpy((uchar *)q_skip,   (uchar *)t->omask->qs, now._nr_qs * sizeof(int));",
+	"#else",
+	"	{	memcpy((uchar *)q_offset, (uchar *)t->omask->qo, now._nr_qs * sizeof(short));",
+	"#endif",
+	"		memcpy((uchar *)q_skip,   (uchar *)t->omask->qs, now._nr_qs * sizeof(uchar));",
 	"	}",
 	"	}",
 
 
 	"	freesv(t->onow);	/* omask not freed */",
 	"	freesv(t->onow);	/* omask not freed */",
@@ -867,7 +913,7 @@ static char *Code2b[] = {	/* breadth-first search option */
 	"			} else",
 	"			} else",
 	"			{	truncs++;",
 	"			{	truncs++;",
 
 
-	"#if !defined(NOREDUCE) && defined(FULLSTACK) && defined(QPROVISO)",
+	"#if !defined(NOREDUCE) && defined(FULLSTACK) && defined(Q_PROVISO)",
 		"#if !defined(QLIST) && !defined(BITSTATE)",
 		"#if !defined(QLIST) && !defined(BITSTATE)",
 	"				if (Lstate && Lstate->tagged) trpt->tau |= 64;",
 	"				if (Lstate && Lstate->tagged) trpt->tau |= 64;",
 		"#else",
 		"#else",
@@ -893,9 +939,11 @@ static char *Code2b[] = {	/* breadth-first search option */
 	"#endif",
 	"#endif",
 	"}",
 	"}",
 	"",
 	"",
+	"Trail *ntrpt;",	/* 4.2.8 */
+	"",
 	"void",
 	"void",
 	"bfs(void)",
 	"bfs(void)",
-	"{	Trans *t; Trail *ntrpt, *otrpt, *x;",
+	"{	Trans *t; Trail *otrpt, *x;",
 	"	uchar _n, _m, ot, nps = 0;",
 	"	uchar _n, _m, ot, nps = 0;",
 	"	int tt, E_state;",
 	"	int tt, E_state;",
 	"	short II, From = (short) (now._nr_pr-1), To = BASE;",
 	"	short II, From = (short) (now._nr_pr-1), To = BASE;",
@@ -1199,13 +1247,15 @@ static char *Code2b[] = {	/* breadth-first search option */
 	"		j = strlen(snap);",
 	"		j = strlen(snap);",
 	"		if (write(fd, snap, j) != j)",
 	"		if (write(fd, snap, j) != j)",
 	"		{       printf(\"pan: error writing %%s\\n\", fnm);",
 	"		{       printf(\"pan: error writing %%s\\n\", fnm);",
-	"			exit(1);",
+	"			pan_exit(1);",
 	"	}	}",
 	"	}	}",
 	"}",
 	"}",
 	"",
 	"",
 	"void",
 	"void",
 	"nuerror(char *str)",
 	"nuerror(char *str)",
 	"{	int fd = make_trail();",
 	"{	int fd = make_trail();",
+	"	int j;",
+	"",
 	"	if (fd < 0) return;",
 	"	if (fd < 0) return;",
 	"#ifdef VERI",
 	"#ifdef VERI",
 	"	sprintf(snap, \"-2:%%d:-2\\n\", VERI);",
 	"	sprintf(snap, \"-2:%%d:-2\\n\", VERI);",
@@ -1217,9 +1267,19 @@ static char *Code2b[] = {	/* breadth-first search option */
 	"#endif",
 	"#endif",
 	"	trcnt = 1;",
 	"	trcnt = 1;",
 	"	putter(trpt, fd);",
 	"	putter(trpt, fd);",
+	"	if (ntrpt->o_t)",	/* 4.2.8 -- Alex example, missing last transition */
+	"	{	sprintf(snap, \"%%d:%%d:%%d\\n\",",
+	"			trcnt++, ntrpt->pr, ntrpt->o_t->t_id);",
+	"		j = strlen(snap);",
+	"		if (write(fd, snap, j) != j)",
+	"		{       printf(\"pan: error writing %%s\\n\", fnm);",
+	"			pan_exit(1);",
+	"	}	}",
 	"	close(fd);",
 	"	close(fd);",
 	"	if (errors >= upto && upto != 0)",
 	"	if (errors >= upto && upto != 0)",
+	"	{",
 	"		wrapup();",
 	"		wrapup();",
+	"	}",
 	"}",
 	"}",
 	"#endif",	/* BFS */
 	"#endif",	/* BFS */
 	0,
 	0,
@@ -1398,7 +1458,7 @@ static char *Code2c[] = {
 	"#endif",
 	"#endif",
 	"	}",
 	"	}",
 	"#ifdef NEGATED_TRACE",
 	"#ifdef NEGATED_TRACE",
-	"	now._event = start_event; /* only 1st try will count */",
+	"	now._event = endevent; /* only 1st try will count -- fixed 4.2.6 */",
 	"#else",	
 	"#else",	
 		"#ifndef BFS",
 		"#ifndef BFS",
 	"	depth++; trpt++;",
 	"	depth++; trpt++;",
@@ -1456,7 +1516,7 @@ static char *Code2c[] = {
 	"stack2disk(void)",
 	"stack2disk(void)",
 	"{",
 	"{",
 	"	if (!stackwrite",
 	"	if (!stackwrite",
-	"	&&  (stackwrite = creat(stackfile, 0666)) < 0)",
+	"	&&  (stackwrite = creat(stackfile, TMODE)) < 0)",
 	"		Uerror(\"cannot create stackfile\");",
 	"		Uerror(\"cannot create stackfile\");",
 	"",
 	"",
 	"	if (write(stackwrite, trail, DDD*sizeof(Trail))",
 	"	if (write(stackwrite, trail, DDD*sizeof(Trail))",
@@ -1563,7 +1623,8 @@ static char *Code2c[] = {
 	"	}",
 	"	}",
 	"AllOver:",
 	"AllOver:",
 	"#if defined(FULLSTACK) && !defined(MA)",
 	"#if defined(FULLSTACK) && !defined(MA)",
-	"	trpt->ostate = (struct H_el *) 0;",
+	"	/* if atomic or rv move, carry forward previous state */",
+	"	trpt->ostate = (trpt-1)->ostate;",	/* was: = (struct H_el *) 0;*/
 	"#endif",
 	"#endif",
 	"#ifdef VERI",
 	"#ifdef VERI",
 	"	if ((trpt->tau&4) || ((trpt-1)->tau&128))",
 	"	if ((trpt->tau&4) || ((trpt-1)->tau&128))",
@@ -1628,8 +1689,22 @@ static char *Code2c[] = {
 		"#endif",
 		"#endif",
 	"#endif",
 	"#endif",
 	"			kk = (II == 1 || II == 2);",
 	"			kk = (II == 1 || II == 2);",
-
+				/* II==0 new state */
+				/* II==1 old state */
+				/* II==2 on current dfs stack */
+				/* II==3 on 1st dfs stack */
 	"#ifndef SAFETY",
 	"#ifndef SAFETY",
+
+	"			if (!fairness && a_cycles)",
+	"			if (II == 2 && ((trpt->o_pm&2) || ((trpt-1)->o_pm&2)))",
+	"			{	II = 3; /* Schwoon & Esparza 2005, Gastin&Moro 2004 */",
+		"#ifdef VERBOSE",
+	"				printf(\"state match on dfs stack\\n\");",
+		"#endif",
+	"				goto same_case;",
+	"			}",
+
+
 		"#if defined(FULLSTACK) && defined(BITSTATE)",
 		"#if defined(FULLSTACK) && defined(BITSTATE)",
 	"			if (!JJ && (now._a_t&1) && depth > A_depth)",
 	"			if (!JJ && (now._a_t&1) && depth > A_depth)",
 	"			{	int oj1 = j1;",
 	"			{	int oj1 = j1;",
@@ -1657,12 +1732,10 @@ static char *Code2c[] = {
 	"			   } else",
 	"			   } else",
 		"#endif",
 		"#endif",
 	"			   {",
 	"			   {",
-		"#ifdef BITSTATE",
-	"				depthfound = Lstate->tagged - 1;",
-		"#else",
-	"				depthfound = depth_of(Lstate);",
+		"#ifndef BITSTATE",
 	"				nShadow--;",
 	"				nShadow--;",
 		"#endif",
 		"#endif",
+	"same_case:			if (Lstate) depthfound = Lstate->D;",
 		"#ifdef NP",
 		"#ifdef NP",
 	"				uerror(\"non-progress cycle\");",
 	"				uerror(\"non-progress cycle\");",
 		"#else",
 		"#else",
@@ -2736,7 +2809,6 @@ static char *Code2c[] = {
 	"#endif",
 	"#endif",
 	"#endif",
 	"#endif",
 
 
-
 	"	signal(SIGINT, SIG_DFL);",
 	"	signal(SIGINT, SIG_DFL);",
 	"	printf(\"(%%s)\\n\", Version);",
 	"	printf(\"(%%s)\\n\", Version);",
 	"	if (!done) printf(\"Warning: Search not completed\\n\");",
 	"	if (!done) printf(\"Warning: Search not completed\\n\");",
@@ -2750,7 +2822,7 @@ static char *Code2c[] = {
 	"	printf(\"	+ Partial Order Reduction\\n\");",
 	"	printf(\"	+ Partial Order Reduction\\n\");",
 	"#endif",
 	"#endif",
 #if 0
 #if 0
-	"#ifdef QPROVISO",
+	"#ifdef Q_PROVISO",
 	"	printf(\"	+ Queue Proviso\\n\");",
 	"	printf(\"	+ Queue Proviso\\n\");",
 	"#endif",
 	"#endif",
 #endif
 #endif
@@ -2925,7 +2997,7 @@ static char *Code2c[] = {
 	"		{	printf(\"\tState-vector as stored = %%.0f byte\",",
 	"		{	printf(\"\tState-vector as stored = %%.0f byte\",",
 	"			(tmp_nr)/(nstates-nShadow) -",
 	"			(tmp_nr)/(nstates-nShadow) -",
 	"			(double) (sizeof(struct H_el) - sizeof(unsigned)));",
 	"			(double) (sizeof(struct H_el) - sizeof(unsigned)));",
-	"			printf(\" + %%d byte overhead\\n\",",
+	"			printf(\" + %%ld byte overhead\\n\",",
 	"			sizeof(struct H_el)-sizeof(unsigned));",
 	"			sizeof(struct H_el)-sizeof(unsigned));",
 	"		}",
 	"		}",
 			"#endif",
 			"#endif",
@@ -2936,8 +3008,9 @@ static char *Code2c[] = {
 			"#endif",
 			"#endif",
 		"#endif",
 		"#endif",
 		"#ifndef BFS",
 		"#ifndef BFS",
-	"		printf(\"%%-6.3f\tmemory used for DFS stack (-m%%d)\\n\",",
+	"		printf(\"%%-6.3f\tmemory used for DFS stack (-m%%ld)\\n\",",
 	"			nr2/1000000., maxdepth);",
 	"			nr2/1000000., maxdepth);",
+	"		remainder = remainder - nr2;",
 		"#endif",
 		"#endif",
 	"		if (remainder - fragment > 0.0)",
 	"		if (remainder - fragment > 0.0)",
 	"		printf(\"%%-6.3f\tother (proc and chan stacks)\\n\",",
 	"		printf(\"%%-6.3f\tother (proc and chan stacks)\\n\",",
@@ -2986,13 +3059,14 @@ static char *Code2c[] = {
 	"stopped(int arg)",
 	"stopped(int arg)",
 	"{	printf(\"Interrupted\\n\");",
 	"{	printf(\"Interrupted\\n\");",
 	"	wrapup();",
 	"	wrapup();",
+	"	pan_exit(0);",
 	"}",
 	"}",
 	"/*",
 	"/*",
 	" * based on Bob Jenkins hash-function from 1996",
 	" * based on Bob Jenkins hash-function from 1996",
 	" * see: http://www.burtleburtle.net/bob/",
 	" * see: http://www.burtleburtle.net/bob/",
 	" */",
 	" */",
 	"",
 	"",
-"#ifdef HASH64",
+"#if defined(HASH64) || defined(WIN64)",
 	/* 64-bit Jenkins hash: http://burtleburtle.net/bob/c/lookup8.c */
 	/* 64-bit Jenkins hash: http://burtleburtle.net/bob/c/lookup8.c */
 	"#define mix(a,b,c) \\",
 	"#define mix(a,b,c) \\",
 	"{ a -= b; a -= c; a ^= (c>>43); \\",
 	"{ a -= b; a -= c; a ^= (c>>43); \\",
@@ -3148,6 +3222,7 @@ static char *Code2c[] = {
 	"		case 'P': readtrail = 1; onlyproc = atoi(&argv[1][2]); break;",
 	"		case 'P': readtrail = 1; onlyproc = atoi(&argv[1][2]); break;",
 	"		case 'C': coltrace = 1; goto samething;",
 	"		case 'C': coltrace = 1; goto samething;",
 	"		case 'g': gui = 1; goto samething;",
 	"		case 'g': gui = 1; goto samething;",
+	"		case 'S': silent = 1; break;",
 	"#endif",
 	"#endif",
 	"		case 'R': Nrun = atoi(&argv[1][2]); break;",
 	"		case 'R': Nrun = atoi(&argv[1][2]); break;",
 	"#ifdef BITSTATE",
 	"#ifdef BITSTATE",
@@ -3161,10 +3236,20 @@ static char *Code2c[] = {
 	"		case 'w': ssize = atoi(&argv[1][2]); break;",
 	"		case 'w': ssize = atoi(&argv[1][2]); break;",
 	"		case 'Y': signoff = 1; break;",
 	"		case 'Y': signoff = 1; break;",
 	"		case 'X': efd = stdout; break;",
 	"		case 'X': efd = stdout; break;",
-	"		default : usage(efd); break;",
+	"		default : fprintf(efd, \"saw option -%%c\\n\", argv[1][1]); usage(efd); break;",
 	"		}",
 	"		}",
 	"		argc--; argv++;",
 	"		argc--; argv++;",
 	"	}",
 	"	}",
+	"	if (iterative && TMODE != 0666)",
+	"	{	TMODE = 0666;",
+	"		fprintf(efd, \"warning: -T ignored when -i or -I is used\\n\");",
+	"	}",
+	"#if defined(WIN32) || defined(WIN64)",
+	"	if (TMODE == 0666)",
+	"		TMODE = _S_IWRITE | _S_IREAD;",
+	"	else",
+	"		TMODE = _S_IREAD;",
+	"#endif",
 	"#ifdef OHASH",
 	"#ifdef OHASH",
 	"	fprintf(efd, \"warning: -DOHASH no longer supported (directive ignored)\\n\");",
 	"	fprintf(efd, \"warning: -DOHASH no longer supported (directive ignored)\\n\");",
 	"#endif",
 	"#endif",
@@ -3208,10 +3293,6 @@ static char *Code2c[] = {
 	"	}",
 	"	}",
 
 
 	"#endif",
 	"#endif",
-	"	if (iterative && TMODE != 0666)",
-	"	{	TMODE = 0666;",
-	"		fprintf(efd, \"warning: -T ignored when -i or -I is used\\n\");",
-	"	}",
 	"#ifdef SC",
 	"#ifdef SC",
 	"	hiwater = HHH = maxdepth-10;",
 	"	hiwater = HHH = maxdepth-10;",
 	"	DDD = HHH/2;",
 	"	DDD = HHH/2;",
@@ -3375,14 +3456,18 @@ static char *Code2c[] = {
 	"#endif",
 	"#endif",
 
 
 	"#if SYNC>0 && !defined(NOREDUCE)",
 	"#if SYNC>0 && !defined(NOREDUCE)",
-	"#ifdef HAS_UNLESS",
+		"#ifdef HAS_UNLESS",
 	"	fprintf(efd, \"warning: use of a rendezvous stmnts in the escape\\n\");",
 	"	fprintf(efd, \"warning: use of a rendezvous stmnts in the escape\\n\");",
 	"	fprintf(efd, \"\tof an unless clause, if present, could make p.o. reduction\\n\");",
 	"	fprintf(efd, \"\tof an unless clause, if present, could make p.o. reduction\\n\");",
 	"	fprintf(efd, \"\tinvalid (use -DNOREDUCE to avoid this)\\n\");",
 	"	fprintf(efd, \"\tinvalid (use -DNOREDUCE to avoid this)\\n\");",
-	"#ifdef BFS",
+			"#ifdef BFS",
 	"	fprintf(efd, \"\t(this type of rv is also not compatible with -DBFS)\\n\");",
 	"	fprintf(efd, \"\t(this type of rv is also not compatible with -DBFS)\\n\");",
+			"#endif",
+		"#endif",
 	"#endif",
 	"#endif",
-	"#endif",
+	"#if SYNC>0 && defined(BFS)",
+	"	fprintf(efd, \"warning: use of rendezvous in BFS mode \");",
+	"	fprintf(efd, \"does not preserve all invalid endstates\\n\");",
 	"#endif",
 	"#endif",
 	"#if !defined(REACH) && !defined(BITSTATE)",
 	"#if !defined(REACH) && !defined(BITSTATE)",
 	"	if (iterative != 0 && a_cycles == 0)",
 	"	if (iterative != 0 && a_cycles == 0)",
@@ -3467,7 +3552,7 @@ static char *Code2c[] = {
 	"		nmask = mask;",
 	"		nmask = mask;",
 	"#endif",
 	"#endif",
 	"	} else if (WS != 4)",
 	"	} else if (WS != 4)",
-	"	{	fprintf(stderr, \"pan: wordsize %%d not supported\\n\", WS);",
+	"	{	fprintf(stderr, \"pan: wordsize %%ld not supported\\n\", WS);",
 	"		exit(1);",
 	"		exit(1);",
 	"	} else	/* WS == 4 and ssize < 32 */",
 	"	} else	/* WS == 4 and ssize < 32 */",
 	"	{	mask = ((1L<<ssize)-1);	/* hash init */",
 	"	{	mask = ((1L<<ssize)-1);	/* hash init */",
@@ -3564,6 +3649,7 @@ static char *Code2c[] = {
 	"	fprintf(fd, \"\t-C  read and execute trail - columnated output (can add -v,-n)\\n\");",
 	"	fprintf(fd, \"\t-C  read and execute trail - columnated output (can add -v,-n)\\n\");",
 	"	fprintf(fd, \"\t-PN read and execute trail - restrict trail output to proc N\\n\");",
 	"	fprintf(fd, \"\t-PN read and execute trail - restrict trail output to proc N\\n\");",
 	"	fprintf(fd, \"\t-g  read and execute trail + msc gui support\\n\");",
 	"	fprintf(fd, \"\t-g  read and execute trail + msc gui support\\n\");",
+	"	fprintf(fd, \"\t-S  silent replay: only user defined printfs show\\n\");",
 	"#endif",
 	"#endif",
 	"#ifdef BITSTATE",
 	"#ifdef BITSTATE",
 	"	fprintf(fd, \"\t-RN repeat run Nx with N \");",
 	"	fprintf(fd, \"\t-RN repeat run Nx with N \");",
@@ -3574,9 +3660,9 @@ static char *Code2c[] = {
 	"	fprintf(fd, \"\t-tsuf replace .trail with .suf on trailfiles\\n\");",
 	"	fprintf(fd, \"\t-tsuf replace .trail with .suf on trailfiles\\n\");",
 	"	fprintf(fd, \"\t-V  print SPIN version number\\n\");",
 	"	fprintf(fd, \"\t-V  print SPIN version number\\n\");",
 	"	fprintf(fd, \"\t-v  verbose -- filenames in unreached state listing\\n\");",
 	"	fprintf(fd, \"\t-v  verbose -- filenames in unreached state listing\\n\");",
-	"	fprintf(fd, \"\t-wN hashtable of 2^N entries\");",
+	"	fprintf(fd, \"\t-wN hashtable of 2^N entries \");",
 	"	fprintf(fd, \"(defaults to -w%%d)\\n\", ssize);",
 	"	fprintf(fd, \"(defaults to -w%%d)\\n\", ssize);",
-	"	pan_exit(1);",
+	"	exit(1);",
 	"}",
 	"}",
 	"",
 	"",
 	"char *",
 	"char *",
@@ -3782,7 +3868,7 @@ static char *Code2c[] = {
 	"",
 	"",
 	"	if (unwinding) return; /* 1.4.2 */",
 	"	if (unwinding) return; /* 1.4.2 */",
 	"	if (strncmp(str, laststr, 254))",
 	"	if (strncmp(str, laststr, 254))",
-	"	printf(\"pan: %%s (at depth %%d)\\n\", str,",
+	"	printf(\"pan: %%s (at depth %%ld)\\n\", str,",
 	"		(depthfound==-1)?depth:depthfound);",
 	"		(depthfound==-1)?depth:depthfound);",
 	"	strncpy(laststr, str, 254);",
 	"	strncpy(laststr, str, 254);",
 	"	errors++;",
 	"	errors++;",
@@ -3827,7 +3913,7 @@ static char *Code2c[] = {
 	"	if (iterative != 0 && maxdepth > 0)",
 	"	if (iterative != 0 && maxdepth > 0)",
 	"	{	maxdepth = (iterative == 1)?(depth-1):(depth/2);",
 	"	{	maxdepth = (iterative == 1)?(depth-1):(depth/2);",
 	"		warned = 1;",
 	"		warned = 1;",
-	"		printf(\"pan: reducing search depth to %%d\\n\",",
+	"		printf(\"pan: reducing search depth to %%ld\\n\",",
 	"			maxdepth);",
 	"			maxdepth);",
 	"	} else",
 	"	} else",
 "#endif",
 "#endif",
@@ -3837,7 +3923,7 @@ static char *Code2c[] = {
 	"}\n",
 	"}\n",
 	"int",
 	"int",
 	"xrefsrc(int lno, S_F_MAP *mp, int M, int i)",
 	"xrefsrc(int lno, S_F_MAP *mp, int M, int i)",
-	"{	Trans *T; int j;",
+	"{	Trans *T; int j, retval=1;",
 	"	for (T = trans[M][i]; T; T = T->nxt)",
 	"	for (T = trans[M][i]; T; T = T->nxt)",
 	"	if (T && T->tp)",
 	"	if (T && T->tp)",
 	"	{	if (strcmp(T->tp, \".(goto)\") == 0",
 	"	{	if (strcmp(T->tp, \".(goto)\") == 0",
@@ -3855,12 +3941,13 @@ static char *Code2c[] = {
 	"		if (strcmp(T->tp, \"\") != 0)",
 	"		if (strcmp(T->tp, \"\") != 0)",
 	"		{	char *q;",
 	"		{	char *q;",
 	"			q = transmognify(T->tp);",
 	"			q = transmognify(T->tp);",
-	"			printf(\", \\\"%%s\\\"\", q);",
+	"			printf(\", \\\"%%s\\\"\", q?q:\"\");",
 	"		} else if (stopstate[M][i])",
 	"		} else if (stopstate[M][i])",
 	"			printf(\", -end state-\");",
 	"			printf(\", -end state-\");",
 	"		printf(\"\\n\");",
 	"		printf(\"\\n\");",
+	"		retval = 0; /* reported */",
 	"	}",
 	"	}",
-	"	return 0;",
+	"	return retval;",
 	"}\n",
 	"}\n",
 	"void",
 	"void",
 	"r_ck(uchar *which, int N, int M, short *src, S_F_MAP *mp)",
 	"r_ck(uchar *which, int N, int M, short *src, S_F_MAP *mp)",
@@ -3886,7 +3973,9 @@ static char *Code2c[] = {
 	"putrail(void)",
 	"putrail(void)",
 	"{	int fd; long i, j;",
 	"{	int fd; long i, j;",
 	"	Trail *trl;",
 	"	Trail *trl;",
+	"#if defined VERI || defined(MERGED)",
 	"	char snap[64];",
 	"	char snap[64];",
+	"#endif",
 	"",
 	"",
 	"	fd = make_trail();",
 	"	fd = make_trail();",
 	"	if (fd < 0) return;",
 	"	if (fd < 0) return;",
@@ -3904,7 +3993,7 @@ static char *Code2c[] = {
 	"		trl = getframe(i);",
 	"		trl = getframe(i);",
 	"		if (!trl->o_t) continue;",
 	"		if (!trl->o_t) continue;",
 	"		if (trl->o_pm&128) continue;",
 	"		if (trl->o_pm&128) continue;",
-	"		sprintf(snap, \"%%d:%%d:%%d\\n\", ",
+	"		sprintf(snap, \"%%ld:%%d:%%d\\n\", ",
 	"			i, trl->pr, trl->o_t->t_id);",
 	"			i, trl->pr, trl->o_t->t_id);",
 	"		j = strlen(snap);",
 	"		j = strlen(snap);",
 	"		if (write(fd, snap, j) != j)",
 	"		if (write(fd, snap, j) != j)",
@@ -3970,7 +4059,7 @@ static char *Code2c[] = {
 	"p_restor(int h)",
 	"p_restor(int h)",
 	"{	int i; char *z = (char *) &now;\n",
 	"{	int i; char *z = (char *) &now;\n",
 	"	proc_offset[h] = stack->o_offset;",
 	"	proc_offset[h] = stack->o_offset;",
-	"	proc_skip[h]   = stack->o_skip;",
+	"	proc_skip[h]   = (uchar) stack->o_skip;",
 	"#ifndef XUSAFE",
 	"#ifndef XUSAFE",
 	"	p_name[h] = stack->o_name;",
 	"	p_name[h] = stack->o_name;",
 	"#endif",
 	"#endif",
@@ -4009,7 +4098,7 @@ static char *Code2c[] = {
 	"	int k, k_end;",
 	"	int k, k_end;",
 	"#endif",
 	"#endif",
 	"	q_offset[now._nr_qs] = stack->o_offset;",
 	"	q_offset[now._nr_qs] = stack->o_offset;",
-	"	q_skip[now._nr_qs]   = stack->o_skip;",
+	"	q_skip[now._nr_qs]   = (uchar) stack->o_skip;",
 	"#ifndef XUSAFE",
 	"#ifndef XUSAFE",
 	"	q_name[now._nr_qs]   = stack->o_name;",
 	"	q_name[now._nr_qs]   = stack->o_name;",
 	"#endif",
 	"#endif",
@@ -4092,7 +4181,11 @@ static char *Code2c[] = {
 	"		}",
 	"		}",
 	"		stack = stack->nxt;",
 	"		stack = stack->nxt;",
 	"		stack->o_offset = proc_offset[h];",
 	"		stack->o_offset = proc_offset[h];",
-	"		stack->o_skip   = proc_skip[h];",
+	"#if VECTORSZ>32000",
+	"		stack->o_skip   = (int) proc_skip[h];",
+	"#else",
+	"		stack->o_skip   = (short) proc_skip[h];",
+	"#endif",
 	"#ifndef XUSAFE",
 	"#ifndef XUSAFE",
 	"		stack->o_name   = p_name[h];",
 	"		stack->o_name   = p_name[h];",
 	"#endif",
 	"#endif",
@@ -4103,7 +4196,7 @@ static char *Code2c[] = {
 	"	vsize = proc_offset[h];",
 	"	vsize = proc_offset[h];",
 	"	now._nr_pr = now._nr_pr - 1;",
 	"	now._nr_pr = now._nr_pr - 1;",
 	"	memset((char *)pptr(h), 0, d);",
 	"	memset((char *)pptr(h), 0, d);",
-	"	vsize -= proc_skip[h];",
+	"	vsize -= (int) proc_skip[h];",
 	"#ifndef NOVSZ",
 	"#ifndef NOVSZ",
 	"	now._vsz = vsize;",
 	"	now._vsz = vsize;",
 	"#endif",
 	"#endif",
@@ -4131,7 +4224,11 @@ static char *Code2c[] = {
 	"		}",
 	"		}",
 	"		stack = stack->nxt;",
 	"		stack = stack->nxt;",
 	"		stack->o_offset = q_offset[h];",
 	"		stack->o_offset = q_offset[h];",
-	"		stack->o_skip   = q_skip[h];",
+	"#if VECTORSZ>32000",
+	"		stack->o_skip   = (int) q_skip[h];",
+	"#else",
+	"		stack->o_skip   = (short) q_skip[h];",
+	"#endif",
 	"#ifndef XUSAFE",
 	"#ifndef XUSAFE",
 	"		stack->o_name   = q_name[h];",
 	"		stack->o_name   = q_name[h];",
 	"#endif",
 	"#endif",
@@ -4141,7 +4238,7 @@ static char *Code2c[] = {
 	"	vsize = q_offset[h];",
 	"	vsize = q_offset[h];",
 	"	now._nr_qs = now._nr_qs - 1;",
 	"	now._nr_qs = now._nr_qs - 1;",
 	"	memset((char *)qptr(h), 0, d);",
 	"	memset((char *)qptr(h), 0, d);",
-	"	vsize -= q_skip[h];",
+	"	vsize -= (int) q_skip[h];",
 	"#ifndef NOVSZ",
 	"#ifndef NOVSZ",
 	"	now._vsz = vsize;",
 	"	now._vsz = vsize;",
 	"#endif",
 	"#endif",
@@ -4218,7 +4315,6 @@ static char *Code2c[] = {
 	"	memcpy((char *)&A_Root, (char *)&now, vsize);",
 	"	memcpy((char *)&A_Root, (char *)&now, vsize);",
 	"	A_depth = depthfound = depth;",
 	"	A_depth = depthfound = depth;",
 	"	new_state();	/* start 2nd DFS */",
 	"	new_state();	/* start 2nd DFS */",
-
 	"	now._a_t = o_a_t;",
 	"	now._a_t = o_a_t;",
 	"#ifndef NOFAIR",
 	"#ifndef NOFAIR",
 	"	now._cnt[1] = o_cnt;",
 	"	now._cnt[1] = o_cnt;",
@@ -4240,13 +4336,7 @@ static char *Code2c[] = {
 	"struct H_el *Free_list = (struct H_el *) 0;",
 	"struct H_el *Free_list = (struct H_el *) 0;",
 	"void",
 	"void",
 	"onstack_init(void)	/* to store stack states in a bitstate search */",
 	"onstack_init(void)	/* to store stack states in a bitstate search */",
-	"{	S_Tab = (struct H_el **)",
-#if 0
-	"		emalloc((1L<<(ssize-3))*sizeof(struct H_el *));",
-			/* can lead to excessive memory use */
-#else
-	"		emalloc(maxdepth*sizeof(struct H_el *));",
-#endif
+	"{	S_Tab = (struct H_el **) emalloc(maxdepth*sizeof(struct H_el *));",
 	"}",
 	"}",
 	"struct H_el *",
 	"struct H_el *",
 	"grab_state(int n)",
 	"grab_state(int n)",
@@ -4582,7 +4672,7 @@ static char *Code2c[] = {
 	"	for (w = Free_list; w; Fa++, last=w, w = w->nxt)",
 	"	for (w = Free_list; w; Fa++, last=w, w = w->nxt)",
 	"	{	if ((int) w->tagged <= n)",
 	"	{	if ((int) w->tagged <= n)",
 	"		{	if (last)",
 	"		{	if (last)",
-	"			{	v->nxt = w->nxt;",
+	"			{	v->nxt = w; /* was: v->nxt = w->nxt; */",
 	"				last->nxt = v;",
 	"				last->nxt = v;",
 	"			} else",
 	"			} else",
 	"			{	v->nxt = Free_list;",
 	"			{	v->nxt = Free_list;",
@@ -4635,7 +4725,7 @@ static char *Code2c[] = {
 	"	for (tmp = S_Tab[j1]; tmp; Zn++, tmp = tmp->nxt)",
 	"	for (tmp = S_Tab[j1]; tmp; Zn++, tmp = tmp->nxt)",
 	"	{	m = memcmp(((char *)&(tmp->state)),v,n);",
 	"	{	m = memcmp(((char *)&(tmp->state)),v,n);",
 	"		if (m <= 0)",
 	"		if (m <= 0)",
-	"		{	Lstate = tmp;",
+	"		{	Lstate = (struct H_el *) tmp;",
 	"			break;",
 	"			break;",
 	"	}	}",
 	"	}	}",
 	"	PROBE++;",
 	"	PROBE++;",
@@ -4787,6 +4877,9 @@ static char *Code2c[] = {
 	"hstore(char *vin, int nin)	/* hash table storage */",
 	"hstore(char *vin, int nin)	/* hash table storage */",
 	"{	struct H_el *tmp, *ntmp, *olst = (struct H_el *) 0;",
 	"{	struct H_el *tmp, *ntmp, *olst = (struct H_el *) 0;",
 	"	char *v; int n, m=0;",
 	"	char *v; int n, m=0;",
+	"#ifdef HC",
+	"	uchar rem_a;",
+	"#endif",
 	"#ifdef NOCOMP",	/* defined by BITSTATE */
 	"#ifdef NOCOMP",	/* defined by BITSTATE */
 		"#if defined(BITSTATE) && defined(LC)",
 		"#if defined(BITSTATE) && defined(LC)",
 	"	if (S_Tab == H_tab)",
 	"	if (S_Tab == H_tab)",
@@ -4800,7 +4893,14 @@ static char *Code2c[] = {
 		"#endif",
 		"#endif",
 	"#else",
 	"#else",
 	"	v = (char *) &comp_now;",
 	"	v = (char *) &comp_now;",
+	"	#ifdef HC",
+	"	rem_a = now._a_t;",	/* 4.3.0 */
+	"	now._a_t = 0;",	/* for hashing/state matching to work right */
+	"	#endif",
 	"	n = compress(vin, nin);", /* with HC, this calls s_hash */
 	"	n = compress(vin, nin);", /* with HC, this calls s_hash */
+	"	#ifdef HC",
+	"	now._a_t = rem_a;",	/* 4.3.0 */
+	"	#endif",
 		"#ifndef SAFETY",
 		"#ifndef SAFETY",
 	"	if (S_A)",
 	"	if (S_A)",
 	"	{	v[0] = 0;	/* _a_t  */",
 	"	{	v[0] = 0;	/* _a_t  */",
@@ -4874,7 +4974,7 @@ static char *Code2c[] = {
 	"#ifdef FULLSTACK",
 	"#ifdef FULLSTACK",
 		"#ifndef SAFETY",	/* or else wasnew == 0 */
 		"#ifndef SAFETY",	/* or else wasnew == 0 */
 	"		if (wasnew)",
 	"		if (wasnew)",
-	"		{	Lstate = tmp;",
+	"		{	Lstate = (struct H_el *) tmp;",
 	"			tmp->tagged |= V_A;",
 	"			tmp->tagged |= V_A;",
 	"			if ((now._a_t&1)",
 	"			if ((now._a_t&1)",
 	"			&& (tmp->tagged&A_V)",
 	"			&& (tmp->tagged&A_V)",
@@ -4897,7 +4997,7 @@ static char *Code2c[] = {
 	"		} else",
 	"		} else",
 		"#endif",
 		"#endif",
 	"		if ((S_A)?(tmp->tagged&V_A):tmp->tagged)",
 	"		if ((S_A)?(tmp->tagged&V_A):tmp->tagged)",
-	"		{	Lstate = tmp;",
+	"		{	Lstate = (struct H_el *) tmp;",
 		"#ifndef SAFETY",
 		"#ifndef SAFETY",
 	"			/* already on current dfs stack */",
 	"			/* already on current dfs stack */",
 	"			/* but may also be on 1st dfs stack */",
 	"			/* but may also be on 1st dfs stack */",
@@ -4962,8 +5062,8 @@ static char *Code2c[] = {
 	"			return 0;",
 	"			return 0;",
 	"		}",
 	"		}",
 	"#endif",
 	"#endif",
-	"#if defined(BFS) && defined(QPROVISO)",
-	"		Lstate = tmp;",
+	"#if defined(BFS) && defined(Q_PROVISO)",
+	"		Lstate = (struct H_el *) tmp;",
 	"#endif",
 	"#endif",
 	"		return 1; /* match outside stack */",
 	"		return 1; /* match outside stack */",
 	"	       } else if (m < 0)",
 	"	       } else if (m < 0)",
@@ -4994,7 +5094,7 @@ static char *Code2c[] = {
 	"	printf(\"	New state %%d\\n\", (int) nstates);",
 	"	printf(\"	New state %%d\\n\", (int) nstates);",
 		"#endif",
 		"#endif",
 	"#endif",
 	"#endif",
-	"#ifdef REACH",
+	"#if !defined(SAFETY) || defined(REACH)",
 	"	tmp->D = depth;",
 	"	tmp->D = depth;",
 	"#endif",
 	"#endif",
 	"#ifndef SAFETY",
 	"#ifndef SAFETY",
@@ -5022,7 +5122,7 @@ static char *Code2c[] = {
 		"#ifdef DEBUG",
 		"#ifdef DEBUG",
 	"	dumpstate(-1, v, n, tmp->tagged);",
 	"	dumpstate(-1, v, n, tmp->tagged);",
 		"#endif",
 		"#endif",
-	"	Lstate = tmp;",
+	"	Lstate = (struct H_el *) tmp;",
 	"#else",
 	"#else",
 		"#ifdef DEBUG",
 		"#ifdef DEBUG",
 	"	dumpstate(-1, v, n, 0);",
 	"	dumpstate(-1, v, n, 0);",

+ 66 - 16
sys/src/cmd/spin/pangen2.c

@@ -11,11 +11,7 @@
 
 
 #include "spin.h"
 #include "spin.h"
 #include "version.h"
 #include "version.h"
-#ifdef PC
-#include "y_tab.h"
-#else
 #include "y.tab.h"
 #include "y.tab.h"
-#endif
 #include "pangen2.h"
 #include "pangen2.h"
 #include "pangen4.h"
 #include "pangen4.h"
 #include "pangen5.h"
 #include "pangen5.h"
@@ -186,15 +182,15 @@ gensrc(void)
 	fprintf(th, "#define uint	unsigned int\n");
 	fprintf(th, "#define uint	unsigned int\n");
 	fprintf(th, "#endif\n");
 	fprintf(th, "#endif\n");
 
 
-	if (sizeof(long) > 4)	/* 64 bit machine */
+	if (sizeof(void *) > 4)	/* 64 bit machine */
 	{	fprintf(th, "#ifndef HASH32\n");
 	{	fprintf(th, "#ifndef HASH32\n");
 		fprintf(th, "#define HASH64\n");
 		fprintf(th, "#define HASH64\n");
 		fprintf(th, "#endif\n");
 		fprintf(th, "#endif\n");
 	}
 	}
-
+#if 0
 	if (sizeof(long)==sizeof(int))
 	if (sizeof(long)==sizeof(int))
 		fprintf(th, "#define long	int\n");
 		fprintf(th, "#define long	int\n");
-
+#endif
 	if (separate == 1 && !claimproc)
 	if (separate == 1 && !claimproc)
 	{	Symbol *n = (Symbol *) emalloc(sizeof(Symbol));
 	{	Symbol *n = (Symbol *) emalloc(sizeof(Symbol));
 		Sequence *s = (Sequence *) emalloc(sizeof(Sequence));
 		Sequence *s = (Sequence *) emalloc(sizeof(Sequence));
@@ -314,6 +310,8 @@ doless:
 
 
 	if (separate != 2)
 	if (separate != 2)
 		ntimes(tc, 0, 1, Preamble);
 		ntimes(tc, 0, 1, Preamble);
+	else
+		fprintf(tc, "extern int verbose; extern long depth;\n");
 
 
 	fprintf(tc, "#ifndef NOBOUNDCHECK\n");
 	fprintf(tc, "#ifndef NOBOUNDCHECK\n");
 	fprintf(tc, "#define Index(x, y)\tBoundcheck(x, y, II, tt, t)\n");
 	fprintf(tc, "#define Index(x, y)\tBoundcheck(x, y, II, tt, t)\n");
@@ -408,6 +406,7 @@ doless:
 	for (p = rdy; p; p = p->nxt)
 	for (p = rdy; p; p = p->nxt)
 		putproc(p);
 		putproc(p);
 
 
+
 	if (separate != 2)
 	if (separate != 2)
 	{	fprintf(th, "struct {\n");
 	{	fprintf(th, "struct {\n");
 		fprintf(th, "	int tp; short *src;\n");
 		fprintf(th, "	int tp; short *src;\n");
@@ -417,6 +416,9 @@ doless:
 				p->tn, p->tn);
 				p->tn, p->tn);
 		fprintf(th, "	{ 0, (short *) 0 }\n");
 		fprintf(th, "	{ 0, (short *) 0 }\n");
 		fprintf(th, "};\n");
 		fprintf(th, "};\n");
+		fprintf(th, "short *frm_st0;\n");	/* records src states for transitions in never claim */
+	} else
+	{	fprintf(th, "extern short *frm_st0;\n");
 	}
 	}
 
 
 	gencodetable(th);
 	gencodetable(th);
@@ -472,8 +474,12 @@ doless:
 		fprintf(th, "#define REVERSE_MOVES\t\"pan_t.b\"\n");
 		fprintf(th, "#define REVERSE_MOVES\t\"pan_t.b\"\n");
 		fprintf(th, "#define TRANSITIONS\t\"pan_t.t\"\n");
 		fprintf(th, "#define TRANSITIONS\t\"pan_t.t\"\n");
 		fprintf(tc, "extern int Maxbody;\n");
 		fprintf(tc, "extern int Maxbody;\n");
+		fprintf(tc, "#if VECTORSZ>32000\n");
 		fprintf(tc, "extern int proc_offset[];\n");
 		fprintf(tc, "extern int proc_offset[];\n");
-		fprintf(tc, "extern int proc_skip[];\n");
+		fprintf(tc, "#else\n");
+		fprintf(tc, "extern short proc_offset[];\n");
+		fprintf(tc, "#endif\n");
+		fprintf(tc, "extern uchar proc_skip[];\n");
 		fprintf(tc, "extern uchar *reached[];\n");
 		fprintf(tc, "extern uchar *reached[];\n");
 		fprintf(tc, "extern uchar *accpstate[];\n");
 		fprintf(tc, "extern uchar *accpstate[];\n");
 		fprintf(tc, "extern uchar *progstate[];\n");
 		fprintf(tc, "extern uchar *progstate[];\n");
@@ -714,7 +720,12 @@ putproc(ProcList *p)
 	if (Pid == claimnr
 	if (Pid == claimnr
 	&&  separate == 1)
 	&&  separate == 1)
 	{	fprintf(th, "extern uchar reached%d[];\n", Pid);
 	{	fprintf(th, "extern uchar reached%d[];\n", Pid);
+#if 0
 		fprintf(th, "extern short nstates%d;\n", Pid);
 		fprintf(th, "extern short nstates%d;\n", Pid);
+#else
+		fprintf(th, "\n#define nstates%d	%d\t/* %s */\n",
+			Pid, p->s->maxel, p->n->name);
+#endif
 		fprintf(th, "extern short src_ln%d[];\n", Pid);
 		fprintf(th, "extern short src_ln%d[];\n", Pid);
 		fprintf(th, "extern S_F_MAP src_file%d[];\n", Pid);
 		fprintf(th, "extern S_F_MAP src_file%d[];\n", Pid);
 		fprintf(th, "#define endstate%d	%d\n",
 		fprintf(th, "#define endstate%d	%d\n",
@@ -731,7 +742,7 @@ putproc(ProcList *p)
 
 
 	AllGlobal = (p->prov)?1:0;	/* process has provided clause */
 	AllGlobal = (p->prov)?1:0;	/* process has provided clause */
 
 
-	fprintf(th, "\nshort nstates%d=%d;\t/* %s */\n",
+	fprintf(th, "\n#define nstates%d	%d\t/* %s */\n",
 		Pid, p->s->maxel, p->n->name);
 		Pid, p->s->maxel, p->n->name);
 	if (Pid == claimnr)
 	if (Pid == claimnr)
 	fprintf(th, "#define nstates_claim	nstates%d\n", Pid);
 	fprintf(th, "#define nstates_claim	nstates%d\n", Pid);
@@ -826,7 +837,8 @@ hidden(Lextok *n)
 static int
 static int
 getNid(Lextok *n)
 getNid(Lextok *n)
 {
 {
-	if (n->sym->type == STRUCT
+	if (n->sym
+	&&  n->sym->type == STRUCT
 	&&  n->rgt && n->rgt->lft)
 	&&  n->rgt && n->rgt->lft)
 		return getNid(n->rgt->lft);
 		return getNid(n->rgt->lft);
 
 
@@ -1470,6 +1482,22 @@ case_cache(Element *e, int a)
 	memset(CnT, 0, sizeof(CnT));
 	memset(CnT, 0, sizeof(CnT));
 	YZmax = YZcnt = 0;
 	YZmax = YZcnt = 0;
 
 
+/* NEW 4.2.6 */
+	if (Pid == claimnr)
+	{
+		fprintf(tm, "\n#if defined(VERI) && !defined(NP)\n\t\t");
+		fprintf(tm, "{	static int reported%d = 0;\n\t\t", e->seqno);
+		/* source state changes in retrans and must be looked up in frm_st0[t->forw] */
+		fprintf(tm, "	if (verbose && !reported%d)\n\t\t", e->seqno);
+		fprintf(tm, "	{	printf(\"depth %%d: Claim reached state %%d (line %%d)\\n\",\n\t\t");
+		fprintf(tm, "			depth, frm_st0[t->forw], src_claim[%d]);\n\t\t", e->seqno);
+		fprintf(tm, "		reported%d = 1;\n\t\t", e->seqno);
+		fprintf(tm, "		fflush(stdout);\n\t\t");
+		fprintf(tm, "}	}\n");
+		fprintf(tm, "#endif\n\t\t");
+	}
+/* end */
+
 	/* the src xrefs have the numbers in e->seqno builtin */
 	/* the src xrefs have the numbers in e->seqno builtin */
 	fprintf(tm, "reached[%d][%d] = 1;\n\t\t", Pid, e->seqno);
 	fprintf(tm, "reached[%d][%d] = 1;\n\t\t", Pid, e->seqno);
 
 
@@ -1838,7 +1866,9 @@ find_target(Element *e)
 		break;
 		break;
 	case BREAK:
 	case BREAK:
 		if (e->nxt)
 		if (e->nxt)
-		f = find_target(huntele(e->nxt, e->status, -1));
+		{	f = find_target(huntele(e->nxt, e->status, -1));
+			break;	/* 4.3.0 -- was missing */
+		}
 		/* else fall through */
 		/* else fall through */
 	default:
 	default:
 		f = e;
 		f = e;
@@ -1867,13 +1897,19 @@ scan_seq(Sequence *s)
 		||  has_global(f->n))
 		||  has_global(f->n))
 			return 1;
 			return 1;
 		if (f->n->ntyp == GOTO)	/* may reach other atomic */
 		if (f->n->ntyp == GOTO)	/* may reach other atomic */
-		{	g = target(f);
+		{
+#if 0
+			/* if jumping from an atomic without globals into
+			 * one with globals, this does the wrong thing
+			 * example by Claus Traulsen, 22 June 2007
+			 */
+			g = target(f);
 			if (g
 			if (g
 			&& !(f->status & L_ATOM)
 			&& !(f->status & L_ATOM)
 			&& !(g->status & (ATOM|L_ATOM)))
 			&& !(g->status & (ATOM|L_ATOM)))
-			{	fprintf(tt, "	/* goto mark-down, ");
-				fprintf(tt, "line %d - %d */\n",
-					f->n->ln, (g->n)?g->n->ln:0);
+#endif
+			{	fprintf(tt, "	/* mark-down line %d */\n",
+					f->n->ln);
 				return 1; /* assume worst case */
 				return 1; /* assume worst case */
 		}	}
 		}	}
 		for (h = f->sub; h; h = h->nxt)
 		for (h = f->sub; h; h = h->nxt)
@@ -2055,9 +2091,10 @@ putstmnt(FILE *fd, Lextok *now, int m)
 		for (v = now->lft, i = 0; v; v = v->rgt, i++)
 		for (v = now->lft, i = 0; v; v = v->rgt, i++)
 		{	cat2(", ", v->lft);
 		{	cat2(", ", v->lft);
 		}
 		}
+		check_param_count(i, now);
 
 
 		if (i > Npars)
 		if (i > Npars)
-		{	printf("	%d parameters used, %d expected\n", i, Npars);
+		{	printf("\t%d parameters used, max %d expected\n", i, Npars);
 			fatal("too many parameters in run %s(...)",
 			fatal("too many parameters in run %s(...)",
 			now->sym->name);
 			now->sym->name);
 		}
 		}
@@ -2703,7 +2740,11 @@ putstmnt(FILE *fd, Lextok *now, int m)
 	case C_EXPR:
 	case C_EXPR:
 		fprintf(fd, "(");
 		fprintf(fd, "(");
 		plunk_expr(fd, now->sym->name);
 		plunk_expr(fd, now->sym->name);
+#if 1
+		fprintf(fd, ")");
+#else
 		fprintf(fd, ") /* %s */ ", now->sym->name);
 		fprintf(fd, ") /* %s */ ", now->sym->name);
+#endif
 		break;
 		break;
 
 
 	case C_CODE:
 	case C_CODE:
@@ -2944,3 +2985,12 @@ count_runs(Lextok *n)
 	if (runcount == 1 && opcount > 1)
 	if (runcount == 1 && opcount > 1)
 		fatal("use of run operator in compound expression", "");
 		fatal("use of run operator in compound expression", "");
 }
 }
+
+void
+any_runs(Lextok *n)
+{
+	runcount = opcount = 0;
+	do_count(n, 0);
+	if (runcount >= 1)
+		fatal("run operator used in invalid context", "");
+}

+ 37 - 22
sys/src/cmd/spin/pangen2.h

@@ -34,18 +34,22 @@ static char *Pre0[] = {
 	"#include <string.h>",
 	"#include <string.h>",
 	"#include <ctype.h>",
 	"#include <ctype.h>",
 	"#include <errno.h>",
 	"#include <errno.h>",
-"#ifdef SC",
+	"#if defined(WIN32) || defined(WIN64)",
+		"#include <time.h>",
+	"#else",
+		"#include <unistd.h>",
+		"#include <sys/times.h>",	/* new 4.3.0 */
+	"#endif",
 	"#include <sys/types.h>",	/* defines off_t */
 	"#include <sys/types.h>",	/* defines off_t */
 	"#include <sys/stat.h>",
 	"#include <sys/stat.h>",
 	"#include <fcntl.h>",
 	"#include <fcntl.h>",
-	#ifndef PC
-	"#include <unistd.h>",
-	#endif
-"#endif",
 	"#define Offsetof(X, Y)	((unsigned long)(&(((X *)0)->Y)))",
 	"#define Offsetof(X, Y)	((unsigned long)(&(((X *)0)->Y)))",
 	"#ifndef max",
 	"#ifndef max",
 	"#define max(a,b) (((a)<(b)) ? (b) : (a))",
 	"#define max(a,b) (((a)<(b)) ? (b) : (a))",
 	"#endif",
 	"#endif",
+	"#ifndef PRINTF",
+	"int Printf(const char *fmt, ...); /* prototype only */",
+	"#endif",
 	0,
 	0,
 };
 };
 
 
@@ -89,13 +93,12 @@ static char *Preamble[] = {
 	"	}",
 	"	}",
 	"#endif",
 	"#endif",
 "#endif",
 "#endif",
-
 	"struct H_el {",
 	"struct H_el {",
 	"	struct H_el *nxt;",
 	"	struct H_el *nxt;",
 	"#ifdef FULLSTACK",
 	"#ifdef FULLSTACK",
-	"	unsigned tagged;",
+	"	unsigned int tagged;",
 		"#if defined(BITSTATE) && !defined(NOREDUCE) && !defined(SAFETY)",
 		"#if defined(BITSTATE) && !defined(NOREDUCE) && !defined(SAFETY)",
-		"	unsigned proviso;", /* uses just 1 bit 0/1 */
+		"	unsigned int proviso;", /* uses just 1 bit 0/1 */
 		"#endif",
 		"#endif",
 	"#endif",
 	"#endif",
 	"#if defined(CHECK) || (defined(COLLAPSE) && !defined(FULLSTACK))",
 	"#if defined(CHECK) || (defined(COLLAPSE) && !defined(FULLSTACK))",
@@ -108,8 +111,8 @@ static char *Preamble[] = {
 	"	unsigned long ln;",	/* length of vector */
 	"	unsigned long ln;",	/* length of vector */
 		"#endif",
 		"#endif",
 	"#endif",
 	"#endif",
-	"#ifdef REACH",
-	"	unsigned D;",
+	"#if !defined(SAFETY) || defined(REACH)",
+	"	unsigned int D;",
 	"#endif",
 	"#endif",
 	"	unsigned state;",
 	"	unsigned state;",
 	"} **H_tab, **S_Tab;\n",
 	"} **H_tab, **S_Tab;\n",
@@ -233,7 +236,7 @@ static char *Preamble[] = {
 	"long	Ccheck=0, Cholds=0;",
 	"long	Ccheck=0, Cholds=0;",
 	"int	a_cycles=0, upto=1, strict=0, verbose = 0, signoff = 0;",
 	"int	a_cycles=0, upto=1, strict=0, verbose = 0, signoff = 0;",
 	"#ifdef HAS_CODE",
 	"#ifdef HAS_CODE",
-	"int	gui = 0, coltrace = 0, readtrail = 0, whichtrail = 0, onlyproc = -1;",
+	"int	gui = 0, coltrace = 0, readtrail = 0, whichtrail = 0, onlyproc = -1, silent = 0;",
 	"#endif",
 	"#endif",
 	"int	state_tables=0, fairness=0, no_rck=0, Nr_Trails=0;",
 	"int	state_tables=0, fairness=0, no_rck=0, Nr_Trails=0;",
 	"char	simvals[128];",
 	"char	simvals[128];",
@@ -283,7 +286,8 @@ static char *Preamble[] = {
 	"static long udmem;",
 	"static long udmem;",
 #endif
 #endif
 	"#endif",
 	"#endif",
-	"static long	A_depth = 0, depth = 0;",
+	"static long	A_depth = 0;",
+	"long	depth = 0;",	/* not static to support -S2 option, but possible clash with embedded code */
 	"static uchar	warned = 0, iterative = 0, like_java = 0, every_error = 0;",
 	"static uchar	warned = 0, iterative = 0, like_java = 0, every_error = 0;",
 	"static uchar	noasserts = 0, noends = 0, bounded = 0;",
 	"static uchar	noasserts = 0, noends = 0, bounded = 0;",
 	"#if SYNC>0 && ASYNC==0",
 	"#if SYNC>0 && ASYNC==0",
@@ -677,16 +681,16 @@ static char *Tail[] = {
 	"	for (i = 1; i < m; i++)",
 	"	for (i = 1; i < m; i++)",
 	"	{	int nrelse;",
 	"	{	int nrelse;",
 	"		if (strcmp(procname[n], \":never:\") != 0)",
 	"		if (strcmp(procname[n], \":never:\") != 0)",
-	"		for (T0 = trans[n][i]; T0; T0 = T0->nxt)",
-	"		{	if (T0->st == i",
-	"			&& strcmp(T0->tp, \"(1)\") == 0)",
-	"			{	printf(\"error: proctype '%%s' \",",
-	"					procname[n]);",
-	"		  		printf(\"line %%d, state %%d: has un\",",
-	"					srcln[i], i);",
-	"				printf(\"conditional self-loop\\n\");",
-	"				pan_exit(1);",
-	"		}	}",
+	"		{	for (T0 = trans[n][i]; T0; T0 = T0->nxt)",
+	"			{	if (T0->st == i",
+	"				&& strcmp(T0->tp, \"(1)\") == 0)",
+	"				{	printf(\"error: proctype '%%s' \",",
+	"						procname[n]);",
+	"		  			printf(\"line %%d, state %%d: has un\",",
+	"						srcln[i], i);",
+	"					printf(\"conditional self-loop\\n\");",
+	"					pan_exit(1);",
+	"		}	}	}",
 	"		nrelse = 0;",
 	"		nrelse = 0;",
 	"		for (T0 = trans[n][i]; T0; T0 = T0->nxt)",
 	"		for (T0 = trans[n][i]; T0; T0 = T0->nxt)",
 	"		{	if (strcmp(T0->tp, \"else\") == 0)",
 	"		{	if (strcmp(T0->tp, \"else\") == 0)",
@@ -699,6 +703,17 @@ static char *Tail[] = {
 	"		  	printf(\" 'else' stmnts\\n\");",
 	"		  	printf(\" 'else' stmnts\\n\");",
 	"			pan_exit(1);",
 	"			pan_exit(1);",
 	"	}	}",
 	"	}	}",
+	"	if (!state_tables && strcmp(procname[n], \":never:\") == 0)",
+	"	{	int h = 0;",
+	"		for (i = 1; i < m; i++)",
+	"		for (T0 = trans[n][i]; T0; T0 = T0->nxt)",
+	"			if (T0->forw > h) h = T0->forw;",
+	"		h++;",
+	"		frm_st0 = (short *) emalloc(h * sizeof(short));",
+	"		for (i = 1; i < m; i++)",
+	"		for (T0 = trans[n][i]; T0; T0 = T0->nxt)",
+	"			frm_st0[T0->forw] = i;",
+	"	}",
 	"}",
 	"}",
 	"void",
 	"void",
 	"imed(Trans *T, int v, int n, int j)	/* set intermediate state */",
 	"imed(Trans *T, int v, int n, int j)	/* set intermediate state */",

+ 2 - 5
sys/src/cmd/spin/pangen3.c

@@ -10,11 +10,7 @@
 /* Send all bug-reports and/or questions to: bugs@spinroot.com            */
 /* Send all bug-reports and/or questions to: bugs@spinroot.com            */
 
 
 #include "spin.h"
 #include "spin.h"
-#ifdef PC
-#include "y_tab.h"
-#else
 #include "y.tab.h"
 #include "y.tab.h"
-#endif
 
 
 extern FILE	*th;
 extern FILE	*th;
 extern int	claimnr, eventmapnr;
 extern int	claimnr, eventmapnr;
@@ -62,7 +58,8 @@ putfnm(int j, Symbol *s)
 static void
 static void
 putfnm_flush(int j)
 putfnm_flush(int j)
 {
 {
-	fprintf(th, "{ %s, %d, %d }\n",
+	if (lastfnm)
+		fprintf(th, "{ %s, %d, %d }\n",
 			lastfnm->name,
 			lastfnm->name,
 			lastfrom, j);
 			lastfrom, j);
 }
 }

+ 26 - 17
sys/src/cmd/spin/pangen3.h

@@ -37,8 +37,8 @@ static char *Head0[] = {
 	"	int back;	/* index return  transition */",
 	"	int back;	/* index return  transition */",
 	"	struct Trans *nxt;",
 	"	struct Trans *nxt;",
 	"} Trans;\n",
 	"} Trans;\n",
-	"#define qptr(x)	(((uchar *)&now)+q_offset[x])",
-	"#define pptr(x)	(((uchar *)&now)+proc_offset[x])",
+	"#define qptr(x)	(((uchar *)&now)+(int)q_offset[x])",
+	"#define pptr(x)	(((uchar *)&now)+(int)proc_offset[x])",
 /*	"#define Pptr(x)	((proc_offset[x])?pptr(x):noptr)",	*/
 /*	"#define Pptr(x)	((proc_offset[x])?pptr(x):noptr)",	*/
 	"extern uchar *Pptr(int);",
 	"extern uchar *Pptr(int);",
 
 
@@ -72,7 +72,7 @@ static char *Header[] = {
 		"#endif",
 		"#endif",
 	"#else",
 	"#else",
 		"#ifdef BITSTATE",
 		"#ifdef BITSTATE",
-			"#ifdef SAFETY",
+			"#ifdef SAFETY && !defined(HASH64)",
 				"#define CNTRSTACK",
 				"#define CNTRSTACK",
 			"#else",
 			"#else",
 				"#define FULLSTACK",
 				"#define FULLSTACK",
@@ -163,13 +163,16 @@ static char *Header0[] = {
 	"struct H_el *Lstate;",
 	"struct H_el *Lstate;",
 	"#endif",
 	"#endif",
 	"int depthfound = -1;	/* loop detection */",
 	"int depthfound = -1;	/* loop detection */",
-	"int proc_offset[MAXPROC], proc_skip[MAXPROC];",
-	"int q_offset[MAXQ], q_skip[MAXQ];",
-	"#if VECTORSZ<65536",
-	"	unsigned short vsize;",
+	"#if VECTORSZ>32000",
+	"int proc_offset[MAXPROC];",
+	"int q_offset[MAXQ];",
 	"#else",
 	"#else",
-	"	unsigned long  vsize;	/* vector size in bytes */",
+	"short proc_offset[MAXPROC];",
+	"short q_offset[MAXQ];",
 	"#endif",
 	"#endif",
+	"uchar proc_skip[MAXPROC];",
+	"uchar q_skip[MAXQ];",
+	"unsigned long  vsize;	/* vector size in bytes */",
 	"#ifdef SVDUMP",
 	"#ifdef SVDUMP",
 	"int vprefix=0, svfd;		/* runtime option -pN */",
 	"int vprefix=0, svfd;		/* runtime option -pN */",
 	"#endif",
 	"#endif",
@@ -251,10 +254,10 @@ static char *Addp1[] = {
 	"	else",
 	"	else",
 	"		proc_skip[h] = 0;",
 	"		proc_skip[h] = 0;",
 	"#ifndef NOCOMP",
 	"#ifndef NOCOMP",
-	"	for (k = vsize + proc_skip[h]; k > vsize; k--)",
+	"	for (k = vsize + (int) proc_skip[h]; k > vsize; k--)",
 	"		Mask[k-1] = 1; /* align */",
 	"		Mask[k-1] = 1; /* align */",
 	"#endif",
 	"#endif",
-	"	vsize += proc_skip[h];",
+	"	vsize += (int) proc_skip[h];",
 	"	proc_offset[h] = vsize;",
 	"	proc_offset[h] = vsize;",
 	"#ifdef SVDUMP",
 	"#ifdef SVDUMP",
 	"	if (vprefix > 0)",
 	"	if (vprefix > 0)",
@@ -262,7 +265,11 @@ static char *Addp1[] = {
 	"		write(svfd, (uchar *) &dummy, sizeof(int)); /* mark */",
 	"		write(svfd, (uchar *) &dummy, sizeof(int)); /* mark */",
 	"		write(svfd, (uchar *) &h, sizeof(int));",
 	"		write(svfd, (uchar *) &h, sizeof(int));",
 	"		write(svfd, (uchar *) &n, sizeof(int));",
 	"		write(svfd, (uchar *) &n, sizeof(int));",
+	"#if VECTORSZ>32000",
 	"		write(svfd, (uchar *) &proc_offset[h], sizeof(int));",
 	"		write(svfd, (uchar *) &proc_offset[h], sizeof(int));",
+	"#else",
+	"		write(svfd, (uchar *) &proc_offset[h], sizeof(short));",
+	"#endif",
 	"		write(svfd, (uchar *) &now, vprefix-4*sizeof(int)); /* padd */",
 	"		write(svfd, (uchar *) &now, vprefix-4*sizeof(int)); /* padd */",
 	"	}",
 	"	}",
 	"#endif",
 	"#endif",
@@ -326,10 +333,10 @@ static char *Addq1[] = {
 	"#ifndef BFS",
 	"#ifndef BFS",
 	"	if (is_rv) k += j;",
 	"	if (is_rv) k += j;",
 	"#endif",
 	"#endif",
-	"	for (k += q_skip[i]; k > vsize; k--)",
+	"	for (k += (int) q_skip[i]; k > vsize; k--)",
 	"		Mask[k-1] = 1;",
 	"		Mask[k-1] = 1;",
 	"#endif",
 	"#endif",
-	"	vsize += q_skip[i];",
+	"	vsize += (int) q_skip[i];",
 	"	q_offset[i] = vsize;",
 	"	q_offset[i] = vsize;",
 	"	now._nr_qs += 1;",
 	"	now._nr_qs += 1;",
 	"	vsize += j;",
 	"	vsize += j;",
@@ -536,7 +543,7 @@ static char *Code0[] = {
 	"run(void)",
 	"run(void)",
 	"{	/* int i; */",
 	"{	/* int i; */",
 	"	memset((char *)&now, 0, sizeof(State));",
 	"	memset((char *)&now, 0, sizeof(State));",
-	"	vsize = sizeof(State) - VECTORSZ;",
+	"	vsize = (unsigned long) (sizeof(State) - VECTORSZ);",
 	"#ifndef NOVSZ",
 	"#ifndef NOVSZ",
 	"	now._vsz = vsize;",
 	"	now._vsz = vsize;",
 	"#endif",
 	"#endif",
@@ -736,14 +743,16 @@ static char *Proto[] = {
 	"char *emalloc(unsigned long);",
 	"char *emalloc(unsigned long);",
 	"char *Malloc(unsigned long);",
 	"char *Malloc(unsigned long);",
 	"int Boundcheck(int, int, int, int, Trans *);",
 	"int Boundcheck(int, int, int, int, Trans *);",
-	"/* int abort(void); */",
 	"int addqueue(int, int);",
 	"int addqueue(int, int);",
 	"/* int atoi(char *); */",
 	"/* int atoi(char *); */",
-	"int close(int);",
-"#ifndef SC",
+	"/* int abort(void); */",
+	"int close(int);",	/* should probably remove this */
+#if 0
+	"#ifndef SC",
 	"int creat(char *, unsigned short);",
 	"int creat(char *, unsigned short);",
 	"int write(int, void *, unsigned);",
 	"int write(int, void *, unsigned);",
-"#endif",
+	"#endif",
+#endif
 	"int delproc(int, int);",
 	"int delproc(int, int);",
 	"int endstate(void);",
 	"int endstate(void);",
 	"int hstore(char *, int);",
 	"int hstore(char *, int);",

+ 0 - 4
sys/src/cmd/spin/pangen4.c

@@ -10,11 +10,7 @@
 /* Send all bug-reports and/or questions to: bugs@spinroot.com            */
 /* Send all bug-reports and/or questions to: bugs@spinroot.com            */
 
 
 #include "spin.h"
 #include "spin.h"
-#ifdef PC
-#include "y_tab.h"
-#else
 #include "y.tab.h"
 #include "y.tab.h"
-#endif
 
 
 extern FILE	*tc, *tb;
 extern FILE	*tc, *tb;
 extern Queue	*qtab;
 extern Queue	*qtab;

+ 1 - 1
sys/src/cmd/spin/pangen4.h

@@ -27,7 +27,7 @@ static char *Dfa[] = {
 	"#define ushort	unsigned short",
 	"#define ushort	unsigned short",
 	"",
 	"",
 	"#define TWIDTH		256",
 	"#define TWIDTH		256",
-	"#define HASH(y,n)	(n)*(((int)y))",
+	"#define HASH(y,n)	(n)*(((long)y))",
 	"#define INRANGE(e,h)	((h>=e->From && h<=e->To)||(e->s==1 && e->S==h))",
 	"#define INRANGE(e,h)	((h>=e->From && h<=e->To)||(e->s==1 && e->S==h))",
 	"",
 	"",
 	"extern char	*emalloc(unsigned long);	/* imported routine  */",
 	"extern char	*emalloc(unsigned long);	/* imported routine  */",

+ 0 - 4
sys/src/cmd/spin/pangen5.c

@@ -10,11 +10,7 @@
 /* Send all bug-reports and/or questions to: bugs@spinroot.com            */
 /* Send all bug-reports and/or questions to: bugs@spinroot.com            */
 
 
 #include "spin.h"
 #include "spin.h"
-#ifdef PC
-#include "y_tab.h"
-#else
 #include "y.tab.h"
 #include "y.tab.h"
-#endif
 
 
 typedef struct BuildStack {
 typedef struct BuildStack {
 	FSM_trans *t;
 	FSM_trans *t;

+ 2 - 7
sys/src/cmd/spin/pangen6.c

@@ -17,11 +17,7 @@
 /*      AST_criteria to process the slice criteria          */
 /*      AST_criteria to process the slice criteria          */
 
 
 #include "spin.h"
 #include "spin.h"
-#ifdef PC
-#include "y_tab.h"
-#else
 #include "y.tab.h"
 #include "y.tab.h"
-#endif
 
 
 extern Ordered	 *all_names;
 extern Ordered	 *all_names;
 extern FSM_use   *use_free;
 extern FSM_use   *use_free;
@@ -507,8 +503,7 @@ AST_mutual(Lextok *a, Lextok *b, int toplevel)
 	if (strcmp(as->name, bs->name) != 0)
 	if (strcmp(as->name, bs->name) != 0)
 		return 0;
 		return 0;
 
 
-	if (as->type == STRUCT
-	&&  a && a->rgt && b && b->rgt)
+	if (as->type == STRUCT && a->rgt && b->rgt)
 		return AST_mutual(a->rgt->lft, b->rgt->lft, 0);
 		return AST_mutual(a->rgt->lft, b->rgt->lft, 0);
 
 
 	return 1;
 	return 1;
@@ -2195,7 +2190,7 @@ init_dom(AST *a)
 				f->dom[i] = (ulong) ~0;			/* all 1's */
 				f->dom[i] = (ulong) ~0;			/* all 1's */
 
 
 			if (a->nstates % BPW)
 			if (a->nstates % BPW)
-			for (i = a->nstates % BPW; i < BPW; i++)
+			for (i = (a->nstates % BPW); i < (int) BPW; i++)
 				f->dom[a->nwords-1] &= ~(1<<i);	/* clear tail */
 				f->dom[a->nwords-1] &= ~(1<<i);	/* clear tail */
 
 
 			for (cnt = 0; cnt < a->nstates; cnt++)
 			for (cnt = 0; cnt < a->nstates; cnt++)

+ 2 - 2
sys/src/cmd/spin/pc_zpp.c

@@ -376,9 +376,9 @@ static struct Directives {
 	{ 6, "define",	 do_define,	1 },
 	{ 6, "define",	 do_define,	1 },
 	{ 4, "else",	 do_else,	0 },
 	{ 4, "else",	 do_else,	0 },
 	{ 5, "endif",	 do_endif,	0 },
 	{ 5, "endif",	 do_endif,	0 },
-	{ 2, "if",	 do_if,		0 },
 	{ 5, "ifdef",	 do_ifdef,	0 },
 	{ 5, "ifdef",	 do_ifdef,	0 },
 	{ 6, "ifndef",   do_ifndef,	0 },
 	{ 6, "ifndef",   do_ifndef,	0 },
+	{ 2, "if",	 do_if,		0 },
 	{ 7, "include",  do_include,	1 },
 	{ 7, "include",  do_include,	1 },
 	{ 8, "undefine", do_undefine,	1 },
 	{ 8, "undefine", do_undefine,	1 },
 };
 };
@@ -390,7 +390,7 @@ process(char *q, int lno, char *fnm)
 	for (p = q; *p; p++)
 	for (p = q; *p; p++)
 		if (*p != ' ' && *p != '\t')
 		if (*p != ' ' && *p != '\t')
 			break;
 			break;
-	for (i = 0; i < sizeof(s)/sizeof(struct Directives); i++)
+	for (i = 0; i < (int) (sizeof(s)/sizeof(struct Directives)); i++)
 		if (!strncmp(s[i].directive, p, s[i].len))
 		if (!strncmp(s[i].directive, p, s[i].len))
 		{	if (s[i].interp
 		{	if (s[i].interp
 			&&  !printing[if_depth])
 			&&  !printing[if_depth])

+ 0 - 4
sys/src/cmd/spin/reprosrc.c

@@ -11,11 +11,7 @@
 
 
 #include <stdio.h>
 #include <stdio.h>
 #include "spin.h"
 #include "spin.h"
-#ifdef PC
-#include "y_tab.h"
-#else
 #include "y.tab.h"
 #include "y.tab.h"
-#endif
 
 
 static int indent = 1;
 static int indent = 1;
 
 

+ 3 - 7
sys/src/cmd/spin/run.c

@@ -11,11 +11,7 @@
 
 
 #include <stdlib.h>
 #include <stdlib.h>
 #include "spin.h"
 #include "spin.h"
-#ifdef PC
-#include "y_tab.h"
-#else
 #include "y.tab.h"
 #include "y.tab.h"
-#endif
 
 
 extern RunList	*X, *run;
 extern RunList	*X, *run;
 extern Symbol	*Fname;
 extern Symbol	*Fname;
@@ -441,9 +437,9 @@ int
 interprint(FILE *fd, Lextok *n)
 interprint(FILE *fd, Lextok *n)
 {	Lextok *tmp = n->lft;
 {	Lextok *tmp = n->lft;
 	char c, *s = n->sym->name;
 	char c, *s = n->sym->name;
-	int i, j; char lbuf[16];
+	int i, j; char lbuf[512];
 	extern char Buf[];
 	extern char Buf[];
-	char tBuf[1024];
+	char tBuf[4096];
 
 
 	Buf[0] = '\0';
 	Buf[0] = '\0';
 	if (!no_print)
 	if (!no_print)
@@ -494,7 +490,7 @@ append:			 strcat(Buf, lbuf);
 		}
 		}
 		dotag(fd, Buf);
 		dotag(fd, Buf);
 	}
 	}
-	if (strlen(Buf) > 1024) fatal("printf string too long", 0);
+	if (strlen(Buf) > 4096) fatal("printf string too long", 0);
 	return 1;
 	return 1;
 }
 }
 
 

+ 43 - 14
sys/src/cmd/spin/sched.c

@@ -11,11 +11,7 @@
 
 
 #include <stdlib.h>
 #include <stdlib.h>
 #include "spin.h"
 #include "spin.h"
-#ifdef PC
-#include "y_tab.h"
-#else
 #include "y.tab.h"
 #include "y.tab.h"
-#endif
 
 
 extern int	verbose, s_trail, analyze, no_wrapup;
 extern int	verbose, s_trail, analyze, no_wrapup;
 extern char	*claimproc, *eventmap, Buf[];
 extern char	*claimproc, *eventmap, Buf[];
@@ -181,6 +177,31 @@ enable(Lextok *m)
 	return 0; /* process not found */
 	return 0; /* process not found */
 }
 }
 
 
+void
+check_param_count(int i, Lextok *m)
+{	ProcList *p;
+	Symbol *s = m->sym;	/* proctype name */
+	Lextok *f, *t;		/* formal pars */
+	int cnt = 0;
+
+	for (p = rdy; p; p = p->nxt)
+	{	if (strcmp(s->name, p->n->name) == 0)
+		{	if (m->lft)	/* actual param list */
+			{	lineno = m->lft->ln;
+				Fname  = m->lft->fn;
+			}
+			for (f = p->p;   f; f = f->rgt) /* one type at a time */
+			for (t = f->lft; t; t = t->rgt)	/* count formal params */
+			{	cnt++;
+			}
+			if (i != cnt)
+			{	printf("spin: saw %d parameters, expected %d\n", i, cnt);
+				non_fatal("wrong number of parameters", "");
+			}
+			break;
+	}	}
+}
+
 void
 void
 start_claim(int n)
 start_claim(int n)
 {	ProcList *p;
 {	ProcList *p;
@@ -291,6 +312,7 @@ static Element *
 silent_moves(Element *e)
 silent_moves(Element *e)
 {	Element *f;
 {	Element *f;
 
 
+	if (e->n)
 	switch (e->n->ntyp) {
 	switch (e->n->ntyp) {
 	case GOTO:
 	case GOTO:
 		if (Rvous) break;
 		if (Rvous) break;
@@ -310,29 +332,33 @@ silent_moves(Element *e)
 	return e;
 	return e;
 }
 }
 
 
-static void
-pickproc(void)
+static RunList *
+pickproc(RunList *Y)
 {	SeqList *z; Element *has_else;
 {	SeqList *z; Element *has_else;
 	short Choices[256];
 	short Choices[256];
 	int j, k, nr_else = 0;
 	int j, k, nr_else = 0;
 
 
 	if (nproc <= nstop+1)
 	if (nproc <= nstop+1)
 	{	X = run;
 	{	X = run;
-		return;
+		return NULL;
 	}
 	}
 	if (!interactive || depth < jumpsteps)
 	if (!interactive || depth < jumpsteps)
 	{	/* was: j = (int) Rand()%(nproc-nstop); */
 	{	/* was: j = (int) Rand()%(nproc-nstop); */
 		if (Priority_Sum < nproc-nstop)
 		if (Priority_Sum < nproc-nstop)
 			fatal("cannot happen - weights", (char *)0);
 			fatal("cannot happen - weights", (char *)0);
 		j = (int) Rand()%Priority_Sum;
 		j = (int) Rand()%Priority_Sum;
+
 		while (j - X->priority >= 0)
 		while (j - X->priority >= 0)
 		{	j -= X->priority;
 		{	j -= X->priority;
+			Y = X;
 			X = X->nxt;
 			X = X->nxt;
-			if (!X) X = run;
+			if (!X) { Y = NULL; X = run; }
 		}
 		}
 	} else
 	} else
 	{	int only_choice = -1;
 	{	int only_choice = -1;
 		int no_choice = 0, proc_no_ch, proc_k;
 		int no_choice = 0, proc_no_ch, proc_k;
+
+		Tval = 0;	/* new 4.2.6 */
 try_again:	printf("Select a statement\n");
 try_again:	printf("Select a statement\n");
 try_more:	for (X = run, k = 1; X; X = X->nxt)
 try_more:	for (X = run, k = 1; X; X = X->nxt)
 		{	if (X->pid > 255) break;
 		{	if (X->pid > 255) break;
@@ -444,7 +470,8 @@ try_more:	for (X = run, k = 1; X; X = X->nxt)
 				goto try_again;
 				goto try_again;
 		}	}
 		}	}
 		MadeChoice = 0;
 		MadeChoice = 0;
-		for (X = run; X; X = X->nxt)
+		Y = NULL;
+		for (X = run; X; Y = X, X = X->nxt)
 		{	if (!X->nxt
 		{	if (!X->nxt
 			||   X->nxt->pid > 255
 			||   X->nxt->pid > 255
 			||   j < Choices[X->nxt->pid])
 			||   j < Choices[X->nxt->pid])
@@ -453,12 +480,13 @@ try_more:	for (X = run, k = 1; X; X = X->nxt)
 				break;
 				break;
 		}	}
 		}	}
 	}
 	}
+	return Y;
 }
 }
 
 
 void
 void
 sched(void)
 sched(void)
 {	Element *e;
 {	Element *e;
-	RunList *Y=0;	/* previous process in run queue */
+	RunList *Y = NULL;	/* previous process in run queue */
 	RunList *oX;
 	RunList *oX;
 	int go, notbeyond = 0;
 	int go, notbeyond = 0;
 #ifdef PC
 #ifdef PC
@@ -489,7 +517,7 @@ sched(void)
 	printf("warning: trace assertion not used in random simulation\n");
 	printf("warning: trace assertion not used in random simulation\n");
 
 
 	X = run;
 	X = run;
-	pickproc();
+	Y = pickproc(Y);
 
 
 	while (X)
 	while (X)
 	{	context = X->n;
 	{	context = X->n;
@@ -564,7 +592,7 @@ sched(void)
 
 
 			if (X->pc->n->ntyp == '@'
 			if (X->pc->n->ntyp == '@'
 			&&  X->pid == (nproc-nstop-1))
 			&&  X->pid == (nproc-nstop-1))
-			{	if (X != run)
+			{	if (X != run && Y != NULL)
 					Y->nxt = X->nxt;
 					Y->nxt = X->nxt;
 				else
 				else
 					run = X->nxt;
 					run = X->nxt;
@@ -578,6 +606,8 @@ sched(void)
 				if (!interactive) Tval = 0;
 				if (!interactive) Tval = 0;
 				if (nproc == nstop) break;
 				if (nproc == nstop) break;
 				memset(is_blocked, 0, 256);
 				memset(is_blocked, 0, 256);
+				/* proc X is no longer in runlist */
+				X = (X->nxt) ? X->nxt : run;
 			} else
 			} else
 			{	if (p_blocked(X->pid))
 			{	if (p_blocked(X->pid))
 				{	if (Tval) break;
 				{	if (Tval) break;
@@ -588,8 +618,7 @@ sched(void)
 						dotag(stdout, "timeout\n");
 						dotag(stdout, "timeout\n");
 						X = oX;
 						X = oX;
 		}	}	}	}
 		}	}	}	}
-		Y = X;
-		pickproc();
+		Y = pickproc(X);
 		notbeyond = 0;
 		notbeyond = 0;
 	}
 	}
 	context = ZS;
 	context = ZS;

+ 2 - 3
sys/src/cmd/spin/spin.h

@@ -15,8 +15,6 @@
 #include <stdio.h>
 #include <stdio.h>
 #include <string.h>
 #include <string.h>
 #include <ctype.h>
 #include <ctype.h>
-#ifndef PC
-#endif
 
 
 typedef struct Lextok {
 typedef struct Lextok {
 	unsigned short	ntyp;	/* node type */
 	unsigned short	ntyp;	/* node type */
@@ -53,7 +51,7 @@ typedef struct Symbol {
 				   1=hide, 2=show,
 				   1=hide, 2=show,
 				   4=bit-equiv,   8=byte-equiv,
 				   4=bit-equiv,   8=byte-equiv,
 				  16=formal par, 32=inline par,
 				  16=formal par, 32=inline par,
-				  64=treat as if local
+				  64=treat as if local; 128=read at least once
 				 */
 				 */
 	unsigned char	colnr;	/* for use with xspin during simulation */
 	unsigned char	colnr;	/* for use with xspin during simulation */
 	int	nbits;		/* optional width specifier */
 	int	nbits;		/* optional width specifier */
@@ -319,6 +317,7 @@ void	c_track(Symbol *, Symbol *, Symbol *);
 void	c_var(FILE *, char *, Symbol *);
 void	c_var(FILE *, char *, Symbol *);
 void	c_wrapper(FILE *);
 void	c_wrapper(FILE *);
 void	chanaccess(void);
 void	chanaccess(void);
+void	check_param_count(int, Lextok *);
 void	checkrun(Symbol *, int);
 void	checkrun(Symbol *, int);
 void	comment(FILE *, Lextok *, int);
 void	comment(FILE *, Lextok *, int);
 void	cross_dsteps(Lextok *, Lextok *);
 void	cross_dsteps(Lextok *, Lextok *);

+ 8 - 1
sys/src/cmd/spin/spin.y

@@ -21,6 +21,8 @@ extern  int	u_sync, u_async, dumptab;
 extern	short	has_sorted, has_random, has_enabled, has_pcvalue, has_np;
 extern	short	has_sorted, has_random, has_enabled, has_pcvalue, has_np;
 extern	short	has_code, has_state, has_io;
 extern	short	has_code, has_state, has_io;
 extern	void	count_runs(Lextok *);
 extern	void	count_runs(Lextok *);
+extern	void	no_internals(Lextok *);
+extern	void	any_runs(Lextok *);
 extern	void	validref(Lextok *, Lextok *);
 extern	void	validref(Lextok *, Lextok *);
 extern	char	yytext[];
 extern	char	yytext[];
 
 
@@ -375,7 +377,7 @@ sfld	: /* empty */		{ $$ = ZN; }
 stmnt	: Special		{ $$ = $1; }
 stmnt	: Special		{ $$ = $1; }
 	| Stmnt			{ $$ = $1;
 	| Stmnt			{ $$ = $1;
 				  if (inEventMap)
 				  if (inEventMap)
-				   fatal("not an event", (char *)0);
+				   non_fatal("not an event", (char *)0);
 				}
 				}
 	;
 	;
 
 
@@ -388,6 +390,7 @@ Special : varref RCV		{ Expand_Ok++; }
 	  margs			{ Expand_Ok--; has_io++;
 	  margs			{ Expand_Ok--; has_io++;
 				  $$ = nn($1, 's', $1, $4);
 				  $$ = nn($1, 's', $1, $4);
 				  $$->val=0; trackchanuse($4, ZN, 'S');
 				  $$->val=0; trackchanuse($4, ZN, 'S');
+				  any_runs($4);
 				}
 				}
 	| IF options FI 	{ $$ = nn($1, IF, ZN, ZN);
 	| IF options FI 	{ $$ = nn($1, IF, ZN, ZN);
         			  $$->sl = $2->sl;
         			  $$->sl = $2->sl;
@@ -422,11 +425,13 @@ Special : varref RCV		{ Expand_Ok++; }
 Stmnt	: varref ASGN expr	{ $$ = nn($1, ASGN, $1, $3);
 Stmnt	: varref ASGN expr	{ $$ = nn($1, ASGN, $1, $3);
 				  trackvar($1, $3);
 				  trackvar($1, $3);
 				  nochan_manip($1, $3, 0);
 				  nochan_manip($1, $3, 0);
+				  no_internals($1);
 				}
 				}
 	| varref INCR		{ $$ = nn(ZN,CONST, ZN, ZN); $$->val = 1;
 	| varref INCR		{ $$ = nn(ZN,CONST, ZN, ZN); $$->val = 1;
 				  $$ = nn(ZN,  '+', $1, $$);
 				  $$ = nn(ZN,  '+', $1, $$);
 				  $$ = nn($1, ASGN, $1, $$);
 				  $$ = nn($1, ASGN, $1, $$);
 				  trackvar($1, $1);
 				  trackvar($1, $1);
+				  no_internals($1);
 				  if ($1->sym->type == CHAN)
 				  if ($1->sym->type == CHAN)
 				   fatal("arithmetic on chan", (char *)0);
 				   fatal("arithmetic on chan", (char *)0);
 				}
 				}
@@ -434,6 +439,7 @@ Stmnt	: varref ASGN expr	{ $$ = nn($1, ASGN, $1, $3);
 				  $$ = nn(ZN,  '-', $1, $$);
 				  $$ = nn(ZN,  '-', $1, $$);
 				  $$ = nn($1, ASGN, $1, $$);
 				  $$ = nn($1, ASGN, $1, $$);
 				  trackvar($1, $1);
 				  trackvar($1, $1);
+				  no_internals($1);
 				  if ($1->sym->type == CHAN)
 				  if ($1->sym->type == CHAN)
 				   fatal("arithmetic on chan id's", (char *)0);
 				   fatal("arithmetic on chan id's", (char *)0);
 				}
 				}
@@ -466,6 +472,7 @@ Stmnt	: varref ASGN expr	{ $$ = nn($1, ASGN, $1, $3);
 				  $$ = nn($1, 's', $1, $4);
 				  $$ = nn($1, 's', $1, $4);
 				  $$->val = has_sorted = 1;
 				  $$->val = has_sorted = 1;
 				  trackchanuse($4, ZN, 'S');
 				  trackchanuse($4, ZN, 'S');
+				  any_runs($4);
 				}
 				}
 	| full_expr		{ $$ = nn(ZN, 'c', $1, ZN); count_runs($$); }
 	| full_expr		{ $$ = nn(ZN, 'c', $1, ZN); count_runs($$); }
 	| ELSE  		{ $$ = nn(ZN,ELSE,ZN,ZN);
 	| ELSE  		{ $$ = nn(ZN,ELSE,ZN,ZN);

+ 28 - 10
sys/src/cmd/spin/spinlex.c

@@ -11,11 +11,7 @@
 
 
 #include <stdlib.h>
 #include <stdlib.h>
 #include "spin.h"
 #include "spin.h"
-#ifdef PC
-#include "y_tab.h"
-#else
 #include "y.tab.h"
 #include "y.tab.h"
-#endif
 
 
 #define MAXINL	16	/* max recursion depth inline fcts */
 #define MAXINL	16	/* max recursion depth inline fcts */
 #define MAXPAR	32	/* max params to an inline call */
 #define MAXPAR	32	/* max params to an inline call */
@@ -542,7 +538,7 @@ c_add_stack(FILE *fd)
 		cnt++;
 		cnt++;
 	}
 	}
 
 
-	if (cnt == 0) fprintf(fd, "4"); /* can't happen */
+	if (cnt == 0) fprintf(fd, "WS"); /* can't happen */
 	fprintf(fd, "];\n");
 	fprintf(fd, "];\n");
 }
 }
 
 
@@ -614,7 +610,7 @@ c_add_def(FILE *fd)	/* 3 - called in plunk_c_fcts() */
 	}
 	}
 
 
 	if (has_stack)
 	if (has_stack)
-	{	fprintf(fd, "void\nc_stack(char *p_t_r)\n{\n");
+	{	fprintf(fd, "void\nc_stack(uchar *p_t_r)\n{\n");
 		fprintf(fd, "#ifdef VERBOSE\n");
 		fprintf(fd, "#ifdef VERBOSE\n");
 		fprintf(fd, "	printf(\"c_stack %%u\\n\", p_t_r);\n");
 		fprintf(fd, "	printf(\"c_stack %%u\\n\", p_t_r);\n");
 		fprintf(fd, "#endif\n");
 		fprintf(fd, "#endif\n");
@@ -632,7 +628,7 @@ c_add_def(FILE *fd)	/* 3 - called in plunk_c_fcts() */
 		fprintf(fd, "}\n\n");
 		fprintf(fd, "}\n\n");
 	}
 	}
 
 
-	fprintf(fd, "void\nc_update(char *p_t_r)\n{\n");
+	fprintf(fd, "void\nc_update(uchar *p_t_r)\n{\n");
 	fprintf(fd, "#ifdef VERBOSE\n");
 	fprintf(fd, "#ifdef VERBOSE\n");
 	fprintf(fd, "	printf(\"c_update %%u\\n\", p_t_r);\n");
 	fprintf(fd, "	printf(\"c_update %%u\\n\", p_t_r);\n");
 	fprintf(fd, "#endif\n");
 	fprintf(fd, "#endif\n");
@@ -662,7 +658,7 @@ c_add_def(FILE *fd)	/* 3 - called in plunk_c_fcts() */
 	fprintf(fd, "}\n");
 	fprintf(fd, "}\n");
 
 
 	if (has_stack)
 	if (has_stack)
-	{	fprintf(fd, "void\nc_unstack(char *p_t_r)\n{\n");
+	{	fprintf(fd, "void\nc_unstack(uchar *p_t_r)\n{\n");
 		fprintf(fd, "#ifdef VERBOSE\n");
 		fprintf(fd, "#ifdef VERBOSE\n");
 		fprintf(fd, "	printf(\"c_unstack %%u\\n\", p_t_r);\n");
 		fprintf(fd, "	printf(\"c_unstack %%u\\n\", p_t_r);\n");
 		fprintf(fd, "#endif\n");
 		fprintf(fd, "#endif\n");
@@ -677,7 +673,7 @@ c_add_def(FILE *fd)	/* 3 - called in plunk_c_fcts() */
 		fprintf(fd, "}\n");
 		fprintf(fd, "}\n");
 	}
 	}
 
 
-	fprintf(fd, "void\nc_revert(char *p_t_r)\n{\n");
+	fprintf(fd, "void\nc_revert(uchar *p_t_r)\n{\n");
 	fprintf(fd, "#ifdef VERBOSE\n");
 	fprintf(fd, "#ifdef VERBOSE\n");
 	fprintf(fd, "	printf(\"c_revert %%u\\n\", p_t_r);\n");
 	fprintf(fd, "	printf(\"c_revert %%u\\n\", p_t_r);\n");
 	fprintf(fd, "#endif\n");
 	fprintf(fd, "#endif\n");
@@ -1358,7 +1354,29 @@ yylex(void)
 		{	sprintf(yytext, "'%c'", yylval->val);
 		{	sprintf(yytext, "'%c'", yylval->val);
 			strcat(IArg_cont[IArgno], yytext);
 			strcat(IArg_cont[IArgno], yytext);
 		} else
 		} else
-		{	strcat(IArg_cont[IArgno], yytext);
+		{
+			switch (c) {
+			case SEP:	strcpy(yytext, "::"); break;
+			case SEMI:	strcpy(yytext, ";"); break;
+			case DECR:	strcpy(yytext, "--"); break;
+			case INCR: 	strcpy(yytext, "++"); break;
+			case LSHIFT:	strcpy(yytext, "<<"); break;
+			case RSHIFT:	strcpy(yytext, ">>"); break;
+			case LE:	strcpy(yytext, "<="); break;
+			case LT:	strcpy(yytext, "<"); break;
+			case GE:	strcpy(yytext, ">="); break;
+			case GT:	strcpy(yytext, ">"); break;
+			case EQ:	strcpy(yytext, "=="); break;
+			case ASGN:	strcpy(yytext, "="); break;
+			case NE:	strcpy(yytext, "!="); break;
+			case R_RCV:	strcpy(yytext, "??"); break;
+			case RCV:	strcpy(yytext, "?"); break;
+			case O_SND:	strcpy(yytext, "!!"); break;
+			case SND:	strcpy(yytext, "!"); break;
+			case AND: 	strcpy(yytext, "&&"); break;
+			case OR:	strcpy(yytext, "||"); break;
+			}
+			strcat(IArg_cont[IArgno], yytext);
 		}
 		}
 	}
 	}
 
 

+ 0 - 4
sys/src/cmd/spin/structs.c

@@ -10,11 +10,7 @@
 /* Send all bug-reports and/or questions to: bugs@spinroot.com            */
 /* Send all bug-reports and/or questions to: bugs@spinroot.com            */
 
 
 #include "spin.h"
 #include "spin.h"
-#ifdef PC
-#include "y_tab.h"
-#else
 #include "y.tab.h"
 #include "y.tab.h"
-#endif
 
 
 typedef struct UType {
 typedef struct UType {
 	Symbol *nm;	/* name of the type */
 	Symbol *nm;	/* name of the type */

+ 6 - 9
sys/src/cmd/spin/sym.c

@@ -10,11 +10,7 @@
 /* Send all bug-reports and/or questions to: bugs@spinroot.com            */
 /* Send all bug-reports and/or questions to: bugs@spinroot.com            */
 
 
 #include "spin.h"
 #include "spin.h"
-#ifdef PC
-#include "y_tab.h"
-#else
 #include "y.tab.h"
 #include "y.tab.h"
-#endif
 
 
 extern Symbol	*Fname, *owner;
 extern Symbol	*Fname, *owner;
 extern int	lineno, depth, verbose, NamesNotAdded, deadvar;
 extern int	lineno, depth, verbose, NamesNotAdded, deadvar;
@@ -179,6 +175,7 @@ trackchanuse(Lextok *m, Lextok *w, int t)
 void
 void
 setptype(Lextok *n, int t, Lextok *vis)	/* predefined types */
 setptype(Lextok *n, int t, Lextok *vis)	/* predefined types */
 {	int oln = lineno, cnt = 1; extern int Expand_Ok;
 {	int oln = lineno, cnt = 1; extern int Expand_Ok;
+
 	while (n)
 	while (n)
 	{	if (n->sym->type && !(n->sym->hidden&32))
 	{	if (n->sym->type && !(n->sym->hidden&32))
 		{ lineno = n->ln; Fname = n->fn;
 		{ lineno = n->ln; Fname = n->fn;
@@ -193,7 +190,7 @@ setptype(Lextok *n, int t, Lextok *vis)	/* predefined types */
 			setaccess(n->sym, ZS, cnt, 'F');
 			setaccess(n->sym, ZS, cnt, 'F');
 		}
 		}
 		if (t == UNSIGNED)
 		if (t == UNSIGNED)
-		{	if (n->sym->nbits < 0)
+		{	if (n->sym->nbits < 0 || n->sym->nbits >= 32)
 			fatal("(%s) has invalid width-field", n->sym->name);
 			fatal("(%s) has invalid width-field", n->sym->name);
 			if (n->sym->nbits == 0)
 			if (n->sym->nbits == 0)
 			{	n->sym->nbits = 16;
 			{	n->sym->nbits = 16;
@@ -275,7 +272,7 @@ setxus(Lextok *p, int t)
 	if (!context)
 	if (!context)
 	{	lineno = p->ln;
 	{	lineno = p->ln;
 		Fname = p->fn;
 		Fname = p->fn;
-		non_fatal("non-local x[rs] assertion", (char *)0);
+		fatal("non-local x[rs] assertion", (char *)0);
 	}
 	}
 	for (m = p; m; m = m->rgt)
 	for (m = p; m; m = m->rgt)
 	{	Lextok *Xu_new = (Lextok *) emalloc(sizeof(Lextok));
 	{	Lextok *Xu_new = (Lextok *) emalloc(sizeof(Lextok));
@@ -325,7 +322,7 @@ setmtype(Lextok *m)
 
 
 		/* label the name */
 		/* label the name */
 		if (n->lft->sym->type != MTYPE)
 		if (n->lft->sym->type != MTYPE)
-		{	n->lft->sym->hidden |= 32;
+		{	n->lft->sym->hidden |= 128;	/* is used */
 			n->lft->sym->type = MTYPE;
 			n->lft->sym->type = MTYPE;
 			n->lft->sym->ini = nn(ZN,CONST,ZN,ZN);
 			n->lft->sym->ini = nn(ZN,CONST,ZN,ZN);
 			n->lft->sym->ini->val = cnt;
 			n->lft->sym->ini->val = cnt;
@@ -477,7 +474,7 @@ chan_check(Symbol *sp)
 		return;
 		return;
 report:
 report:
 	chname(sp);
 	chname(sp);
-	for (i = d = 0; i < sizeof(xx)/sizeof(struct X); i++)
+	for (i = d = 0; i < (int) (sizeof(xx)/sizeof(struct X)); i++)
 	{	b = 0;
 	{	b = 0;
 		for (a = sp->access; a; a = a->lnk)
 		for (a = sp->access; a; a = a->lnk)
 			if (a->typ == xx[i].typ) b++;
 			if (a->typ == xx[i].typ) b++;
@@ -513,7 +510,7 @@ chanaccess(void)
 		case SHORT:
 		case SHORT:
 		case INT:
 		case INT:
 		case UNSIGNED:
 		case UNSIGNED:
-			if ((walk->entry->hidden&32))
+			if ((walk->entry->hidden&128))	/* was: 32 */
 				continue;
 				continue;
 
 
 			if (!separate
 			if (!separate

+ 1 - 1
sys/src/cmd/spin/tl_lex.c

@@ -28,7 +28,7 @@ static void
 tl_getword(int first, int (*tst)(int))
 tl_getword(int first, int (*tst)(int))
 {	int i=0; char c;
 {	int i=0; char c;
 
 
-	yytext[i++]= (char ) first;
+	yytext[i++] = (char ) first;
 	while (tst(c = tl_Getchar()))
 	while (tst(c = tl_Getchar()))
 		yytext[i++] = c;
 		yytext[i++] = c;
 	yytext[i] = '\0';
 	yytext[i] = '\0';

+ 22 - 1
sys/src/cmd/spin/tl_main.c

@@ -38,6 +38,23 @@ tl_Getchar(void)
 	return -1;
 	return -1;
 }
 }
 
 
+void
+tl_balanced(void)
+{	int i;
+	int k = 0;
+
+	for (i = 0; i < hasuform; i++)
+	{	if (uform[i] == '(')
+		{	k++;
+		} else if (uform[i] == ')')
+		{	k--;
+	}	}
+	if (k != 0)
+	{	tl_errs++;
+		tl_yyerror("parentheses not balanced");
+	}
+}
+
 void
 void
 put_uform(void)
 put_uform(void)
 {
 {
@@ -96,7 +113,11 @@ nogood:		printf("usage:\tspin [-v] [-n] -f formula\n");
 		printf("	-n normalize tl formula and exit\n");
 		printf("	-n normalize tl formula and exit\n");
 		exit(1);
 		exit(1);
 	}
 	}
-	tl_parse();
+	tl_balanced();
+
+	if (tl_errs == 0)
+		tl_parse();
+
 	if (tl_verbose) tl_stats();
 	if (tl_verbose) tl_stats();
 	return tl_errs;
 	return tl_errs;
 }
 }

+ 6 - 1
sys/src/cmd/spin/tl_parse.c

@@ -15,7 +15,7 @@
 #include "tl.h"
 #include "tl.h"
 
 
 extern int	tl_yylex(void);
 extern int	tl_yylex(void);
-extern int	tl_verbose;
+extern int	tl_verbose, tl_errs;
 
 
 int	tl_yychar = 0;
 int	tl_yychar = 0;
 YYSTYPE	tl_yylval;
 YYSTYPE	tl_yylval;
@@ -391,5 +391,10 @@ tl_parse(void)
 		dump(n);
 		dump(n);
 		printf("\n");
 		printf("\n");
 	}
 	}
+	if (tl_Getchar() != -1)
+	{	tl_yyerror("syntax error");
+		tl_errs++;
+		return;
+	}
 	trans(n);
 	trans(n);
 }
 }

+ 5 - 5
sys/src/cmd/spin/vars.c

@@ -10,11 +10,7 @@
 /* Send all bug-reports and/or questions to: bugs@spinroot.com            */
 /* Send all bug-reports and/or questions to: bugs@spinroot.com            */
 
 
 #include "spin.h"
 #include "spin.h"
-#ifdef PC
-#include "y_tab.h"
-#else
 #include "y.tab.h"
 #include "y.tab.h"
-#endif
 
 
 extern Ordered	*all_names;
 extern Ordered	*all_names;
 extern RunList	*X, *LastX;
 extern RunList	*X, *LastX;
@@ -278,9 +274,13 @@ dumpglobals(void)
 void
 void
 dumplocal(RunList *r)
 dumplocal(RunList *r)
 {	static Lextok *dummy = ZN;
 {	static Lextok *dummy = ZN;
-	Symbol *z, *s = r->symtab;
+	Symbol *z, *s;
 	int i;
 	int i;
 
 
+	if (!r) return;
+
+	s = r->symtab;
+
 	if (!dummy)
 	if (!dummy)
 		dummy = nn(ZN, NAME, nn(ZN,CONST,ZN,ZN), ZN);
 		dummy = nn(ZN, NAME, nn(ZN,CONST,ZN,ZN), ZN);
 
 

+ 1 - 1
sys/src/cmd/spin/version.h

@@ -1 +1 @@
-#define Version	"Spin Version 4.2.5 -- 2 April 2005"
+#define Version	"Spin Version 4.3.0 -- 22 June 2007"