342 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			342 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* f4flag.c  (c)Copyright Sequiter Software Inc., 1988-1996.  All rights reserved. */
 | 
						|
 | 
						|
#include "d4all.h"
 | 
						|
#ifndef S4UNIX
 | 
						|
   #ifdef __TURBOC__
 | 
						|
      #pragma hdrstop
 | 
						|
   #endif
 | 
						|
#endif
 | 
						|
 | 
						|
int S4FUNCTION f4flagInit( F4FLAG *f4, CODE4 *c4, const unsigned long nFlags )
 | 
						|
{
 | 
						|
   #ifdef E4PARM_LOW
 | 
						|
      if ( f4 == 0 || c4 == 0 )
 | 
						|
         return error4( c4, e4parm, E90812 ) ;
 | 
						|
   #endif
 | 
						|
 | 
						|
   memset( (void *)f4, 0, sizeof(F4FLAG) ) ;
 | 
						|
 | 
						|
   if ( error4code( c4 ) < 0 )
 | 
						|
      return e4codeBase ;
 | 
						|
 | 
						|
   f4->codeBase = c4 ;
 | 
						|
   f4->numFlags = nFlags ;
 | 
						|
 | 
						|
   if ( nFlags == 0 )
 | 
						|
      return 0 ;
 | 
						|
 | 
						|
   f4->flags = (unsigned char *)u4allocFree( c4, nFlags / 8 + 2 ) ;
 | 
						|
   if ( f4->flags == 0 )
 | 
						|
      return error4stack( c4, e4memory, E90812 ) ;
 | 
						|
   return 0 ;
 | 
						|
}
 | 
						|
 | 
						|
int S4FUNCTION f4flagReset( F4FLAG *f4, const unsigned long flagNum )
 | 
						|
{
 | 
						|
   unsigned char lowVal, setVal ;
 | 
						|
   unsigned long highVal ;
 | 
						|
 | 
						|
   #ifdef E4PARM_LOW
 | 
						|
      if ( f4 == 0 )
 | 
						|
         return error4( f4->codeBase, e4parm, E90812 ) ;
 | 
						|
   #endif
 | 
						|
 | 
						|
   if ( error4code( f4->codeBase ) < 0 )
 | 
						|
   {
 | 
						|
      u4free( f4->flags ) ;
 | 
						|
      f4->flags = 0 ;
 | 
						|
      return e4codeBase ;
 | 
						|
   }
 | 
						|
 | 
						|
   #ifdef E4ANALYZE
 | 
						|
      if ( flagNum > f4->numFlags || f4->flags == 0 )
 | 
						|
         return error4( f4->codeBase, e4info, E90812 ) ;
 | 
						|
   #endif
 | 
						|
 | 
						|
   lowVal = (unsigned char) (flagNum & 0x7) ;
 | 
						|
   highVal = flagNum >> 3 ;
 | 
						|
   setVal = (unsigned char) (1 << lowVal) ;
 | 
						|
   setVal = (unsigned char) ~setVal ;
 | 
						|
 | 
						|
   f4->flags[highVal] = (char) (setVal & f4->flags[highVal]) ;
 | 
						|
 | 
						|
   return 0 ;
 | 
						|
}
 | 
						|
 | 
						|
int S4FUNCTION f4flagSet( F4FLAG *f4, const unsigned long flagNum )
 | 
						|
{
 | 
						|
   unsigned char lowVal, setVal ;
 | 
						|
   unsigned long highVal ;
 | 
						|
 | 
						|
   #ifdef E4PARM_LOW
 | 
						|
      if ( f4 == 0 )
 | 
						|
         return error4( f4->codeBase, e4parm, E90812 ) ;
 | 
						|
   #endif
 | 
						|
 | 
						|
   if ( error4code( f4->codeBase ) < 0 )
 | 
						|
   {
 | 
						|
      u4free( f4->flags ) ;
 | 
						|
      f4->flags = 0 ;
 | 
						|
      return e4codeBase ;
 | 
						|
   }
 | 
						|
 | 
						|
   #ifdef E4ANALYZE
 | 
						|
      if ( flagNum > f4->numFlags || f4->flags == 0 )
 | 
						|
         return error4( f4->codeBase, e4info, E90812 ) ;
 | 
						|
   #endif
 | 
						|
 | 
						|
   lowVal = (unsigned char) (flagNum & 0x7) ;
 | 
						|
   highVal = flagNum >> 3 ;
 | 
						|
   setVal = (unsigned char) (1 << lowVal) ;
 | 
						|
 | 
						|
   f4->flags[highVal] = (char)(setVal | f4->flags[highVal]) ;
 | 
						|
 | 
						|
   return 0 ;
 | 
						|
}
 | 
						|
 | 
						|
