MACHINE               Rename_Server(TOK,inbufsize,outbufsize)

SEES                  String_TYPE, Bool_TYPE

VARIABLES             in,inptr,outptr,no_of_saves

INVARIANT

  in : 0..inbufsize &
  inptr : 0..in &
  outptr : 0..outbufsize &
  no_of_saves : NAT
   
INITIALISATION        in,inptr,outptr,no_of_saves := 0,0,0,0         

OPERATIONS


  /*** operation to initialise the socket ***/

  rep <-- Rename_INIT(lockfile : STRING & port : NAT & bufsavefile : STRING) =
  PRE size(lockfile) < 256 & size(bufsavefile) < 256 THEN rep :: BOOL END;



   /*** operations on the socket ***/

  rep <-- Rename_ACCEPT = BEGIN rep :: BOOL END; 

  rep,pp <-- Rename_READ  = 
  ANY bufsize WHERE  bufsize : 0..inbufsize THEN
    CHOICE
      rep := TRUE || pp := bufsize || in := bufsize || inptr := 0
    OR
      rep := FALSE || pp := 0
    END
  END;

  rep <-- Rename_WRITE = BEGIN rep :: BOOL || outptr := 0 END;

  rep <-- Rename_CLOSE = BEGIN rep :: BOOL END;



  /*** operations to read from the input buffer ***/

  tok <-- Rename_GET_TOK(toksize : 1..4 ) =  
  IF inptr+toksize <= in THEN
    tok :: TOK || inptr := inptr + toksize
  ELSE
    tok :: TOK
  END;

  ss <-- Rename_GET_STR = 
  IF inptr + 3 <= in THEN
    ANY str, newptr  WHERE
      str : STRING &  newptr = inptr + size(str) + 3
    THEN
      ss := str || inptr := newptr
    END
  ELSE
    ss :: STRING
  END;


  /*** operations to to write the output buffer ***/

  Rename_PUT_TOK(tok : TOK & toksize : 1..4 ) = 
  IF outptr+toksize <= outbufsize THEN
    outptr := outptr+toksize
  END;

  Rename_PUT_STR(ss:STRING) = 
  IF outptr+size(ss)+3 <= outbufsize THEN
    outptr := outptr+size(ss)+3 
  END; 



  /*** operations to get and set the input buffer pointer ***/

  Rename_SET_IN_PTR(ptr : NAT) = PRE ptr <= inptr THEN inptr := ptr END;

  ptr <-- Rename_GET_IN_PTR = BEGIN ptr := inptr END;



  /*** operations to get and set the output buffer pointer ***/

  Rename_SET_OUT_PTR(ptr : NAT) =  PRE ptr <= outptr THEN outptr := ptr END;

  ptr <-- Rename_GET_OUT_PTR = BEGIN ptr := outptr END;




  /*** Client initialisation ***/

  /* opens file, and appends its data until EOF to out_buf;
     then appends a null; gives FALSE if this fails.
  */
  rep <-- Rename_PUT_FILE(filename: STRING) = 
  CHOICE 
    rep := TRUE || outptr :: outptr..outbufsize
  OR  
    rep := FALSE  
  END;



  /*** Buffer saving and restoring ***/

  /* appends in_buf to bufsavefile of saved in buffers
  */
  rep, num_saves <-- Rename_SAV_BUF =
  CHOICE 
    rep := TRUE || num_saves := no_of_saves + 1 
  OR  
    rep := FALSE || num_saves := 0
  END;

  /* Empty bufsavefile
  */
  Rename_SAV_RMV = BEGIN no_of_saves := 0 END;

  /* returns TRUE if bufsavefile not empty, else returns FALSE
  */
  rep <-- Rename_RST_BUF = BEGIN rep :: BOOL END;
 
  /* restores next saved buffer in inbuf; returns FALSE if finished
  */
  rep <-- Rename_NXT_BUF = 
  SELECT true THEN  
    rep := FALSE
  WHEN no_of_saves > 0 THEN 
    no_of_saves := no_of_saves - 1 || rep := TRUE || 
    inptr := 0 || in :: 0..inbufsize
  END

END


Analysed Constructs

Hypertext Constructs Page

On-line Help

Help Contents Page
Index

Document Last Updated: Wed Aug 25 17:36:14 1999

B-Toolkit Beta 4.55