/* f4long.c (c)Copyright Sequiter Software Inc., 1988-1996.  All rights reserved. */

#include "d4all.h"
#ifndef S4UNIX
   #ifdef __TURBOC__
      #pragma hdrstop
   #endif
#endif

#ifndef S4OFF_WRITE
void S4FUNCTION f4assignLong( FIELD4 *field, const long lValue )
{
   CODE4 *c4 ;

   #ifdef S4VBASIC
      if ( c4parm_check( (void *)field, 3, E90516 ) )
         return ;
   #endif

   #ifdef E4PARM_HIGH
      if ( field == 0 )
      {
         error4( 0, e4parm_null, E90516 ) ;
         return ;
      }
      switch( field->type )
      {
         case r4log:
         #ifdef S4CLIENT_OR_FOX
            case r4system:
            case r4dateTime:
         #endif
            error4( field->data->codeBase, e4parm, E81409 ) ;
            return ;
         default:
            break ;
      }
   #endif

   c4 = field->data->codeBase ;

   if ( error4code( c4 ) < 0 )
      return ;

   #ifndef S4SERVER
      #ifndef S4OFF_ENFORCE_LOCK
         if ( c4->lockEnforce && field->data->recNum > 0L )
            if ( d4lockTest( field->data, field->data->recNum ) != 1 )
            {
               error4( c4, e4lock, E90516 ) ;
               return ;
            }
      #endif
   #endif

   switch ( field->type )
   {
      case r4date:
         date4assign( f4assignPtr( field ), lValue ) ;
         break ;
      #ifdef S4CLIENT_OR_FOX
         case r4int:
            f4assignInt( field, (int)lValue ) ;
            break ;
         case r4double:
            f4assignDouble( field, (double)lValue ) ;
            break ;
         case r4memo:
         case r4memoBin:
         case r4gen:
            if ( f4len( field ) == 4 )
               *((long *)f4assignPtr( field )) = lValue ;
            else
               c4ltoa45( lValue, f4assignPtr( field ), field->len ) ;
            break ;
      #endif
      default:
         if ( field->dec == 0 )
            c4ltoa45( lValue, f4assignPtr( field ), field->len ) ;
         else
            f4assignDouble( field, (double)lValue ) ;
         break ;
   }
}
#endif

long S4FUNCTION f4long( const FIELD4 *field )
{
   #ifdef S4CLIENT_OR_FOX
      const char *ptr ;
   #endif
   #ifdef S4VBASIC
      if ( c4parm_check( (void *)field, 3, E90517 ) )
         return 0L ;
   #endif

   #ifdef E4PARM_HIGH
      if ( field == 0 )
      {
         error4( 0, e4parm_null, E90517 ) ;
         return -1L ;
      }
      switch( field->type )
      {
         case r4log:
         #ifdef S4CLIENT_OR_FOX
            case r4system:
            case r4dateTime:
         #endif
            error4( field->data->codeBase, e4parm, E81409 ) ;
            return -1L ;
         default:
            break ;
      }
   #endif

   switch( field->type )
   {
      case r4date:
         return date4long( f4ptr( field ) ) ;
      #ifdef S4CLIENT_OR_FOX
         case r4memo:
         case r4memoBin:
         case r4gen:
            if ( f4len( field ) == 4 )
               return *((long *)f4ptr( field )) ;
            break ;
         case r4int:
            return (long)(*((int *)f4ptr( field ))) ;
         case r4double:
            return (long)(*((double *)f4ptr( field ))) ;
         case r4currency:
            ptr = f4currency( field, 0 ) ;
            return c4atol( ptr, strlen( ptr ) ) ;
      #endif
      default:
         break ;
   }

   return c4atol( f4ptr( field ), field->len ) ;
}