int S4FUNCTION f4flagSetRange( F4FLAG *f4, const unsigned long flagNum, const unsigned long numFlags )
 | 
						|
{
 | 
						|
   unsigned long iFlag ;
 | 
						|
   int rc ;
 | 
						|
 | 
						|
   #ifdef E4PARM_LOW
 | 
						|
      if ( f4 == 0 )
 | 
						|
         return error4( 0, e4parm, E90812 ) ;
 | 
						|
   #endif
 | 
						|
 | 
						|
   for ( iFlag = 0; iFlag < numFlags; iFlag++ )
 | 
						|
   {
 | 
						|
      rc = f4flagSet( f4, flagNum + iFlag ) ;
 | 
						|
      if ( rc < 0 )
 | 
						|
         return error4stack( f4->codeBase, (short)rc, E90812 ) ;
 | 
						|
   }
 | 
						|
   return 0 ;
 | 
						|
}
 | 
						|
 | 
						|
int S4FUNCTION f4flagIsSet( F4FLAG *f4, const unsigned long flagNum )
 | 
						|
{
 | 
						|
   unsigned char lowVal, retVal ;
 | 
						|
   unsigned long highVal ;
 | 
						|
 | 
						|
   #ifdef E4PARM_LOW
 | 
						|
      if ( f4 == 0 )
 | 
						|
         return error4( 0, e4parm, E90812 ) ;
 | 
						|
   #endif
 | 
						|
 | 
						|
   if ( error4code( f4->codeBase ) < 0 )
 | 
						|
   {
 | 
						|
      u4free( f4->flags ) ;
 | 
						|
      f4->flags = 0 ;
 | 
						|
      return e4codeBase ;
 | 
						|
   }
 | 
						|
 | 
						|
   #ifdef E4ANALYZE
 | 
						|
      if ( flagNum > f4->numFlags || f4->flags == 0 )
 | 
						|
         return error4( f4->codeBase, e4info, E90812 ) ;
 | 
						|
   #endif
 | 
						|
 | 
						|
   lowVal = (unsigned char) (flagNum & 0x7) ;
 | 
						|
   highVal = flagNum >> 3 ;
 | 
						|
   retVal = (unsigned char) ((1 << lowVal) & f4->flags[highVal])  ;
 | 
						|
 | 
						|
   return (int) retVal ;
 | 
						|
}
 | 
						|
 | 
						|
int S4FUNCTION f4flagIsAllSet( F4FLAG *f4, const unsigned long flagNum, const unsigned long nFlags )
 | 
						|
{
 | 
						|
   int rc ;
 | 
						|
   unsigned long iFlag, numFlags ;
 | 
						|
 | 
						|
   #ifdef E4PARM_LOW
 | 
						|
      if ( f4 == 0 )
 | 
						|
         return error4( 0, e4parm, E90812 ) ;
 | 
						|
   #endif
 | 
						|
 | 
						|
   if ( error4code( f4->codeBase ) < 0 )
 | 
						|
      numFlags = 1 ;
 | 
						|
   else
 | 
						|
      numFlags = nFlags ;
 | 
						|
 | 
						|
   for ( iFlag = flagNum; iFlag <= numFlags; iFlag++ )
 | 
						|
   {
 | 
						|
      rc = f4flagIsSet( f4, iFlag ) ;
 | 
						|
      if ( rc < 0 )
 | 
						|
         return error4stack( f4->codeBase, (short)rc, E90812 ) ;
 | 
						|
      if ( rc == 0 )
 | 
						|
         return 0 ;
 | 
						|
   }
 | 
						|
   return 1 ;
 | 
						|
}
 | 
						|
 | 
						|
