which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@976 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			208 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			208 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /*  c4bcd.c   (c)Copyright Sequiter Software Inc., 1990-1994.  All rights reserved. */
 | |
| /*                binary digit is:   xxxx xxxx  xxxx xx01                */
 | |
| /*                                   sig dig    |||| ||||                */
 | |
| /*                                              |||| ||always 01         */
 | |
| /*                                              |length                  */
 | |
| /*                                              sign                     */
 | |
| 
 | |
| #include "d4all.h"
 | |
| #ifndef S4UNIX
 | |
| #ifdef __TURBOC__
 | |
| #pragma hdrstop
 | |
| #endif  /* __TUROBC__ */
 | |
| #endif  /* S4UNIX */
 | |
| 
 | |
| #ifdef S4MDX
 | |
| 
 | |
| /* MDX */
 | |
| int S4CALL c4bcd_cmp( S4CMP_PARM a_ptr, S4CMP_PARM b_ptr, size_t dummy_len )
 | |
| {
 | |
|   int a_sign, b_sign, a_len, b_len, a_sig_dig, b_sig_dig, compare_len, rc ;
 | |
| 
 | |
|   if ( ((C4BCD *)a_ptr)->digit_info  & 0x80 )  /* get digit sign */
 | |
|     a_sign = -1 ;
 | |
|   else
 | |
|     a_sign =  1 ;
 | |
| 
 | |
|   if ( ((C4BCD *)b_ptr)->digit_info & 0x80 )
 | |
|     b_sign = -1 ;
 | |
|   else
 | |
|     b_sign =  1 ;
 | |
| 
 | |
|   if ( a_sign != b_sign )
 | |
|     return a_sign ;
 | |
| 
 | |
|   a_len = ( (((C4BCD *)a_ptr)->digit_info >> 2) & 0x1F ) ; /* get digit length */
 | |
|   b_len = ( (((C4BCD *)b_ptr)->digit_info >> 2) & 0x1F ) ;
 | |
| 
 | |
|   if ( a_len == 0 )
 | |
|     a_sig_dig = 0 ;
 | |
|   else
 | |
|     a_sig_dig = ((C4BCD *)a_ptr)->sig_dig ;  /* get digit significant digit */
 | |
| 
 | |
|   if ( b_len == 0 )
 | |
|     b_sig_dig = 0 ;
 | |
|   else
 | |
|     b_sig_dig = ((C4BCD *)b_ptr)->sig_dig ;
 | |
| 
 | |
|   if ( a_sig_dig != b_sig_dig )
 | |
|   {
 | |
|     if ( a_sig_dig < b_sig_dig )
 | |
|       return -a_sign ;
 | |
|     else
 | |
|       return a_sign ;
 | |
|   }
 | |
| 
 | |
|   compare_len = (a_len < b_len) ? b_len : a_len ;  /* Use Max */
 | |
| 
 | |
|   compare_len = (compare_len+1)/2 ;
 | |
| 
 | |
|   rc = c4memcmp( ((C4BCD *)a_ptr)->bcd, ((C4BCD *)b_ptr)->bcd, compare_len ) ;
 | |
|   if ( a_sign < 0 )  return -rc ;
 | |
| 
 | |
|   return rc ;
 | |
| }
 | |
| 
 | |
| /* MDX */
 | |
| void c4bcd_from_a( char *result, char *input_ptr, int input_ptr_len )
 | |
