@ -18,7 +18,7 @@ static const cl_I digits_to_I_base2 (const char * MSBptr, uintC len, uintD base) 
			
		 
		
	
		
			
				 
				 
				{  
				 
				 
				{  
			
		 
		
	
		
			
				 
				 
					// base is a power of two: write the digits from least significant
  
				 
				 
					// base is a power of two: write the digits from least significant
  
			
		 
		
	
		
			
				 
				 
					// to most significant into the result NUDS. Result needs
  
				 
				 
					// to most significant into the result NUDS. Result needs
  
			
		 
		
	
		
			
				 
				 
					// 1+ceiling(len*log(base)/(intDsize*log(2))) or some more digits
  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
					// 1+ceiling(len*log(base)/(intDsize*log(2))) or some more digits. 
  
			
		 
		
	
		
			
				 
				 
					CL_ALLOCA_STACK ;  
				 
				 
					CL_ALLOCA_STACK ;  
			
		 
		
	
		
			
				 
				 
					var  uintD *  erg_MSDptr ;  
				 
				 
					var  uintD *  erg_MSDptr ;  
			
		 
		
	
		
			
				 
				 
					var  uintC  erg_len ;  
				 
				 
					var  uintC  erg_len ;  
			
		 
		
	
	
		
			
				
					
						
							 
						 
					
					
						
							 
						 
					
					
				 
				@ -64,7 +64,7 @@ static const cl_I digits_to_I_base2 (const char * MSBptr, uintC len, uintD base) 
			
		 
		
	
		
			
				 
				 
				
 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				static  const  cl_I  digits_to_I_baseN  ( const  char  *  MSBptr ,  uintC  len ,  uintD  base )  
				 
				 
				static  const  cl_I  digits_to_I_baseN  ( const  char  *  MSBptr ,  uintC  len ,  uintD  base )  
			
		 
		
	
		
			
				 
				 
				{  
				 
				 
				{  
			
		 
		
	
		
			
				 
				 
					// base is not a power of two: Add digits one by one. Result nees
  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
					// base is not a power of two: Add digits one by one. Result need s
  
			
		 
		
	
		
			
				 
				 
					// 1+ceiling(len*log(base)/(intDsize*log(2))) or some more digits.
  
				 
				 
					// 1+ceiling(len*log(base)/(intDsize*log(2))) or some more digits.
  
			
		 
		
	
		
			
				 
				 
					CL_ALLOCA_STACK ;  
				 
				 
					CL_ALLOCA_STACK ;  
			
		 
		
	
		
			
				 
				 
					var  uintD *  erg_MSDptr ;  
				 
				 
					var  uintD *  erg_MSDptr ;  
			
		 
		
	
	
		
			
				
					
						
							 
						 
					
					
						
							 
						 
					
					
				 
				@ -121,19 +121,17 @@ static const cl_I digits_to_I_baseN (const char * MSBptr, uintC len, uintD base) 
			
		 
		
	
		
			
				 
				 
						var  uintD  factor  =  1 ;  
				 
				 
						var  uintD  factor  =  1 ;  
			
		 
		
	
		
			
				 
				 
						while  ( chx  <  power_table [ base - 2 ] . k  & &  len  >  0 )  {  
				 
				 
						while  ( chx  <  power_table [ base - 2 ] . k  & &  len  >  0 )  {  
			
		 
		
	
		
			
				 
				 
							var  uintB  ch  =  * ( const  uintB  * ) MSBptr ;  MSBptr + + ;  // next character
  
				 
				 
							var  uintB  ch  =  * ( const  uintB  * ) MSBptr ;  MSBptr + + ;  // next character
  
			
		 
		
	
		
			
				 
				 
							if  ( ch ! = ' . ' )  {  // skip decimal point
  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
								// Compute value of ('0'-'9','A'-'Z','a'-'z'):
  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
								ch  =  ch - ' 0 ' ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
								if  ( ch  >  ' 9 ' - ' 0 ' )  {  // not a digit?
  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
									ch  =  ch + ' 0 ' - ' A ' + 10 ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
									if  ( ch  >  ' Z ' - ' A ' + 10 )  { // not an uppercase letter?
  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
										ch  =  ch + ' A ' - ' a ' ;   // must be lowercase!
  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
									}  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
							// Compute value of ('0'-'9','A'-'Z','a'-'z'):
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
							ch  =  ch - ' 0 ' ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
							if  ( ch  >  ' 9 ' - ' 0 ' )  {  // not a digit?
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
								ch  =  ch + ' 0 ' - ' A ' + 10 ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
								if  ( ch  >  ' Z ' - ' A ' + 10 )  { // not an uppercase letter?
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
									ch  =  ch + ' A ' - ' a ' ;   // must be lowercase!
  
			
		 
		
	
		
			
				 
				 
								}  
				 
				 
								}  
			
		 
		
	
		
			
				 
				 
								factor  =  factor * base ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
								newdigit  =  base * newdigit + ch ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
								chx + + ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
							}  
				 
				 
							}  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
							factor  =  factor * base ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
							newdigit  =  base * newdigit + ch ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
							chx + + ;  
			
		 
		
	
		
			
				 
				 
							len - - ;  
				 
				 
							len - - ;  
			
		 
		
	
		
			
				 
				 
						}  
				 
				 
						}  
			
		 
		
	
		
			
				 
				 
						var  uintD  carry  =  mulusmall_loop_lsp ( factor , erg_LSDptr , erg_len , newdigit ) ;  
				 
				 
						var  uintD  carry  =  mulusmall_loop_lsp ( factor , erg_LSDptr , erg_len , newdigit ) ;  
			
		 
		
	
	
		
			
				
					
					
					
						
							 
						 
					
				 
				@ -146,32 +144,50 @@ static const cl_I digits_to_I_baseN (const char * MSBptr, uintC len, uintD base) 
			
		 
		
	
		
			
				 
				 
					return  NUDS_to_I ( erg_MSDptr , erg_len ) ;  
				 
				 
					return  NUDS_to_I ( erg_MSDptr , erg_len ) ;  
			
		 
		
	
		
			
				 
				 
				}  
				 
				 
				}  
			
		 
		
	
		
			
				 
				 
				
 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				static  const  cl_I  digits_to_I_divconq  ( const  char  *  MSBptr ,  uintC  len ,  uintD  base )  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				{  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
					// This is quite insensitive to the breakeven point.
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
					// On a 1GHz Athlon I get approximately:
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
					//   base  3: breakeven around 25000
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
					//   base 10: breakeven around  8000
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
					//   base 36: breakeven around  2000
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
					if  ( len > 80000 / base )  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
						// Divide-and-conquer:
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
						// Find largest i such that B = base^(k*2^i) satisfies B <= X.
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
						var  const  cached_power_table_entry  *  p ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
						var  uintC  len_B  =  power_table [ base - 2 ] . k ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
						for  ( uintC  i  =  0 ;  ;  i + + )  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
							p  =  cached_power ( base ,  i ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
							if  ( 2 * len_B  > =  len )  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
								break ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
							len_B  =  len_B * 2 ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
						}  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
							return  digits_to_I_divconq ( MSBptr , len - len_B , base )  *  p - > base_pow  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
							     +  digits_to_I_divconq ( MSBptr + len - len_B , len_B , base ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
					}  else  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
						return  digits_to_I_baseN ( MSBptr ,  len ,  base ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
					}  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				}  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
				
 
			
		 
		
	
		
			
				 
				 
				const  cl_I  digits_to_I  ( const  char  *  MSBptr ,  uintC  len ,  uintD  base )  
				 
				 
				const  cl_I  digits_to_I  ( const  char  *  MSBptr ,  uintC  len ,  uintD  base )  
			
		 
		
	
		
			
				 
				 
				{  
				 
				 
				{  
			
		 
		
	
		
			
				 
				 
					if  ( ( base  &  ( base - 1 ) )  = =  0 )  {  
				 
				 
					if  ( ( base  &  ( base - 1 ) )  = =  0 )  {  
			
		 
		
	
		
			
				 
				 
						return  digits_to_I_base2 ( MSBptr ,  len ,  base ) ;  
				 
				 
						return  digits_to_I_base2 ( MSBptr ,  len ,  base ) ;  
			
		 
		
	
		
			
				 
				 
					}  else  {  
				 
				 
					}  else  {  
			
		 
		
	
		
			
				 
				 
						// This is quite insensitive to the breakeven point.
  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
						// On a 1GHz Athlon I get approximately:
  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
						//   base  3: breakeven around 25000
  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
						//   base 10: breakeven around  8000
  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
						//   base 36: breakeven around  2000
  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
						if  ( len > 80000 / base )  {  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
							// Divide-and-conquer:
  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
							// Find largest i such that B = base^(k*2^i) satisfies B <= X.
  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
							var  const  cached_power_table_entry  *  p ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
							var  uintC  len_B  =  power_table [ base - 2 ] . k ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
							for  ( uintC  i  =  0 ;  ;  i + + )  {  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
								p  =  cached_power ( base ,  i ) ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
								if  ( 2 * len_B  > =  len )  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
									break ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
								len_B  =  len_B * 2 ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
				 
				 
				 
						// digits_to_I_divconq cannot handle decimal points, so remove it here
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
						CL_ALLOCA_STACK ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
						const  uintD  *  digits_copy ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
						num_stack_alloc ( len , , digits_copy = ) ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
						char  *  copy_ptr  =  ( char  * ) digits_copy ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
						uintC  n  =  0 ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
						for  ( uintC  i  =  0 ;  i  <  len ;  + + i )  {  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
							const  char  ch  =  MSBptr [ i ] ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
							if  ( ch  ! =  ' . ' )  {  // skip decimal point
  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
								copy_ptr [ n ]  =  ch ;  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
								n + + ;  
			
		 
		
	
		
			
				 
				 
							}  
				 
				 
							}  
			
		 
		
	
		
			
				 
				 
							return  digits_to_I ( MSBptr , len - len_B , base ) * p - > base_pow  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
							      + digits_to_I ( MSBptr + len - len_B , len_B , base ) ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
						}  else  {  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
							return  digits_to_I_baseN ( MSBptr ,  len ,  base ) ;  
				 
				 
				 
			
		 
		
	
		
			
				 
				 
						}  
				 
				 
						}  
			
		 
		
	
		
			
				 
				 
				 
				 
				 
						return  digits_to_I_divconq ( ( const  char * ) digits_copy ,  n ,  base ) ;  
			
		 
		
	
		
			
				 
				 
					}  
				 
				 
					}  
			
		 
		
	
		
			
				 
				 
				}  
				 
				 
				}