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
106 lines
2.1 KiB
C++
Executable File
106 lines
2.1 KiB
C++
Executable File
/* s4string.cpp (c)Copyright Sequiter Software Inc., 1990-1991. All rights reserved. */
|
|
|
|
#include "d4all.h"
|
|
#ifndef S4UNIX
|
|
#ifdef __TURBOC__
|
|
#pragma hdrstop
|
|
#endif /* __TUROBC__ */
|
|
#endif /* S4UNIX */
|
|
|
|
#include "d4data.hpp"
|
|
extern char v4buffer[257] ;
|
|
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)
|
|
{
|
|
code_base = &cb ;
|
|
}
|
|
|
|
Str4flex::Str4flex( Str4flex& a ) : Str4max(0,0)
|
|
{
|
|
code_base = a.code_base ;
|
|
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( code_base->string_types[i_type], p ) ;
|
|
p = 0 ;
|
|
}
|
|
curLen = 0 ;
|
|
}
|
|
|
|
Str4flex::setMax( unsigned n )
|
|
{
|
|
if ( code_base->errorCode ) return -1 ;
|
|
if ( n >= UINT_MAX ) return e4( code_base, e4memory, 0 ) ;
|
|
|
|
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 e4( code_base, e4memory, 0 ) ;
|
|
|
|
#ifdef S4DEBUG
|
|
if ( i_type > 16 )
|
|
e4severe( e4parm, "Str4flex::setMax" ) ;
|
|
if ( calc_type(new_max) != i_type )
|
|
e4severe( e4parm, "Str4flex::setMax" ) ;
|
|
#endif
|
|
|
|
if ( code_base->string_types[i_type] == 0 )
|
|
{
|
|
code_base->string_types[i_type] = mem4create( 0, num_per_type[i_type], new_max+1, num_per_type[i_type], 0 ) ;
|
|
if ( code_base->string_types[i_type] == 0 ) return e4( code_base, e4memory, 0 );
|
|
}
|
|
|
|
char *new_p = (char *) mem4alloc( code_base->string_types[i_type] ) ;
|
|
if ( new_p == 0 ) return e4( code_base, e4memory, 0 ) ;
|
|
|
|
if ( curLen > new_max ) curLen = new_max ;
|
|
memcpy( new_p, p, curLen ) ;
|
|
|
|
free() ;
|
|
maxLen = new_max ;
|
|
p = new_p ;
|
|
p[maxLen] = 0 ;
|
|
|
|
return 0 ;
|
|
}
|