Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/* 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")
 * 
 */