230 lines
5.0 KiB
C++
Executable File
230 lines
5.0 KiB
C++
Executable File
/* t4info.cpp/cxx (c)Copyright Sequiter Software Inc., 1988-1996. All rights reserved. */
|
|
|
|
#include "d4all.hpp"
|
|
#ifdef __TURBOC__
|
|
#pragma hdrstop
|
|
#endif /* __TUROBC__ */
|
|
|
|
Tag4info::Tag4info( Code4 &code )
|
|
{
|
|
size = 0 ;
|
|
codeBase = &code ;
|
|
length = 0 ;
|
|
tag = NULL ;
|
|
expr=filt=0;
|
|
|
|
}
|
|
|
|
Tag4info::Tag4info( Index4 i )
|
|
{
|
|
size = 0 ;
|
|
codeBase = (Code4 *) i.index->data->codeBase ;
|
|
length = 0 ;
|
|
tag = NULL ;
|
|
expr=filt=0;
|
|
add_index_tags( i.index ) ;
|
|
}
|
|
|
|
Tag4info::Tag4info( Data4 d )
|
|
{
|
|
INDEX4 *index = (INDEX4*) l4next( &(d.data->indexes), NULL ) ;
|
|
|
|
size = 0 ;
|
|
codeBase = (Code4 *) d.data->codeBase ;
|
|
length = 0 ;
|
|
tag = NULL ;
|
|
expr=filt=0;
|
|
|
|
for(; index != NULL ; index = (INDEX4*) l4next( &(d.data->indexes), index ) )
|
|
add_index_tags( index ) ;
|
|
}
|
|
|
|
int Tag4info::add_index_tags( INDEX4 *index )
|
|
{
|
|
TAG4INFO *tagInfo ;
|
|
int i = 0 ;
|
|
|
|
tagInfo = i4tagInfo( index ) ;
|
|
while( tagInfo[i].name != 0 )
|
|
{
|
|
add( getName( tagInfo, i ), getExpr( tagInfo, i ), getFilter( tagInfo, i ),
|
|
getUniqueKey( tagInfo, i ), getDescendKey( tagInfo, i ) ) ;
|
|
i++ ;
|
|
}
|
|
return 0 ;
|
|
|
|
}
|
|
|
|
int Tag4info::add( Tag4 tagIn )
|
|
{
|
|
|
|
TAG4INFO *tagInfo ;
|
|
int i = 0 ;
|
|
char *name ;
|
|
|
|
tagInfo = i4tagInfo( tagIn.tag->index ) ;
|
|
name = t4alias( tagIn.tag ) ;
|
|
while( strcmp( tagInfo[i].name, name ) != 0 ) i++ ;
|
|
|
|
add( getName( tagInfo, i ), getExpr( tagInfo, i ), getFilter( tagInfo, i ),
|
|
getUniqueKey( tagInfo, i ), getDescendKey( tagInfo, i ) ) ;
|
|
|
|
return 0 ;
|
|
|
|
}
|
|
|
|
int Tag4info::add( const char *name, const char *expre, const char *filter,
|
|
int uniq, int desc )
|
|
{
|
|
Str4ten st_name( name ) ;
|
|
st_name.upper() ;
|
|
st_name.trim() ;
|
|
#ifdef E4DEBUG
|
|
if( name == 0 || expre == 0 )
|
|
return codeBase->error( e4parm, E60991 ) ;
|
|
#endif
|
|
|
|
if( u4allocAgain( codeBase, (char **)&tag, &length,
|
|
(size+2) * sizeof( TAG4INFO ))!=0 )
|
|
return -1 ;
|
|
|
|
tag[size].name = (char *)u4allocEr( codeBase, 11 ) ;
|
|
if( tag[size].name )
|
|
u4ncpy( tag[size].name, st_name.ptr(), 11 ) ;
|
|
|
|
unsigned len = strlen(expre) + 1 ;
|
|
//tag[size].expression = (char *)u4allocEr( codeBase, len ) ;
|
|
expr= (char *)u4allocEr( codeBase, len ) ;
|
|
|
|
if( expr != NULL )
|
|
u4ncpy( expr, expre, len ) ;
|
|
tag[size].expression=expr;
|
|
|
|
//if( tag[size].expression != NULL )
|
|
// u4ncpy( tag[size].expression, expre, len ) ;
|
|
|
|
if( filter )
|
|
{
|
|
filt = (char *)u4allocEr( codeBase, len = strlen( filter )+1 ) ;
|
|
//tag[size].filter = (char *)u4allocEr( codeBase, len = strlen( filter )+1 ) ;
|
|
if( filt != NULL )
|
|
//if( tag[size].filter != NULL )
|
|
u4ncpy( filt, filter, len ) ;
|
|
//u4ncpy( tag[size].filter, filter, len ) ;
|
|
tag[size].filter=filt;
|
|
}
|
|
|
|
if( codeBase->errorCode < 0 )
|
|
{
|
|
u4free( tag[size].name ) ;
|
|
u4free( expr ) ;
|
|
//u4free( tag[size].expression ) ;
|
|
u4free( filt ) ;
|
|
//u4free( tag[size].filter ) ;
|
|
memset( tag+size, 0, sizeof(TAG4INFO) ) ;
|
|
return -1 ;
|
|
}
|
|
|
|
tag[size].unique = uniq ;
|
|
tag[size].descending = desc ;
|
|
size++ ;
|
|
return 0 ;
|
|
}
|
|
|
|
char * Tag4info::getName( TAG4INFO *tagInfo, int tagPos )
|
|
{
|
|
if( tagInfo[tagPos].name != 0 )
|
|
return tagInfo[tagPos].name ;
|
|
else
|
|
return 0 ;
|
|
}
|
|
|
|
const char * Tag4info::getExpr( TAG4INFO *tagInfo, int tagPos )
|
|
{
|
|
if( tagInfo[tagPos].name != 0 )
|
|
return tagInfo[tagPos].expression ;
|
|
else
|
|
return 0 ;
|
|
}
|
|
|
|
const char * Tag4info::getFilter( TAG4INFO *tagInfo, int tagPos )
|
|
{
|
|
if( tagInfo[tagPos].name != 0 )
|
|
return tagInfo[tagPos].filter ;
|
|
else
|
|
return 0 ;
|
|
}
|
|
|
|
int Tag4info::getUniqueKey( TAG4INFO *tagInfo, int tagPos )
|
|
{
|
|
if( tagInfo[tagPos].name != 0 )
|
|
return tagInfo[tagPos].unique ;
|
|
else
|
|
return 0 ;
|
|
}
|
|
|
|
int Tag4info::getDescendKey( TAG4INFO *tagInfo, int tagPos )
|
|
{
|
|
if( tagInfo[tagPos].name != 0 )
|
|
return tagInfo[tagPos].descending ;
|
|
else
|
|
return 0 ;
|
|
}
|
|
|
|
void Tag4info::free( )
|
|
{
|
|
for( ; size > 0 ; )
|
|
{
|
|
size -- ;
|
|
u4free( tag[size].name ) ;
|
|
tag[size].expression=0;
|
|
u4free( expr ) ;
|
|
//u4free( tag[size].expression ) ;
|
|
tag[size].filter=0;
|
|
u4free( filt ) ;
|
|
//u4free( tag[size].filter ) ;
|
|
}
|
|
u4free( tag ) ;
|
|
tag = 0 ;
|
|
size = 0 ;
|
|
length = 0 ;
|
|
}
|
|
|
|
Tag4info::~Tag4info()
|
|
{
|
|
free( ) ;
|
|
}
|
|
|
|
int Tag4info::del( int index )
|
|
{
|
|
if( index >= size || index < 0 )
|
|
return codeBase->error( e4parm, E60982 ) ;
|
|
|
|
u4free( tag[index].name ) ;
|
|
tag[index].expression=0;
|
|
tag[index].filter=0;
|
|
u4free( expr ) ;
|
|
u4free( filt ) ;
|
|
|
|
memcpy( tag+index, tag+index+1, sizeof(TAG4INFO) * (size-index) ) ;
|
|
size-- ;
|
|
return 0 ;
|
|
}
|
|
|
|
int Tag4info::del( const char *name )
|
|
{
|
|
Str4ten st_tag( name ) ;
|
|
st_tag.upper( ) ;
|
|
st_tag.trim( ) ;
|
|
for( int i = 0 ; i < size ; i++ )
|
|
{
|
|
if( memcmp( tag[i].name, st_tag.ptr( ), st_tag.len() ) == 0 )
|
|
{
|
|
del( i ) ;
|
|
return 0 ;
|
|
}
|
|
}
|
|
codeBase->error( e4parm, E60982, name ) ;
|
|
return -1 ;
|
|
}
|