int S4FUNCTION f4flagIsAnySet( F4FLAG *f4, const unsigned long flagNum, const unsigned long nFlags )
 | 
						|
{
 | 
						|
   int rc ;
 | 
						|
   unsigned long iFlag, numFlags ;
 | 
						|
 | 
						|
   #ifdef E4PARM_LOW
 | 
						|
      if ( f4 == 0 )
 | 
						|
         return error4( 0, e4parm, E90812 ) ;
 | 
						|
   #endif
 | 
						|
 | 
						|
   if ( error4code( f4->codeBase ) < 0 )
 | 
						|
      numFlags = 1 ;
 | 
						|
   else
 | 
						|
      numFlags = nFlags ;
 | 
						|
 | 
						|
   for ( iFlag = flagNum; iFlag <= numFlags; iFlag++ )
 | 
						|
      if ( (rc = f4flagIsSet( f4, iFlag )) < 0 )
 | 
						|
         return error4stack( f4->codeBase, (short)rc, E90812 ) ;
 | 
						|
   return 0 ;
 | 
						|
}
 | 
						|
 | 
						|
int S4FUNCTION f4flagAnd( F4FLAG *flagPtr, const F4FLAG *andPtr )
 | 
						|
{
 | 
						|
   unsigned numBytes ;
 | 
						|
 | 
						|
   #ifdef E4PARM_LOW
 | 
						|
      if ( flagPtr == 0 || andPtr == 0 )
 | 
						|
         return error4( 0, e4parm_null, E90812 ) ;
 | 
						|
   #endif
 | 
						|
 | 
						|
   if ( andPtr->numFlags == 0 )
 | 
						|
   {
 | 
						|
      if ( flagPtr->numFlags == 0 )
 | 
						|
         return 0 ;
 | 
						|
      if ( flagPtr->isFlip != andPtr->isFlip )
 | 
						|
         memset( (void *)flagPtr->flags, 1, (unsigned)((flagPtr->numFlags) / 8L + 2L ) ) ;
 | 
						|
      else
 | 
						|
         memset( (void *)flagPtr->flags, 0, (unsigned)((flagPtr->numFlags) / 8L + 2L ) ) ;
 | 
						|
      return 0 ;
 | 
						|
   }
 | 
						|
 | 
						|
   #ifdef E4ANALYZE
 | 
						|
      if ( flagPtr->numFlags != andPtr->numFlags )
 | 
						|
         return error4( flagPtr->codeBase, e4result, E90812 ) ;
 | 
						|
   #endif
 | 
						|
 | 
						|
   numBytes = (unsigned)((flagPtr->numFlags+7)/8) ;
 | 
						|
 | 
						|
   #ifdef E4ANALYZE
 | 
						|
      if ( flagPtr->numFlags != andPtr->numFlags )
 | 
						|
         return error4( flagPtr->codeBase, e4result, E90812 ) ;
 | 
						|
      if ( (unsigned long)numBytes != ( flagPtr->numFlags + 7L) / 8L )
 | 
						|
         return error4( flagPtr->codeBase, e4info, E90812 ) ;
 | 
						|
   #endif
 | 
						|
 | 
						|
   if ( flagPtr->isFlip != andPtr->isFlip )
 | 
						|
   {
 | 
						|
      if ( flagPtr->isFlip == 1 )
 | 
						|
      {
 | 
						|
         flagPtr->isFlip = 0 ;
 | 
						|
         do
 | 
						|
         {
 | 
						|
            flagPtr->flags[numBytes] = (unsigned char) (~flagPtr->flags[numBytes] & andPtr->flags[numBytes]) ;
 | 
						|
         } while (numBytes-- != 0 ) ;
 | 
						|
      }
 | 
						|
      else
 | 
						|
         do
 | 
						|
         {
 | 
						|
            flagPtr->flags[numBytes] &= ~andPtr->flags[numBytes] ;
 | 
						|
         } while (numBytes-- != 0 ) ;
 | 
						|
   }
 | 
						|
   else
 | 
						|
   {
 | 
						|
      if ( flagPtr->isFlip == 1 )
 | 
						|
      {
 | 
						|
         flagPtr->isFlip = 0 ;
 | 
						|
         do
 | 
						|
         {
 | 
						|
            flagPtr->flags[numBytes] = (unsigned char) (~flagPtr->flags[numBytes] & ~andPtr->flags[numBytes]) ;
 | 
						|
         } while (numBytes-- != 0 ) ;
 | 
						|
      }
 | 
						|
      else
 | 
						|
         do
 | 
						|
         {
 | 
						|
            flagPtr->flags[numBytes] &= andPtr->flags[numBytes] ;
 | 
						|
         } while (numBytes-- != 0 ) ;
 | 
						|
   }
 | 
						|
 | 
						|
   return 0 ;
 | 
						|
}
 | 
						|
 | 
						|
