<<< MOVIES::DISK$SYSDATA:[NOTES$LIBRARY]DOLLAR_INFO.NOTE;1 >>> -< Dollar File System Information >- ================================================================================ Note 86.7 Additional Product Requirements 7 of 8 LEDER1::PETTENGILL "mulp" 116 lines 30-APR-1994 03:31 -< ctm_ssi_checksum.c >- -------------------------------------------------------------------------------- /* ***************************************************************************** ** * ** DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASSACHUSETTS. * ** COPYRIGHT © 1992 * ** ALL RIGHTS RESERVED. * ** * ** THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED * ** ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE * ** INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER * ** COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY * ** OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY * ** TRANSFERRED. * ** * ** THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE * ** AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT * ** CORPORATION. * ** * ** DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS * ** SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. * ** * ** * ****************************************************************************** */ /* ** Module: CTM_SSI_CHECKSUM ** ** Description: ** ** This Module contains a routine that computes a buffer's checksum ** and stores the results in the user defined aggregate. It also ** contains a routine that checks the validity of a transmitted ** checksum aggregate. ** ** Author: Stefano Santoro ** */ #define CTM_SSI_CHECKSUM #include "ctm_ssi_checksum" /* ** Routine: CmpChkSm (Compute CheckSum) ** ** Parameters: ** ** Bff: Buffer ** BffSz: Buffer Size ** ** Description: ** ** CmpChkSm computes the checksum of a buffer of BffSz lenght, ** and then formats the user defined Checksum aggregate ** ** Returns: ** ** The integer form of the computed checksum aggregate ** ** Author: Stefano Santoro ** */ unsigned int CmpChkSm( char *Bff, int BffSz) { T_ChkSmAgr ChkSm; unsigned int j, j1, c0, c1, j2; j1 = c0 = c1 = 0; while( j1 < BffSz) { j2 = (BffSz < (j1 + 4102) ? BffSz : (j1 + 4102)); for (j = j1; j < j2; j++) { c0 += Bff[j]; c1 += c0; }; c0 %= CHECKSUM_MODULO; c1 %= CHECKSUM_MODULO; j1 = j2; } ChkSm.ByChr[0] = (unsigned char)c0; ChkSm.ByChr[1] = (unsigned char)c1; ChkSm.ByWrd[1] = ~ChkSm.ByWrd[0]; return(ChkSm.ByInt); } /* ** Routine: VldChkSm (Validate CheckSum) ** ** Parameters: ** ** PrmChkSm: Checksum to be validated ** ** Description: ** ** VldChkSm validates the checksum aggregate by checking wether ** ones side one's complement is equal to the other side. ** ** Returns: ** ** 0: checksum aggregate is not valid ** 1: checksum aggregate is valid ** ** Author: Stefano Santoro ** */ int VldChkSm( unsigned int PrmChkSm) { T_ChkSmAgr ChkSm; ChkSm.ByInt = PrmChkSm; ChkSm.ByWrd[1] = ~ChkSm.ByWrd[1]; return (ChkSm.ByWrd[0] == ChkSm.ByWrd[1]); }