| {
 | |
|   char *ptr ;
 | |
|   unsigned len ;
 | |
|   int n, last_pos, pos, is_before_dec, zero_count ;
 | |
| 
 | |
|   memset( result, 0, sizeof(C4BCD) ) ;
 | |
| 
 | |
|   last_pos = input_ptr_len - 1 ;
 | |
|   pos = 0 ;
 | |
|   for ( ; pos <= last_pos; pos++ )
 | |
|     if ( input_ptr[pos] != ' ' )  break ;
 | |
| 
 | |
|   if ( pos <= last_pos )
 | |
|   {
 | |
|     if ( input_ptr[pos] == '-' )
 | |
|     {
 | |
|       ((C4BCD *)result)->digit_info=(unsigned char)((int)((C4BCD *)result)->digit_info | 0x80) ;
 | |
|       pos++ ;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       if ( input_ptr[pos] == '+' )  pos++ ;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   for ( ; pos <= last_pos; pos++ )
 | |
|     if ( input_ptr[pos] != ' ' && input_ptr[pos] != '0' )  break ;
 | |
| 
 | |
|   is_before_dec = 1 ;
 | |
| 
 | |
|   ((C4BCD *)result)->sig_dig = 0x34 ;
 | |
|   if ( pos <= last_pos )
 | |
|     if ( input_ptr[pos] == '.' )
 | |
|     {
 | |
|       is_before_dec = 0 ;
 | |
|       pos++ ;
 | |
|       for ( ; pos <= last_pos; pos++ )
 | |
|       {
 | |
|         if ( input_ptr[pos] != '0' )  break ;
 | |
|         ((C4BCD *)result)->sig_dig-- ;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|   ptr = (char *) ((C4BCD *)result)->bcd ; ;
 | |
|   zero_count = 0 ;
 | |
| 
 | |
|   for ( n=0; pos <= last_pos; pos++ )
 | |
|   {
 | |
|     if ( input_ptr[pos] >= '0' && input_ptr[pos] <= '9' )
 | |
|     {
 | |
|       if ( input_ptr[pos] == '0' )
 | |
|         zero_count++ ;
 | |
|       else
 | |
|         zero_count = 0 ;
 | |
|       if ( n >= 20 )  break ;
 | |
|       if ( n & 1 )
 | |
|         *ptr++ |= input_ptr[pos] - '0' ;
 | |
|       else
 | |
|         *ptr += (unsigned char)( (unsigned char)((unsigned char)input_ptr[pos] - (unsigned char)'0') << 4 ) ;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       if ( input_ptr[pos] != '.'  ||  ! is_before_dec )
 | |
|         break ;
 | |
| 
 | |
|       is_before_dec = 0 ;
 | |
|       continue ;
 | |
|     }
 | |
|     if ( is_before_dec )
 | |
|       ((C4BCD *)result)->sig_dig++ ;
 | |
| 
 | |
|     n++ ;
 | |
|   }
 | |
|   /* 'always one' bit filled  */
 | |
|   ((C4BCD *)result)->digit_info = (unsigned char)( ((C4BCD *)result)->digit_info | 0x1 ) ;
 | |
| 
 | |
| #ifdef S4DEBUG
 | |
|   if ( n - zero_count < 0 )
 | |
|     e4severe( e4info, E4_C4BCD_FROM_A ) ;
 | |
| #endif
 | |
| 
 | |
|   len = n - zero_count ;
 | |
|   if (len > 31)
 | |
|     len = 31 ;
 | |
| 
 | |
|   ((C4BCD *)result)->digit_info = (unsigned char)( ((C4BCD *)result)->digit_info | (len << 2) ) ;
 | |
| 
 | |
|   if ( len == 0 )
 | |
|     ((C4BCD *)result)->digit_info = (unsigned char)( ((C4BCD *)result)->digit_info & 0x7F ) ;
 | |
| }
 | |
| 
 | |
| /* MDX */
 | |
| void  c4bcd_from_d( char *result, double doub )
 | |
| {
 | |
|   char  temp_str[258], *ptr ;
 | |
|   int   sign, dec, len, pos ;
 | |
| 
 | |
| #ifdef S4NO_ECVT
 | |
|   ptr = f4ecvt( doub, E4ACCURACY_DIGITS, &dec, &sign ) ;
 | |
| #else
 | |
|   ptr = ecvt( doub, E4ACCURACY_DIGITS, &dec, &sign ) ;
 | |
| #endif
 | |
| 
 | |
|   if ( sign )
 | |
|   {
 | |
|     pos = 1 ;
 | |
|     temp_str[0] = '-' ;
 | |
|   }
 | |
|   else
 | |
|     pos = 0 ;
 | |
| 
 | |
|   if ( dec < 0 )
 | |
|   {
 | |
|     dec = -dec ;
 | |
|     len = dec+1+pos ;
 | |
|     memcpy( temp_str+len, ptr, E4ACCURACY_DIGITS ) ;
 | |
|     memset( temp_str+pos, '0', len-pos ) ;
 | |
|     temp_str[pos] = '.' ;
 | |
| 
 | |
|     c4bcd_from_a( result, temp_str, E4ACCURACY_DIGITS + len ) ;
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     memcpy( temp_str+pos, ptr, dec ) ;
 | |
|     pos += dec ;
 | |
|     if ( dec < E4ACCURACY_DIGITS )
 | |
|     {
 | |
|       temp_str[pos++] = '.' ;
 | |
| 
 | |
|       len = E4ACCURACY_DIGITS - dec ;
 | |
|       memcpy( temp_str+pos, ptr+dec, len ) ;
 | |
|       pos += len ;
 | |
|     }
 | |
|     c4bcd_from_a( result, temp_str, pos ) ;
 | |
|   }
 | |
| }
 | |
| 
 | |
| #endif  /* S4MDX */
 | |
| 
 | |
| 
 |