a0f5e0898b
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
774 lines
17 KiB
C
Executable File
774 lines
17 KiB
C
Executable File
/* i4create.c (c)Copyright Sequiter Software Inc., 1990-1994. All rights reserved. */
|
|
|
|
#include "d4all.h"
|
|
#ifndef S4UNIX
|
|
#ifdef __TURBOC__
|
|
#pragma hdrstop
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef S4INDEX_OFF
|
|
#ifndef S4OFF_WRITE
|
|
|
|
#include "r4reinde.h"
|
|
|
|
#ifndef N4OTHER
|
|
|
|
INDEX4 *S4FUNCTION i4create( DATA4 *d4, char *file_name, TAG4INFO *tag_data )
|
|
{
|
|
INDEX4 *i4 ;
|
|
CODE4 *c4 ;
|
|
TAG4 *tag_ptr ;
|
|
char buf[258] ;
|
|
int i, rc ;
|
|
#ifndef S4OPTIMIZE_OFF
|
|
int has_opt ;
|
|
#endif
|
|
|
|
#ifdef S4VBASIC
|
|
if ( c4parm_check( d4, 2, E4_I4CREATE ) )
|
|
return 0 ;
|
|
#endif
|
|
|
|
#ifdef S4DEBUG
|
|
if ( d4 == 0 || tag_data == 0 )
|
|
e4severe( e4parm, E4_I4CREATE ) ;
|
|
|
|
if ( file_name )
|
|
u4name_piece( buf, sizeof( buf ), file_name, 0, 0 ) ;
|
|
else
|
|
u4name_piece( buf, sizeof( buf ), d4->file.name, 0, 0 ) ;
|
|
if ( d4index( d4, buf ) )
|
|
{
|
|
e4( d4->code_base, e4info, E4_INFO_IAO ) ;
|
|
return 0 ;
|
|
}
|
|
#endif
|
|
|
|
c4 = d4->code_base ;
|
|
if ( c4->error_code < 0 )
|
|
return 0 ;
|
|
c4->error_code = 0 ; /* Make sure it is not 'r4unique' or 'r4no_create'. */
|
|
|
|
#ifndef S4OPTIMIZE_OFF
|
|
if ( c4->has_opt )
|
|
{
|
|
has_opt = 1 ;
|
|
d4opt_suspend( c4 ) ;
|
|
}
|
|
else
|
|
has_opt = 0 ;
|
|
#endif /* not S4OPTIMIZE_OFF */
|
|
|
|
#ifndef S4SINGLE
|
|
if ( d4lock_file( d4 ) )
|
|
return 0 ;
|
|
#endif
|
|
|
|
i4 = (INDEX4 *)mem4create_alloc( c4, &c4->index_memory, c4->mem_start_index, sizeof(INDEX4), c4->mem_expand_index, 0 ) ;
|
|
if ( i4 == 0 )
|
|
{
|
|
e4( c4, e4memory, 0 ) ;
|
|
return 0 ;
|
|
}
|
|
|
|
i4->code_base = c4 ;
|
|
i4->data = d4 ;
|
|
|
|
memset(buf,0,sizeof(buf));
|
|
if ( file_name )
|
|
u4ncpy( buf, file_name, sizeof(buf) ) ;
|
|
else
|
|
u4name_piece( buf, sizeof( buf ), d4->file.name, 1, 0 ) ;
|
|
|
|
#ifdef S4FOX
|
|
#ifdef S4UNIX
|
|
u4name_ext( buf, sizeof(buf), "cdx", 0 ) ;
|
|
#else
|
|
u4name_ext( buf, sizeof(buf), "CDX", 0 ) ;
|
|
#endif
|
|
#else
|
|
#ifdef S4UNIX
|
|
u4name_ext( buf, sizeof(buf), "mdx", 0 ) ;
|
|
#else
|
|
u4name_ext( buf, sizeof(buf), "MDX", 0 ) ;
|
|
#endif
|
|
#endif
|
|
|
|
rc = file4create( &i4->file, c4, buf, 1 ) ;
|
|
if ( rc )
|
|
{
|
|
if ( rc > 0 )
|
|
c4->error_code = rc ;
|
|
|
|
i4close( i4 ) ;
|
|
return 0 ;
|
|
}
|
|
|
|
l4add( &d4->indexes, i4 ) ;
|
|
|
|
#ifdef S4FOX
|
|
i4->block_memory = mem4create( c4, c4->mem_start_block,
|
|
(sizeof(B4BLOCK)) + B4BLOCK_SIZE - (sizeof(B4STD_HEADER)) - (sizeof(B4NODE_HEADER)), c4->mem_expand_block, 0 ) ;
|
|
if ( i4->block_memory == 0 )
|
|
{
|
|
i4close( i4 ) ;
|
|
return 0 ;
|
|
}
|
|
|
|
if ( c4->tag_memory == 0 )
|
|
{
|
|
c4->tag_memory = mem4create( c4, c4->mem_start_tag, sizeof(TAG4), c4->mem_expand_tag, 0 ) ;
|
|
if ( c4->tag_memory == 0 )
|
|
return 0 ;
|
|
}
|
|
|
|
i4->tag_index = (TAG4 *) mem4alloc( c4->tag_memory ) ;
|
|
if ( i4->tag_index == 0 )
|
|
{
|
|
e4( c4, e4memory, 0 ) ;
|
|
return 0 ;
|
|
}
|
|
|
|
i4->tag_index->code_base = c4 ;
|
|
i4->tag_index->index = i4 ;
|
|
i4->tag_index->header.type_code = 0xE0 ; /* compound, compact */
|
|
i4->tag_index->header.filter_len = 1 ;
|
|
i4->tag_index->header.filter_pos = 1 ;
|
|
i4->tag_index->header.expr_len = 1 ;
|
|
i4->tag_index->header.expr_pos = 0 ;
|
|
i4->tag_index->header.key_len = 10 ;
|
|
|
|
u4name_piece( i4->tag_index->alias, sizeof(i4->tag_index->alias), buf, 0, 0 ) ;
|
|
|
|
for ( i = 0; tag_data[i].name; i++ )
|
|
{
|
|
tag_ptr = (TAG4 *) mem4alloc( c4->tag_memory ) ;
|
|
if ( tag_ptr == 0 )
|
|
e4( c4, e4memory, 0 ) ;
|
|
|
|
tag_ptr->code_base = c4 ;
|
|
tag_ptr->index = i4 ;
|
|
|
|
u4ncpy( tag_ptr->alias, tag_data[i].name, sizeof(tag_ptr->alias) ) ;
|
|
#ifndef S4UNIX
|
|
c4upper( tag_ptr->alias ) ;
|
|
#endif
|
|
|
|
tag_ptr->header.type_code = 0x60 ; /* compact */
|
|
if ( tag_data[i].unique )
|
|
{
|
|
tag_ptr->header.type_code += 0x01 ;
|
|
tag_ptr->unique_error = tag_data[i].unique ;
|
|
|
|
#ifdef S4DEBUG
|
|
if ( tag_data[i].unique != e4unique &&
|
|
tag_data[i].unique != r4unique &&
|
|
tag_data[i].unique != r4unique_continue )
|
|
e4severe( e4parm, E4_PARM_UNI ) ;
|
|
#endif
|
|
}
|
|
if ( tag_data[i].descending)
|
|
{
|
|
tag_ptr->header.descending = 1 ;
|
|
#ifdef S4DEBUG
|
|
if ( tag_data[i].descending != r4descending )
|
|
e4severe( e4parm, E4_PARM_FLA ) ;
|
|
#endif
|
|
}
|
|
|
|
#ifdef S4DEBUG
|
|
if ( tag_data[i].expression == 0 )
|
|
e4severe( e4parm, E4_PARM_TAG ) ;
|
|
#endif
|
|
|
|
tag_ptr->expr = expr4parse( d4, tag_data[i].expression ) ;
|
|
if ( tag_ptr->expr == 0 )
|
|
{
|
|
mem4free( c4->tag_memory, tag_ptr ) ;
|
|
i4close( i4 );
|
|
return 0;
|
|
}
|
|
|
|
tag_ptr->header.expr_len = (short) (strlen( tag_ptr->expr->source ) + 1) ;
|
|
if( tag_ptr->header.expr_len > I4MAX_EXPR_SIZE )
|
|
e4( d4->code_base, e4index, E4_EXPR_OM ) ;
|
|
if ( tag_data[i].filter != 0 )
|
|
if ( *( tag_data[i].filter ) != '\0' )
|
|
{
|
|
tag_ptr->header.type_code += 0x08 ;
|
|
tag_ptr->filter = expr4parse( d4, tag_data[i].filter ) ;
|
|
if (tag_ptr->filter)
|
|
tag_ptr->header.filter_len = (short)strlen( tag_ptr->filter->source ) ;
|
|
}
|
|
tag_ptr->header.filter_len++ ; /* minimum of 1, for the '\0' */
|
|
if( tag_ptr->header.filter_len > I4MAX_EXPR_SIZE )
|
|
e4( d4->code_base, e4index, E4_EXPR_OM ) ;
|
|
tag_ptr->header.filter_pos = tag_ptr->header.expr_len ;
|
|
|
|
if ( c4->error_code < 0 )
|
|
break ;
|
|
l4add( &i4->tags, tag_ptr ) ;
|
|
}
|
|
#else /* if not S4FOX */
|
|
i4->header.two = 2 ;
|
|
u4yymmdd( i4->header.create_date ) ;
|
|
|
|
if ( file_name == 0 )
|
|
i4->header.is_production = 1 ;
|
|
|
|
i4->header.num_slots = 0x30 ;
|
|
i4->header.slot_size = 0x20 ;
|
|
|
|
u4name_piece( i4->header.data_name, sizeof( i4->header.data_name ), d4->file.name, 0, 0 ) ;
|
|
i4->header.block_chunks = (short)(c4->mem_size_block/512) ;
|
|
|
|
#ifdef S4DEBUG
|
|
if ( i4->header.block_chunks < 2 || i4->header.block_chunks > 63 ) /* disallowed for compatibility reasons */
|
|
e4severe( e4info, E4_INFO_BLO ) ;
|
|
#endif
|
|
|
|
i4->header.block_rw = (short)(i4->header.block_chunks * I4MULTIPLY) ;
|
|
|
|
i4->block_memory = mem4create( c4, c4->mem_start_block,
|
|
(sizeof(B4BLOCK)) + i4->header.block_rw -
|
|
(sizeof(B4KEY_DATA)) - (sizeof(short)) - (sizeof(char[6])),
|
|
c4->mem_expand_block, 0 ) ;
|
|
if ( i4->block_memory == 0 )
|
|
{
|
|
i4close( i4 ) ;
|
|
return 0 ;
|
|
}
|
|
|
|
for ( i = 0 ; tag_data[i].name ; i++ )
|
|
{
|
|
i4->header.num_tags++ ;
|
|
|
|
if ( c4->tag_memory == 0 )
|
|
{
|
|
c4->tag_memory = mem4create( c4, c4->mem_start_tag, sizeof(TAG4),
|
|
c4->mem_expand_tag, 0 ) ;
|
|
if ( c4->tag_memory == 0 )
|
|
return 0 ;
|
|
}
|
|
|
|
tag_ptr = (TAG4 *) mem4alloc( c4->tag_memory ) ;
|
|
if ( tag_ptr == 0 )
|
|
{
|
|
e4( c4, e4memory, 0 ) ;
|
|
return 0 ;
|
|
}
|
|
memset( (void *)tag_ptr,0, sizeof(TAG4) ) ;
|
|
|
|
tag_ptr->code_base = c4 ;
|
|
tag_ptr->index = i4 ;
|
|
|
|
u4ncpy( tag_ptr->alias, tag_data[i].name, sizeof(tag_ptr->alias) ) ;
|
|
#ifndef S4UNIX
|
|
c4upper( tag_ptr->alias ) ;
|
|
#endif
|
|
|
|
tag_ptr->header.type_code = 0x10 ;
|
|
if ( tag_data[i].unique )
|
|
{
|
|
tag_ptr->header.type_code += 0x40 ;
|
|
tag_ptr->header.unique = 0x4000 ;
|
|
tag_ptr->unique_error = tag_data[i].unique ;
|
|
|
|
#ifdef S4DEBUG
|
|
if ( tag_data[i].unique != e4unique &&
|
|
tag_data[i].unique != r4unique &&
|
|
tag_data[i].unique != r4unique_continue )
|
|
e4severe( e4parm, E4_PARM_UNI ) ;
|
|
#endif
|
|
}
|
|
if ( tag_data[i].descending)
|
|
{
|
|
tag_ptr->header.type_code += 0x08 ;
|
|
#ifdef S4DEBUG
|
|
if ( tag_data[i].descending != r4descending )
|
|
e4severe( e4parm, E4_PARM_FLA ) ;
|
|
#endif
|
|
}
|
|
|
|
#ifdef S4DEBUG
|
|
if ( tag_data[i].expression == 0 )
|
|
e4severe( e4parm, E4_PARM_TAG ) ;
|
|
#endif
|
|
|
|
tag_ptr->expr = expr4parse( d4, tag_data[i].expression ) ;
|
|
if( tag_ptr->expr == 0 )
|
|
{
|
|
mem4free( c4->tag_memory, tag_ptr ) ;
|
|
i4close( i4 );
|
|
return 0;
|
|
}
|
|
if ( tag_data[i].filter != 0 )
|
|
if ( *(tag_data[i].filter) != '\0' )
|
|
tag_ptr->filter = expr4parse( d4, tag_data[i].filter ) ;
|
|
|
|
if ( c4->error_code < 0 )
|
|
break ;
|
|
l4add( &i4->tags, tag_ptr ) ;
|
|
}
|
|
|
|
#ifdef S4DEBUG
|
|
if ( i4->header.num_tags > 47 )
|
|
e4severe( e4parm, E4_PARM_TOO ) ;
|
|
#endif
|
|
#endif
|
|
|
|
rc = i4reindex( i4 ) ;
|
|
|
|
if ( rc == r4unique || rc < 0 )
|
|
{
|
|
c4->error_code = r4unique ;
|
|
i4close( i4 ) ;
|
|
return 0 ;
|
|
}
|
|
|
|
if ( file_name == 0 )
|
|
{
|
|
d4->has_mdx = 1 ;
|
|
|
|
file4write( &d4->file, ( 4 + ( sizeof(S4LONG) ) + 2 * ( sizeof( short ) ) + ( sizeof( char[16] ) ) ),
|
|
&i4->data->has_mdx, sizeof( i4->data->has_mdx ) ) ;
|
|
}
|
|
if ( c4->error_code < 0 || c4->error_code == r4unique )
|
|
{
|
|
i4close( i4 ) ;
|
|
return 0 ;
|
|
}
|
|
#ifndef S4OPTIMIZE_OFF
|
|
file4optimize( &i4->file, c4->optimize, OPT4INDEX ) ;
|
|
if ( has_opt )
|
|
d4opt_restart( c4 ) ;
|
|
#endif /* not S4OPTIMIZE_OFF */
|
|
return i4 ;
|
|
}
|
|
|
|
#endif /* ifndef N4OTHER */
|
|
|
|
#ifdef N4OTHER
|
|
|
|
INDEX4 *S4FUNCTION i4create( DATA4 *d4, char *file_name, TAG4INFO *tag_data )
|
|
{
|
|
INDEX4 *i4 ;
|
|
CODE4 *c4 ;
|
|
char buf[258] ;
|
|
int i, rc ;
|
|
#ifdef S4OLD_CODE
|
|
int len, num_files ;
|
|
long pos ;
|
|
#else
|
|
char buffer[1024] ;
|
|
FILE4SEQ_WRITE seqwrite ;
|
|
#endif
|
|
|
|
#ifdef S4VBASIC
|
|
if ( c4parm_check( d4, 2, E4_I4CREATE ) )
|
|
return 0 ;
|
|
#endif
|
|
|
|
#ifdef S4DEBUG
|
|
if ( d4 == 0 || tag_data == 0 )
|
|
e4severe( e4parm, E4_I4CREATE ) ;
|
|
|
|
if ( file_name )
|
|
u4name_piece( buf, sizeof( buf ), file_name, 0, 0 ) ;
|
|
else
|
|
u4name_piece( buf, sizeof( buf ), d4->file.name, 0, 0 ) ;
|
|
if ( d4index( d4, buf ) )
|
|
{
|
|
e4( d4->code_base, e4info, E4_INFO_IAO ) ;
|
|
return 0 ;
|
|
}
|
|
#endif
|
|
|
|
c4 = d4->code_base ;
|
|
if ( c4->error_code < 0 )
|
|
return 0 ;
|
|
c4->error_code = 0 ; /* Make sure it is not 'r4unique' or 'r4no_create'. */
|
|
|
|
#ifndef S4SINGLE
|
|
if ( d4lock_file( d4 ) )
|
|
return 0 ;
|
|
#endif
|
|
|
|
i4 = (INDEX4 *)mem4create_alloc( c4, &c4->index_memory, c4->mem_start_index, sizeof(INDEX4), c4->mem_expand_index, 0 ) ;
|
|
|
|
if ( i4 == 0 )
|
|
{
|
|
e4( c4, e4memory, 0 ) ;
|
|
return 0 ;
|
|
}
|
|
|
|
i4->code_base = c4 ;
|
|
i4->data = d4 ;
|
|
|
|
memset( buf, 0, sizeof( buf ) ) ;
|
|
|
|
if ( file_name ) /* create a group file */
|
|
{
|
|
u4ncpy( buf, file_name, sizeof( buf ) ) ;
|
|
u4ncpy( i4->alias, buf, sizeof( i4->alias ) ) ;
|
|
c4trim_n( i4->alias, sizeof( i4->alias ) ) ;
|
|
#ifndef S4UNIX
|
|
c4upper( i4->alias ) ;
|
|
#endif
|
|
|
|
u4name_ext( buf, sizeof( buf ), "CGP", 1 ) ;
|
|
#ifndef S4UNIX
|
|
c4upper( buf ) ;
|
|
#endif
|
|
|
|
rc = file4create( &i4->file, c4, buf, 1 ) ;
|
|
if ( rc )
|
|
{
|
|
if ( rc > 0 )
|
|
c4->error_code = rc ;
|
|
|
|
file4close( &i4->file ) ;
|
|
return 0 ;
|
|
}
|
|
|
|
#ifdef S4OLD_CODE
|
|
/* calculate # of files */
|
|
for ( num_files = 0; tag_data[num_files].name; num_files++ ) ;
|
|
|
|
pos = 0L ;
|
|
file4write( &i4->file, pos, &num_files, sizeof( num_files ) ) ;
|
|
pos += sizeof( num_files ) ;
|
|
|
|
/* create the group file */
|
|
for ( i = 0; tag_data[i].name; i++ )
|
|
{
|
|
len = strlen( tag_data[i].name ) ;
|
|
file4write( &i4->file, pos, &len, sizeof( len ) ) ;
|
|
pos += sizeof( len ) ;
|
|
file4write( &i4->file, pos, tag_data[i].name, len ) ;
|
|
pos += len ;
|
|
}
|
|
#else
|
|
file4seq_write_init( &seqwrite, &i4->file, 0L, buffer, sizeof( buffer ) ) ;
|
|
|
|
/* create the group file */
|
|
for ( i = 0; tag_data[i].name; i++ )
|
|
{
|
|
file4seq_write( &seqwrite, tag_data[i].name, strlen( tag_data[i].name ) ) ;
|
|
file4seq_write( &seqwrite, "\r\n", 2 ) ;
|
|
}
|
|
|
|
file4seq_write_flush( &seqwrite ) ;
|
|
#endif
|
|
|
|
file4close ( &i4->file ) ;
|
|
|
|
#ifndef S4SINGLE
|
|
if ( rc )
|
|
{
|
|
if ( rc > 0 )
|
|
c4->error_code = rc ;
|
|
return 0 ;
|
|
}
|
|
#endif
|
|
i4->path = buf ;
|
|
}
|
|
|
|
l4add( &d4->indexes, i4 ) ;
|
|
|
|
/* now create the actual tag files */
|
|
for ( i = 0 ; tag_data[i].name ; i++ )
|
|
if( t4create( d4, &tag_data[i], i4 ) == 0 )
|
|
{
|
|
i4close( i4 ) ;
|
|
return 0 ;
|
|
}
|
|
|
|
if ( c4->error_code < 0 || c4->error_code == r4unique )
|
|
{
|
|
i4close( i4 ) ;
|
|
return 0 ;
|
|
}
|
|
|
|
if ( i4reindex( i4 ) == r4unique )
|
|
{
|
|
i4close( i4 ) ;
|
|
return 0 ;
|
|
}
|
|
|
|
return i4 ;
|
|
}
|
|
|
|
/* this function does not reindex if an 'i4ndx' is passed as a parameter */
|
|
/* this allows several creations before an actual reindex must occur */
|
|
TAG4 *S4FUNCTION t4create( DATA4 *d4, TAG4INFO *tag_data, INDEX4 *i4ndx )
|
|
{
|
|
CODE4 *c4 ;
|
|
INDEX4 *i4 ;
|
|
char buf[258] ;
|
|
TAG4 *t4 ;
|
|
int rc ;
|
|
#ifndef S4OPTIMIZE_OFF
|
|
int has_opt ;
|
|
#endif
|
|
#ifdef S4DEBUG
|
|
int old_tag_err ;
|
|
#endif
|
|
|
|
#ifdef S4VBASIC
|
|
if ( c4parm_check( d4, 2, E4_T4CREATE ) )
|
|
return 0 ;
|
|
#endif
|
|
|
|
#ifdef S4DEBUG
|
|
if ( d4 == 0 || tag_data == 0 )
|
|
e4severe( e4parm, E4_T4CREATE ) ;
|
|
#ifdef S4NDX
|
|
if( ( tag_data->filter != 0 && *tag_data->filter != '\0' ) || tag_data->descending != 0 )
|
|
e4severe( e4parm, E4_PARM_FOR ) ;
|
|
#endif
|
|
|
|
u4name_piece( buf, sizeof( buf ), tag_data->name, 0, 0 ) ;
|
|
|
|
if ( d4->code_base->error_code < 0 )
|
|
return 0 ;
|
|
|
|
old_tag_err = d4->code_base->tag_name_error ;
|
|
d4->code_base->tag_name_error = 0 ;
|
|
if ( d4tag( d4, buf ) )
|
|
{
|
|
e4( d4->code_base, e4info, E4_INFO_TAO ) ;
|
|
d4->code_base->tag_name_error = old_tag_err ;
|
|
return 0 ;
|
|
}
|
|
d4->code_base->tag_name_error = old_tag_err ;
|
|
d4->code_base->error_code = 0 ;
|
|
#endif
|
|
|
|
c4 = d4->code_base ;
|
|
if ( c4->error_code < 0 )
|
|
return 0 ;
|
|
c4->error_code = 0 ; /* Make sure it is not 'r4unique' or 'r4no_create'. */
|
|
|
|
#ifndef S4OPTIMIZE_OFF
|
|
if ( c4->has_opt )
|
|
{
|
|
has_opt = 1 ;
|
|
d4opt_suspend( c4 ) ;
|
|
}
|
|
else
|
|
has_opt = 0 ;
|
|
#endif /* not S4OPTIMIZE_OFF */
|
|
|
|
if ( i4ndx == 0 ) /* must create an index for the tag */
|
|
{
|
|
if ( c4->index_memory == 0 )
|
|
c4->index_memory = mem4create( c4, c4->mem_start_index, sizeof(INDEX4),
|
|
c4->mem_expand_index, 0 ) ;
|
|
if ( c4->index_memory == 0 )
|
|
return 0 ;
|
|
i4 = (INDEX4 *) mem4alloc( c4->index_memory ) ;
|
|
if ( i4 == 0 )
|
|
{
|
|
e4( c4, e4memory, 0 ) ;
|
|
return 0 ;
|
|
}
|
|
i4->data = d4 ;
|
|
i4->code_base = c4 ;
|
|
#ifdef S4DEBUG
|
|
u4name_piece( buf, sizeof( buf ), i4->alias, 0, 0 ) ;
|
|
if ( d4index( d4, buf ) )
|
|
{
|
|
e4( d4->code_base, e4info, E4_INFO_IAO ) ;
|
|
return 0 ;
|
|
}
|
|
#endif
|
|
u4name_piece( i4->alias, sizeof( i4->alias ), tag_data->name, 0, 0 ) ;
|
|
}
|
|
else
|
|
i4 = i4ndx ;
|
|
|
|
if ( c4->tag_memory == 0 )
|
|
{
|
|
c4->tag_memory = mem4create( c4, c4->mem_start_tag, sizeof(TAG4),
|
|
c4->mem_expand_tag, 0 ) ;
|
|
if ( c4->tag_memory == 0 )
|
|
return 0 ;
|
|
}
|
|
|
|
t4 = (TAG4 *) mem4alloc( c4->tag_memory ) ;
|
|
if ( t4 == 0 )
|
|
{
|
|
e4( c4, e4memory, 0 ) ;
|
|
return 0 ;
|
|
}
|
|
|
|
if ( i4->block_memory == 0 )
|
|
i4->block_memory = mem4create( c4, c4->mem_start_block,
|
|
sizeof(B4BLOCK) + B4BLOCK_SIZE -
|
|
(sizeof(B4KEY_DATA)) - (sizeof(short)) - (sizeof(char[2])),
|
|
c4->mem_expand_block, 0 ) ;
|
|
|
|
if ( i4->block_memory == 0 )
|
|
{
|
|
mem4free( c4->tag_memory, t4 ) ;
|
|
return 0 ;
|
|
}
|
|
|
|
if ( i4ndx != 0 && i4->path != 0)
|
|
{
|
|
rc = u4name_path( buf, sizeof(buf), i4ndx->path ) ;
|
|
u4ncpy( buf+rc, tag_data->name, sizeof(buf)-rc ) ;
|
|
}
|
|
else
|
|
u4ncpy( buf, tag_data->name, sizeof(buf) ) ;
|
|
|
|
#ifndef S4UNIX
|
|
c4upper(buf) ;
|
|
#endif
|
|
|
|
#ifdef S4NDX
|
|
#ifdef S4UNIX
|
|
u4name_ext( buf, sizeof(buf), "ndx", 0 ) ;
|
|
#else
|
|
u4name_ext( buf, sizeof(buf), "NDX", 0 ) ;
|
|
#endif
|
|
#else
|
|
#ifdef S4CLIPPER
|
|
#ifdef S4UNIX
|
|
u4name_ext( buf, sizeof(buf), "ntx", 0 ) ;
|
|
#else
|
|
u4name_ext( buf, sizeof(buf), "NTX", 0 ) ;
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
u4name_piece( t4->alias, sizeof( t4->alias ), tag_data->name, 0, 0 ) ;
|
|
#ifndef S4UNIX
|
|
c4upper( t4->alias ) ;
|
|
#endif
|
|
|
|
rc = file4create( &t4->file, c4, buf, 1 ) ;
|
|
if ( rc )
|
|
{
|
|
mem4free( c4->tag_memory, t4 ) ;
|
|
return 0 ;
|
|
}
|
|
|
|
if ( tag_data->unique )
|
|
{
|
|
#ifdef S4NDX
|
|
t4->header.unique = 0x4000 ;
|
|
#else
|
|
#ifdef S4CLIPPER
|
|
t4->header.unique = 0x01 ;
|
|
#endif
|
|
#endif
|
|
|
|
t4->unique_error = tag_data->unique ;
|
|
|
|
#ifdef S4DEBUG
|
|
if ( tag_data->unique != e4unique &&
|
|
tag_data->unique != r4unique &&
|
|
tag_data->unique != r4unique_continue )
|
|
e4severe( e4parm, E4_PARM_UNI ) ;
|
|
#endif
|
|
}
|
|
|
|
#ifdef S4CLIPPER
|
|
if ( tag_data->descending)
|
|
{
|
|
t4->header.descending = 1 ;
|
|
#ifdef S4DEBUG
|
|
if ( tag_data->descending != r4descending )
|
|
e4severe( e4parm, E4_PARM_FLA ) ;
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
#ifdef S4DEBUG
|
|
if ( tag_data->expression == 0 )
|
|
e4severe( e4parm, E4_PARM_TAG ) ;
|
|
#endif
|
|
|
|
t4->expr = expr4parse( d4, tag_data->expression ) ;
|
|
if ( t4->expr == 0 )
|
|
{
|
|
mem4free( c4->tag_memory, t4 ) ;
|
|
return 0 ;
|
|
}
|
|
|
|
#ifdef S4CLIPPER
|
|
if ( tag_data->filter != 0 )
|
|
if ( *( tag_data->filter ) != '\0' )
|
|
t4->filter = expr4parse( d4, tag_data->filter ) ;
|
|
#endif
|
|
|
|
#ifdef S4NDX
|
|
t4->header.eof = 2 ;
|
|
t4->header.root = 1 ;
|
|
#else
|
|
#ifdef S4CLIPPER
|
|
t4->header.eof = 0 ;
|
|
t4->header.root = 1024 ;
|
|
t4->header.key_len = c4->numeric_str_len ;
|
|
t4->header.key_dec = c4->decimals ;
|
|
if( t4->expr->type == r4num )
|
|
{
|
|
t4->header.key_len = t4->expr->key_len ;
|
|
t4->header.key_dec = t4->expr->key_dec ;
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
if ( c4->error_code < 0 )
|
|
{
|
|
mem4free( c4->tag_memory, t4 ) ;
|
|
return 0 ;
|
|
}
|
|
|
|
t4->code_base = c4 ;
|
|
t4->index = i4 ;
|
|
|
|
/* add the tag to the index list */
|
|
l4add( &i4->tags, t4 ) ;
|
|
|
|
if ( i4ndx == 0 ) /* single create, so reindex now */
|
|
{
|
|
if ( t4reindex( t4 ) == r4unique )
|
|
{
|
|
c4->error_code = r4unique ;
|
|
mem4free( c4->tag_memory, t4 ) ;
|
|
return 0 ;
|
|
}
|
|
|
|
l4add( &i4->data->indexes, i4 ) ;
|
|
}
|
|
|
|
#ifndef S4OPTIMIZE_OFF
|
|
file4optimize( &t4->file, c4->optimize, OPT4INDEX ) ;
|
|
if ( has_opt )
|
|
d4opt_restart( c4 ) ;
|
|
#endif
|
|
return t4 ;
|
|
}
|
|
#endif /* N4OTHER */
|
|
|
|
#endif /* S4OFF_WRITE */
|
|
#endif /* S4OFF_INDEX */
|
|
|
|
#ifdef S4VB_DOS
|
|
|
|
INDEX4 * i4create_v ( DATA4 *d4, char near *name, TAG4INFO *t4 )
|
|
{
|
|
return i4create( d4, c4str(name), t4 ) ;
|
|
}
|
|
|
|
INDEX4 * i4createProd ( DATA4 *d4, TAG4INFO *t4 )
|
|
{
|
|
return i4create( d4, 0, t4 ) ;
|
|
}
|
|
|
|
#endif
|