-- 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