Blob


1 /* VERSION 1 introduces plumbing
2 2 increases SNARFSIZE from 4096 to 32000
3 */
4 #define VERSION 2
6 #define TBLOCKSIZE 512 /* largest piece of text sent to terminal */
7 #define DATASIZE (UTFmax*TBLOCKSIZE+30) /* ... including protocol header stuff */
8 #define SNARFSIZE 32000 /* maximum length of exchanged snarf buffer, must fit in 15 bits */
9 /*
10 * Messages originating at the terminal
11 */
12 typedef enum Tmesg
13 {
14 Tversion, /* version */
15 Tstartcmdfile, /* terminal just opened command frame */
16 Tcheck, /* ask host to poke with Hcheck */
17 Trequest, /* request data to fill a hole */
18 Torigin, /* gimme an Horigin near here */
19 Tstartfile, /* terminal just opened a file's frame */
20 Tworkfile, /* set file to which commands apply */
21 Ttype, /* add some characters, but terminal already knows */
22 Tcut,
23 Tpaste,
24 Tsnarf,
25 Tstartnewfile, /* terminal just opened a new frame */
26 Twrite, /* write file */
27 Tclose, /* terminal requests file close; check mod. status */
28 Tlook, /* search for literal current text */
29 Tsearch, /* search for last regular expression */
30 Tsend, /* pretend he typed stuff */
31 Tdclick, /* double click */
32 Tstartsnarf, /* initiate snarf buffer exchange */
33 Tsetsnarf, /* remember string in snarf buffer */
34 Tack, /* acknowledge Hack */
35 Texit, /* exit */
36 Tplumb, /* send plumb message */
37 TMAX
38 }Tmesg;
39 /*
40 * Messages originating at the host
41 */
42 typedef enum Hmesg
43 {
44 Hversion, /* version */
45 Hbindname, /* attach name[0] to text in terminal */
46 Hcurrent, /* make named file the typing file */
47 Hnewname, /* create "" name in menu */
48 Hmovname, /* move file name in menu */
49 Hgrow, /* insert space in rasp */
50 Hcheck0, /* see below */
51 Hcheck, /* ask terminal to check whether it needs more data */
52 Hunlock, /* command is finished; user can do things */
53 Hdata, /* store this data in previously allocated space */
54 Horigin, /* set origin of file/frame in terminal */
55 Hunlockfile, /* unlock file in terminal */
56 Hsetdot, /* set dot in terminal */
57 Hgrowdata, /* Hgrow + Hdata folded together */
58 Hmoveto, /* scrolling, context search, etc. */
59 Hclean, /* named file is now 'clean' */
60 Hdirty, /* named file is now 'dirty' */
61 Hcut, /* remove space from rasp */
62 Hsetpat, /* set remembered regular expression */
63 Hdelname, /* delete file name from menu */
64 Hclose, /* close file and remove from menu */
65 Hsetsnarf, /* remember string in snarf buffer */
66 Hsnarflen, /* report length of implicit snarf */
67 Hack, /* request acknowledgement */
68 Hexit,
69 Hplumb, /* return plumb message to terminal - version 1 */
70 HMAX
71 }Hmesg;
72 typedef struct Header{
73 uchar type; /* one of the above */
74 uchar count0; /* low bits of data size */
75 uchar count1; /* high bits of data size */
76 uchar data[1]; /* variable size */
77 }Header;
79 /*
80 * File transfer protocol schematic, a la Holzmann
81 * #define N 6
82 *
83 * chan h = [4] of { mtype };
84 * chan t = [4] of { mtype };
85 *
86 * mtype = { Hgrow, Hdata,
87 * Hcheck, Hcheck0,
88 * Trequest, Tcheck,
89 * };
90 *
91 * active proctype host()
92 * { byte n;
93 *
94 * do
95 * :: n < N -> n++; t!Hgrow
96 * :: n == N -> n++; t!Hcheck0
97 *
98 * :: h?Trequest -> t!Hdata
99 * :: h?Tcheck -> t!Hcheck
100 * od
101 * }
103 * active proctype term()
104 * {
105 * do
106 * :: t?Hgrow -> h!Trequest
107 * :: t?Hdata -> skip
108 * :: t?Hcheck0 -> h!Tcheck
109 * :: t?Hcheck ->
110 * if
111 * :: h!Trequest -> progress: h!Tcheck
112 * :: break
113 * fi
114 * od;
115 * printf("term exits\n")
116 * }
118 * From: gerard@research.bell-labs.com
119 * Date: Tue Jul 17 13:47:23 EDT 2001
120 * To: rob@research.bell-labs.com
122 * spin -c (or -a) spec
123 * pcc -DNP -o pan pan.c
124 * pan -l
126 * proves that there are no non-progress cycles
127 * (infinite executions *not* passing through
128 * the statement marked with a label starting
129 * with the prefix "progress")
131 */