| /* VERSION 1 introduces plumbing |
| 2 increases SNARFSIZE from 4096 to 32000 |
| */ |
| #define VERSION 2 |
| |
| #define TBLOCKSIZE 512 /* largest piece of text sent to terminal */ |
| #define DATASIZE (UTFmax*TBLOCKSIZE+30) /* ... including protocol header stuff */ |
| #define SNARFSIZE 32000 /* maximum length of exchanged snarf buffer, must fit in 15 bits */ |
| /* |
| * Messages originating at the terminal |
| */ |
| typedef enum Tmesg |
| { |
| Tversion, /* version */ |
| Tstartcmdfile, /* terminal just opened command frame */ |
| Tcheck, /* ask host to poke with Hcheck */ |
| Trequest, /* request data to fill a hole */ |
| Torigin, /* gimme an Horigin near here */ |
| Tstartfile, /* terminal just opened a file's frame */ |
| Tworkfile, /* set file to which commands apply */ |
| Ttype, /* add some characters, but terminal already knows */ |
| Tcut, |
| Tpaste, |
| Tsnarf, |
| Tstartnewfile, /* terminal just opened a new frame */ |
| Twrite, /* write file */ |
| Tclose, /* terminal requests file close; check mod. status */ |
| Tlook, /* search for literal current text */ |
| Tsearch, /* search for last regular expression */ |
| Tsend, /* pretend he typed stuff */ |
| Tdclick, /* double click */ |
| Tstartsnarf, /* initiate snarf buffer exchange */ |
| Tsetsnarf, /* remember string in snarf buffer */ |
| Tack, /* acknowledge Hack */ |
| Texit, /* exit */ |
| Tplumb, /* send plumb message */ |
| TMAX |
| }Tmesg; |
| /* |
| * Messages originating at the host |
| */ |
| typedef enum Hmesg |
| { |
| Hversion, /* version */ |
| Hbindname, /* attach name[0] to text in terminal */ |
| Hcurrent, /* make named file the typing file */ |
| Hnewname, /* create "" name in menu */ |
| Hmovname, /* move file name in menu */ |
| Hgrow, /* insert space in rasp */ |
| Hcheck0, /* see below */ |
| Hcheck, /* ask terminal to check whether it needs more data */ |
| Hunlock, /* command is finished; user can do things */ |
| Hdata, /* store this data in previously allocated space */ |
| Horigin, /* set origin of file/frame in terminal */ |
| Hunlockfile, /* unlock file in terminal */ |
| Hsetdot, /* set dot in terminal */ |
| Hgrowdata, /* Hgrow + Hdata folded together */ |
| Hmoveto, /* scrolling, context search, etc. */ |
| Hclean, /* named file is now 'clean' */ |
| Hdirty, /* named file is now 'dirty' */ |
| Hcut, /* remove space from rasp */ |
| Hsetpat, /* set remembered regular expression */ |
| Hdelname, /* delete file name from menu */ |
| Hclose, /* close file and remove from menu */ |
| Hsetsnarf, /* remember string in snarf buffer */ |
| Hsnarflen, /* report length of implicit snarf */ |
| Hack, /* request acknowledgement */ |
| Hexit, |
| Hplumb, /* return plumb message to terminal - version 1 */ |
| HMAX |
| }Hmesg; |
| typedef struct Header{ |
| uchar type; /* one of the above */ |
| uchar count0; /* low bits of data size */ |
| uchar count1; /* high bits of data size */ |
| uchar data[1]; /* variable size */ |
| }Header; |
| |
| /* |
| * File transfer protocol schematic, a la Holzmann |
| * #define N 6 |
| * |
| * chan h = [4] of { mtype }; |
| * chan t = [4] of { mtype }; |
| * |
| * mtype = { Hgrow, Hdata, |
| * Hcheck, Hcheck0, |
| * Trequest, Tcheck, |
| * }; |
| * |
| * active proctype host() |
| * { byte n; |
| * |
| * do |
| * :: n < N -> n++; t!Hgrow |
| * :: n == N -> n++; t!Hcheck0 |
| * |
| * :: h?Trequest -> t!Hdata |
| * :: h?Tcheck -> t!Hcheck |
| * od |
| * } |
| * |
| * active proctype term() |
| * { |
| * do |
| * :: t?Hgrow -> h!Trequest |
| * :: t?Hdata -> skip |
| * :: t?Hcheck0 -> h!Tcheck |
| * :: t?Hcheck -> |
| * if |
| * :: h!Trequest -> progress: h!Tcheck |
| * :: break |
| * fi |
| * od; |
| * printf("term exits\n") |
| * } |
| * |
| * From: gerard@research.bell-labs.com |
| * Date: Tue Jul 17 13:47:23 EDT 2001 |
| * To: rob@research.bell-labs.com |
| * |
| * spin -c (or -a) spec |
| * pcc -DNP -o pan pan.c |
| * pan -l |
| * |
| * proves that there are no non-progress cycles |
| * (infinite executions *not* passing through |
| * the statement marked with a label starting |
| * with the prefix "progress") |
| * |
| */ |