-- FTPUserHot.mesa, Edit: HGM July 31, 1980  5:34 PM  

-- Copyright  Xerox Corporation 1979, 1980

DIRECTORY
  Inline USING [DIVMOD],
  FTPDefs,
  FTPPrivateDefs;

FTPUserHot: PROGRAM
  IMPORTS Inline, FTPPrivateDefs EXPORTS FTPPrivateDefs SHARES FTPDefs =
  BEGIN OPEN FTPDefs, FTPPrivateDefs;


  -- **********************!  Byte Primitive  !***********************

  AdvanceBytePointer: PUBLIC PROCEDURE [
    bytePointer: BytePointer, byteCount: CARDINAL] =
    BEGIN
    -- local variables
    wordCount: CARDINAL;
    -- update count
    bytePointer.count ← bytePointer.count - byteCount;
    -- update offset
    [wordCount, byteCount] ← Inline.DIVMOD[byteCount, bytesPerWord];
    IF byteCount = 1 THEN bytePointer.offset ← ~bytePointer.offset;
    -- update address
    bytePointer.address ←
      bytePointer.address + wordCount +
        (IF byteCount = 1 AND ~bytePointer.offset THEN 1 ELSE 0);
    END;


  -- **********************!  State Verification Primitive  !***********************

  FTPUserIsNil: ERROR = CODE;

  VerifyPurposeAndState: PUBLIC PROCEDURE [
    ftpuser: FTPUser, expectedPurpose: Purpose, expectedState: UserState] =
    BEGIN OPEN ftpuser;
    IF ftpuser = NIL THEN ERROR FTPUserIsNil;
    -- verify connection purpose
    SELECT expectedPurpose FROM
      files => IF purpose = mail THEN Abort[connectionNotOpenedForFiles];
      mail => IF purpose = files THEN Abort[connectionNotOpenedForMail];
      ENDCASE;
    -- verify connection state
    IF state # expectedState THEN
      Abort[
        IF state = unconnected THEN noConnectionEstablished
        ELSE illegalProcedureCallSequence];
    END;


  END. -- of FTPUserCommon