int S4FUNCTION f4flagOr( F4FLAG *flagPtr, const F4FLAG *orPtr )
 | 
						|
{
 | 
						|
   unsigned numBytes ;
 | 
						|
 | 
						|
   #ifdef E4PARM_LOW
 | 
						|
      if ( flagPtr == 0 || orPtr == 0 )
 | 
						|
         return error4( 0, e4parm_null, E90812 ) ;
 | 
						|
   #endif
 | 
						|
 | 
						|
   if ( orPtr->numFlags == 0 )
 | 
						|
      return 0 ;
 | 
						|
 | 
						|
   numBytes = (unsigned)(flagPtr->numFlags / 8L + 1L ) ;
 | 
						|
 | 
						|
   #ifdef E4ANALYZE
 | 
						|
      if ( flagPtr->numFlags != orPtr->numFlags )
 | 
						|
         return error4( flagPtr->codeBase, e4result, E90812 ) ;
 | 
						|
      if ( (unsigned long)numBytes != ( flagPtr->numFlags / 8L + 1L ) )
 | 
						|
         return error4( flagPtr->codeBase, e4info, E90812 ) ;
 | 
						|
   #endif
 | 
						|
   if ( flagPtr->isFlip != orPtr->isFlip )
 | 
						|
   {
 | 
						|
      if ( flagPtr->isFlip == 1 )
 | 
						|
      {
 | 
						|
         flagPtr->isFlip = 0 ;
 | 
						|
         do
 | 
						|
         {
 | 
						|
           flagPtr->flags[numBytes] = (unsigned char) (~flagPtr->flags[numBytes] | orPtr->flags[numBytes]) ;
 | 
						|
         } while (numBytes-- != 0 ) ;
 | 
						|
      }
 | 
						|
      else
 | 
						|
         do
 | 
						|
         {
 | 
						|
            flagPtr->flags[numBytes] |= ~orPtr->flags[numBytes] ;
 | 
						|
         } while (numBytes-- != 0 ) ;
 | 
						|
   }
 | 
						|
   else
 | 
						|
   {
 | 
						|
      if ( flagPtr->isFlip == 1 )
 | 
						|
      {
 | 
						|
         flagPtr->isFlip = 0 ;
 | 
						|
         do
 | 
						|
         {
 | 
						|
            flagPtr->flags[numBytes] = (unsigned char)(~flagPtr->flags[numBytes] | ~orPtr->flags[numBytes]) ;
 | 
						|
         } while (numBytes-- != 0 ) ;
 | 
						|
      }
 | 
						|
      else
 | 
						|
         do
 | 
						|
         {
 | 
						|
            flagPtr->flags[numBytes] |= orPtr->flags[numBytes] ;
 | 
						|
         } while (numBytes-- != 0 ) ;
 | 
						|
   }
 | 
						|
   return 0 ;
 | 
						|
}
 | 
						|
 | 
						|
void S4FUNCTION f4flagFlipReturns( F4FLAG *flagPtr )
 | 
						|
{
 | 
						|
   #ifdef E4PARM_LOW
 | 
						|
      if ( flagPtr == 0 )
 | 
						|
      {
 | 
						|
         error4( 0, e4parm_null, E90812 ) ;
 | 
						|
         return ;
 | 
						|
      }
 | 
						|
   #endif
 | 
						|
 | 
						|
   flagPtr->isFlip = !flagPtr->isFlip ;
 | 
						|
}
 | 
						|
 | 
						|
void S4FUNCTION f4flagSetAll( F4FLAG *flagPtr )
 | 
						|
{
 | 
						|
   #ifdef E4PARM_LOW
 | 
						|
      if ( flagPtr == 0 )
 | 
						|
      {
 | 
						|
         error4( 0, e4parm_null, E90812 ) ;
 | 
						|
         return ;
 | 
						|
      }
 | 
						|
   #endif
 | 
						|
 | 
						|
   memset( (void *)flagPtr->flags, 0xFF, (unsigned)((flagPtr->numFlags+7)/8) ) ;
 | 
						|
}
 |