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
 |