102 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| /* s4string.cpp/cxx (c)Copyright Sequiter Software Inc., 1988-1996.  All rights reserved. */
 | |
| 
 | |
| #include "d4all.hpp"
 | |
| #ifdef __TURBOC__
 | |
|    #pragma hdrstop
 | |
| #endif  /* __TUROBC__ */
 | |
| 
 | |
| static int  num_per_type[16] = { 8, 6, 4, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
 | |
| 
 | |
| static int  calc_type( unsigned l )
 | |
| {
 | |
|    long n = 16 ;
 | |
|    int  i = 0 ;
 | |
| 
 | |
|    while ( (long) l > n )
 | |
|    {
 | |
|       i++ ;
 | |
|       n <<= 1 ;
 | |
|    }
 | |
|    return i ;
 | |
| }
 | |
| 
 | |
| static unsigned calc_max( int i_type )
 | |
| {
 | |
|    unsigned result =  1 << (unsigned) (i_type+4) ;
 | |
|    if ( result <= 0xFE00 )
 | |
|       return result ;
 | |
|    return 0xFE00 ;
 | |
| }
 | |
| 
 | |
| Str4flex::Str4flex( Code4 &cb ) : Str4max(0,0)
 | |
| {
 | |
|    codeBase =  &cb ;
 | |
| }
 | |
| 
 | |
| Str4flex::Str4flex( Str4flex& a ) : Str4max(0,0)
 | |
| {
 | |
|    codeBase =  a.codeBase ;
 | |
|    if ( setLen( a.curLen ) < 0 )  return ;
 | |
|    memcpy( p, a.p, a.curLen ) ;
 | |
| }
 | |
| 
 | |
| Str4flex::~Str4flex()
 | |
| {
 | |
|    free() ;
 | |
| }
 | |
| 
 | |
| 
 | |
| void Str4flex::free()
 | |
| {
 | |
|    if ( p != 0 )
 | |
|    {
 | |
|       int i_type = calc_type( maxLen ) ;
 | |
|       mem4free( codeBase->string_types[i_type], p ) ;
 | |
|       p =  0 ;
 | |
|    }
 | |
|    curLen = 0  ;
 | |
| }
 | |
| 
 | |
| Str4flex::setMax( unsigned n )
 | |
| {
 | |
|    if ( codeBase->errorCode )  return -1 ;
 | |
|    if ( n >= UINT_MAX )  return error4( codeBase, e4memory, E61053 ) ;
 | |
| 
 | |
|    if ( n == 0 )
 | |
|    {
 | |
|       free() ;
 | |
|       return curLen =  maxLen =  0 ;
 | |
|    }
 | |
|    if ( curLen == 0 )  free() ;
 | |
| 
 | |
|    int i_type =  calc_type( n+1 ) ;
 | |
|    unsigned new_max =  calc_max(i_type)-1 ;
 | |
|    if ( new_max < n )  return error4( codeBase, e4memory, E61053 ) ;
 | |
| 
 | |
|    #ifdef E4DEBUG
 | |
|       if ( i_type > 16 )
 | |
|          error4( codeBase, e4parm, E61053 ) ;
 | |
|       if ( calc_type(new_max) != i_type )
 | |
|          error4( codeBase, e4parm, E61053 ) ;
 | |
|    #endif
 | |
| 
 | |
|    if ( codeBase->string_types[i_type] == 0 )
 | |
|    {
 | |
|       codeBase->string_types[i_type] = mem4create( 0, num_per_type[i_type], new_max+1, num_per_type[i_type], 0 ) ;
 | |
|       if ( codeBase->string_types[i_type] == 0 )  return error4( codeBase, e4memory, E61053 );
 | |
|    }
 | |
| 
 | |
|    char *new_p =  (char *) mem4alloc( codeBase->string_types[i_type] ) ;
 | |
|    if ( new_p == 0 )  return error4( codeBase, e4memory, E61053 ) ;
 | |
| 
 | |
|    if ( curLen > new_max )  curLen =  new_max ;
 | |
|    memcpy( new_p, p, curLen ) ;
 | |
| 
 | |
|    free() ;
 | |
|    maxLen =  new_max ;
 | |
|    p =  new_p ;
 | |
|    p[maxLen] =  0 ;
 | |
| 
 | |
|    return 0 ;
 | |
| }
 |