compare.c

来自「详细介绍了一篇关于pci开发的接口芯片」· C语言 代码 · 共 154 行

C
154
字号
/* compare.c */


#include <stdtypes.h>
#include <clib1.h>
#include <string.h>
#include <stdio.h>

int compare(LONG length, VOID *addr1, VOID *addr2, \
    CHAR *err_string, WORD max_err_length, WORD flags)
/* "flags" is defined in clib1.h.

   Assumes that addr1 and addr2 can be accessed the same way (size-wise).
   For example, this allows WORD addr1 <-> LONG addr2 as long as
   dynamic bus sizing is supported.

   Entry:
   Exit:    <> if OK.
*/
{
   void *temp;

   if ( !length ) return(1);


   /* compare data from addr1 & addr2 */

   if ( !( (flags & ADDR1_SAME) || (flags & ADDR2_SAME) ) )
   /* both addresses increment */
   {
      switch( flags & SIZE_MASK )
      {
         case SIZE_BYTE:
            return ( bcompare( length, addr1, addr2, \
               err_string, max_err_length ) );

         case SIZE_WORD:
            return ( wcompare( length, addr1, addr2, \
               err_string, max_err_length ) );

         case SIZE_LONG:
            return ( lcompare( length, addr1, addr2, \
               err_string, max_err_length ) );

      }

   }


   if ( (flags & ADDR1_SAME) && !(flags & ADDR2_SAME) )
   /* ADDR1 does not increment */

   if ( !(flags & ADDR1_SAME) && (flags & ADDR2_SAME) )
   /* ADDR2 does not increment, so swap addr1/addr2 */
   {
      temp = addr1;
      addr2 = addr1;
      addr1 = temp;
   }

   switch( flags & SIZE_MASK )
   {
      case SIZE_BYTE:
         return ( bcompare_1( length, addr1, addr2, \
            err_string, max_err_length ) );

      case SIZE_WORD:
         return ( wcompare_1( length, addr1, addr2, \
            err_string, max_err_length ) );

      case SIZE_LONG:
         return ( lcompare_1( length, addr1, addr2, \
            err_string, max_err_length ) );

   }


   return(1);  /* OK */
}


int physical_compare(LONG length, UINT32 addr1, UINT32 addr2, \
    CHAR *err_string, WORD max_err_length, WORD flags)
/* "flags" is defined in clib1.h.

   Assumes that addr1 and addr2 can be accessed the same way (size-wise).
   For example, this allows WORD addr1 <-> LONG addr2 as long as
   dynamic bus sizing is supported.

   Entry:
   Exit:    <> if OK.
*/
{
   UINT32 temp;

   if ( !length ) return(1);


   /* compare data from addr1 & addr2 */

   if ( !( (flags & ADDR1_SAME) || (flags & ADDR2_SAME) ) )
   /* both addresses increment */
   {
      switch( flags & SIZE_MASK )
      {
         case SIZE_BYTE:
            return ( physical_bcompare( length, addr1, addr2, \
               err_string, max_err_length ) );

         case SIZE_WORD:
            return ( physical_wcompare( length, addr1, addr2, \
               err_string, max_err_length ) );

         case SIZE_LONG:
            return ( physical_lcompare( length, addr1, addr2, \
               err_string, max_err_length ) );

      }

   }


   if ( (flags & ADDR1_SAME) && !(flags & ADDR2_SAME) )
   /* ADDR1 does not increment */

   if ( !(flags & ADDR1_SAME) && (flags & ADDR2_SAME) )
   /* ADDR2 does not increment, so swap addr1/addr2 */
   {
      temp = addr1;
      addr2 = addr1;
      addr1 = temp;
   }

   switch( flags & SIZE_MASK )
   {
      case SIZE_BYTE:
         return ( physical_bcompare_1( length, addr1, addr2, \
            err_string, max_err_length ) );

      case SIZE_WORD:
         return ( physical_wcompare_1( length, addr1, addr2, \
            err_string, max_err_length ) );

      case SIZE_LONG:
         return ( physical_lcompare_1( length, addr1, addr2, \
            err_string, max_err_length ) );

   }


   return(1);  /* OK */
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?