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
		
			
				
	
	
		
			323 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			323 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /* d4open.c   (c)Copyright Sequiter Software Inc., 1990-1994.  All rights reserved. */
 | |
| 
 | |
| #include "d4all.h"
 | |
| #ifndef S4UNIX
 | |
| #ifdef __TURBOC__
 | |
| #pragma hdrstop
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #ifdef S4OFF_MEMO
 | |
| extern char f4memo_null_char ;
 | |
| #endif
 | |
| 
 | |
| DATA4 *S4FUNCTION d4open( CODE4 *c4, char *name )
 | |
| {
 | |
|   int rc, i_fields, i_memo ;
 | |
|   unsigned field_data_len, count ;
 | |
|   char name_buf[258], field_buf[2], *info ;
 | |
|   DATA4 *d4 ;
 | |
|   DATA4HEADER_FULL full_header ;
 | |
|   INDEX4 *i4 ;
 | |
|   FIELD4IMAGE *image ;
 | |
| 
 | |
| #ifdef S4VBASIC
 | |
|   if ( c4parm_check( c4, 1, E4_D4OPEN ) )
 | |
|     return 0 ;
 | |
| #endif
 | |
| 
 | |
|   if ( c4 == 0 || name == 0 )
 | |
| #ifdef S4DEBUG
 | |
|     e4severe( e4parm, E4_D4OPEN ) ;
 | |
| #else
 | |
|   return 0 ;
 | |
| #endif
 | |
| 
 | |
|   if ( c4->error_code < 0 )
 | |
|     return 0 ;
 | |
| 
 | |
| #ifdef S4DEBUG
 | |
|   if ( c4->debug_int != 0x5281 )
 | |
|     e4severe( e4result, E4_RESULT_D4I ) ;
 | |
| 
 | |
| #ifndef S4WIN32
 | |
|   u4name_piece( name_buf, sizeof( name_buf ), name, 0, 0 ) ;
 | |
|   if ( d4data( c4, name_buf ) )
 | |
|   {
 | |
|     e4( c4, e4info, E4_INFO_DAO ) ;
 | |
|     return 0 ;
 | |
|   }
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
|   if ( c4->data_memory == 0 )
 | |
|   {
 | |
|     c4->data_memory = mem4create( c4, c4->mem_start_data, sizeof(DATA4), c4->mem_expand_data, 0 ) ;
 | |
|     if ( c4->data_memory == 0 )
 | |
|     {
 | |
|       e4( c4, e4memory, 0 ) ;
 | |
|       return 0 ;
 | |
|     }
 | |
|   }
 | |
|   d4 = (DATA4 *) mem4alloc( c4->data_memory ) ;
 | |
|   if ( d4 == 0 )
 | |
|   {
 | |
|     e4(  c4, e4memory, 0 ) ;
 | |
|     return 0 ;
 | |
|   }
 | |
| 
 | |
| #ifdef S4VBASIC
 | |
|   d4->debug_int = 0x5281 ;
 | |
| #endif
 | |
|   d4->code_base = c4 ;
 | |
| 
 | |
| #ifndef S4SINGLE
 | |
|   d4->locks = &d4->locked_record ;
 | |
|   d4->n_locks = 1 ;
 | |
| #endif
 | |
|   d4->memo_file.file.hand = -1 ;
 | |
| 
 | |
|   u4ncpy( name_buf, name, sizeof(name_buf) ) ;
 | |
| #ifdef S4UNIX
 | |
|   u4name_ext( name_buf, sizeof(name_buf), "dbf", 0 ) ;
 | |
| #else
 | |
|   u4name_ext( name_buf, sizeof(name_buf), "DBF", 0 ) ;
 | |
| #endif
 | |
| 
 | |
|   rc = file4open( &d4->file, c4, name_buf, 1 ) ;
 | |
|   if ( rc )
 | |
|   {
 | |
|     d4close( d4 ) ;
 | |
|     return 0 ;
 | |
|   }
 | |
|   l4add( &c4->data_list, &d4->link ) ;
 | |
| 
 | |
|   u4name_piece( d4->alias, sizeof(d4->alias), name_buf, 0,0 ) ;
 | |
| 
 | |
|   if ( file4read_all( &d4->file, 0L, &full_header, sizeof( full_header ) ) < 0 )
 | |
|   {
 | |
|     d4close( d4 ) ;
 | |
|     return 0 ;
 | |
|   }
 | |
| 
 | |
| #ifdef S4BYTE_SWAP
 | |
|   full_header.num_recs = x4reverse_long( (void *)&full_header.num_recs ) ;
 | |
|   full_header.header_len = x4reverse_short( (void *)&full_header.header_len ) ;
 | |
|   full_header.record_len = x4reverse_short( (void *)&full_header.record_len ) ;
 | |
| #endif
 | |
| 
 | |
| #ifdef S4DEMO
 | |
|   if ( full_header.num_recs > 200L)
 | |
|   {
 | |
|     e4( c4, e4demo, 0 ) ;
 | |
|     d4close(d4) ;
 | |
|     return 0 ;
 | |
|   }
 | |
| #endif
 | |
| 
 | |
| #ifdef S4DEBUG
 | |
|   if ( full_header.num_recs < 0L || full_header.num_recs > ( 1 +  ( file4len ( &d4->file )  - full_header.header_len ) / full_header.record_len ) )
 | |
|     e4severe( e4info, E4_DATA_COR ) ;
 | |
| #endif
 | |
| 
 | |
|   memcpy( (void *)&d4->version, (void *)&full_header.version, (4+(sizeof(S4LONG))+(sizeof(short))) ) ;
 | |
| 
 | |
|   d4->num_recs = -1L ;
 | |
|   d4->has_mdx = full_header.has_mdx ;
 | |
| 
 | |
|   field_data_len = full_header.header_len-sizeof(full_header) ;
 | |
|   if ( full_header.header_len <= sizeof(full_header) )
 | |
|   {
 | |
|     e4( c4, e4data, d4->file.name ) ;
 | |
|     d4close(d4) ;
 | |
|     return 0 ;
 | |
|   }
 | |
| 
 | |
|   info = (char *) u4alloc_free( c4, field_data_len ) ;
 | |
|   if ( info == 0 )
 | |
|   {
 | |
|     e4( c4, e4memory, 0 ) ;
 | |
|     d4close(d4) ;
 | |
|     return 0 ;
 | |
|   }
 | |
| 
 | |
|   if ( file4read_all( &d4->file, (long) sizeof(full_header), info,field_data_len) < 0 )
 | |
|   {
 | |
|     u4free(info) ;
 | |
|     e4( c4, e4data, 0 ) ;
 | |
|     d4close(d4) ;
 | |
|     return 0 ;
 | |
|   }
 | |
| 
 | |
|   /* count the number of fields */
 | |
|   for (count=0; count < field_data_len; count+= 32 )
 | |
|     if ( info[count] == 0xD )  break ;
 | |
|   d4->n_fields = (int) (count/32) ;
 | |
|   if ( field_data_len/32 < (unsigned) d4->n_fields )
 | |
|   {
 | |
|     u4free(info) ;
 | |
|     e4( c4, e4data, d4->file.name ) ;
 | |
|     d4close(d4) ;
 | |
|     return 0 ;
 | |
|   }
 | |
| 
 | |
|   d4->fields = (FIELD4 *) u4alloc_free( c4, sizeof(FIELD4) * (long) d4->n_fields ) ;
 | |
|   if ( d4->fields == 0 )  e4( c4, e4memory, 0 ) ;
 | |
| 
 | |
|   d4->record_width = 1 ;
 | |
| 
 | |
|   if ( !(c4->error_code < 0)  )
 | |
|     for ( i_fields = 0; i_fields < d4->n_fields; i_fields++ )
 | |
|     {
 | |
|       image = (FIELD4IMAGE *) (info+ i_fields*32) ;
 | |
|       u4ncpy( d4->fields[i_fields].name, image->name, sizeof(d4->fields->name) ) ;
 | |
| 
 | |
|       u4ncpy( field_buf, &image->type, 2 ) ;
 | |
|       c4upper( field_buf ) ;
 | |
|       d4->fields[i_fields].type = *field_buf ;
 | |
| 
 | |
|       if ( d4->fields[i_fields].type == 'N' || d4->fields[i_fields].type == 'F')
 | |
|       {
 | |
|         d4->fields[i_fields].len = image->len ;
 | |
|         d4->fields[i_fields].dec = image->dec ;
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|         if ( d4->fields[i_fields].type == 'L' || d4->fields[i_fields].type == 'D' || d4->fields[i_fields].type == 'M' || d4->fields[i_fields].type == 'G' ||
 | |
|             d4->fields[i_fields].type == 'B' )
 | |
|           d4->fields[i_fields].len = image->len ;
 | |
|         else
 | |
|           d4->fields[i_fields].len = image->len + (image->dec << 8) ;
 | |
|         d4->fields[i_fields].dec = 0 ;
 | |
|       }
 | |
| 
 | |
|       if ( d4->fields[i_fields].type == 'M' || d4->fields[i_fields].type == 'G' || d4->fields[i_fields].type == 'B' )
 | |
|       {
 | |
|         d4->n_fields_memo++ ;
 | |
| #ifdef S4MEMO_OFF
 | |
|         d4->fields[i_fields].memo = (F4MEMO *)&f4memo_null_char ;
 | |
| #endif
 | |
|       }
 | |
| 
 | |
| #ifdef S4VBASIC
 | |
|       d4->fields[i_fields].debug_int = 0x5281 ;
 | |
| #endif
 | |
|       d4->fields[i_fields].offset = d4->record_width ;
 | |
|       d4->record_width += d4->fields[i_fields].len ;
 | |
|       d4->fields[i_fields].data = d4 ;
 | |
|     }
 | |
| 
 | |
|   u4free( info ) ;
 | |
| 
 | |
| #ifndef S4MEMO_OFF
 | |
|   if ( d4->n_fields_memo > 0  &&  ! (c4->error_code< 0) )
 | |
|   {
 | |
|     i_memo = 0 ;
 | |
| 
 | |
|     d4->fields_memo = (F4MEMO *)u4alloc_free( c4, (long)sizeof(F4MEMO) * d4->n_fields_memo ) ;
 | |
|     if ( d4->fields_memo == 0 )
 | |
|       e4( c4, e4memory, 0 ) ;
 | |
|     else
 | |
|       for ( i_fields = 0; i_fields < d4->n_fields; i_fields++ )
 | |
|         if ( d4->fields[i_fields].type == 'M' || d4->fields[i_fields].type == 'G' || d4->fields[i_fields].type == 'B' )
 | |
|         {
 | |
|           d4->fields[i_fields].memo = d4->fields_memo+i_memo ;
 | |
|           d4->fields_memo[i_memo].status = 1 ;
 | |
|           d4->fields_memo[i_memo].field = d4->fields+i_fields ;
 | |
|           i_memo++ ;
 | |
|         }
 | |
|   }
 | |
| #endif
 | |
| 
 | |
|   if ( d4->record_width != full_header.record_len  &&  ! (c4->error_code<0) )
 | |
|     e4( c4, e4data, d4->file.name ) ;
 | |
| 
 | |
|   if ( c4->error_code < 0 )
 | |
|   {
 | |
|     d4close(d4) ;
 | |
|     return 0 ;
 | |
|   }
 | |
| 
 | |
|   d4->record = (char *) u4alloc_free( c4, d4->record_width + 1 ) ;
 | |
|   d4->record_old = (char *) u4alloc_free( c4, d4->record_width+1 ) ;
 | |
|   if ( d4->record == 0  ||  d4->record_old == 0 )
 | |
|   {
 | |
|     e4( c4, e4memory, 0 ) ;
 | |
|     d4close(d4) ;
 | |
|     return 0 ;
 | |
|   }
 | |
| 
 | |
|   memset( d4->record, ' ', d4->record_width ) ;
 | |
|   memset( d4->record_old, ' ', d4->record_width ) ;
 | |
| 
 | |
|   d4->rec_num = d4->rec_num_old = -1 ;
 | |
| 
 | |
| #ifndef S4OPTIMIZE_OFF
 | |
|   file4optimize( &d4->file, c4->optimize, OPT4DBF ) ;
 | |
| #endif
 | |
| 
 | |
| #ifndef S4INDEX_OFF
 | |
| #ifdef N4OTHER
 | |
|   if ( c4->auto_open )
 | |
|   {
 | |
|     i4 = i4open( d4, 0 ) ;
 | |
|     if ( i4 == 0 )
 | |
|     {
 | |
|       d4close(d4) ;
 | |
|       return 0 ;
 | |
|     }
 | |
|   }
 | |
| #else
 | |
|   if ( d4->has_mdx && c4->auto_open )
 | |
|   {
 | |
|     i4 = i4open( d4, 0 ) ;
 | |
|     if ( i4 == 0 )
 | |
|     {
 | |
|       d4close(d4) ;
 | |
|       return 0 ;
 | |
|     }
 | |
| #ifdef S4MDX
 | |
|     if ( !i4->header.is_production )
 | |
|       i4close(i4);
 | |
| #endif
 | |
|   }
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #ifndef S4MEMO_OFF
 | |
|   if ( d4->version & 0x80 )
 | |
|   {
 | |
| #ifdef S4MFOX
 | |
| #ifdef S4UNIX
 | |
|     u4name_ext( name_buf, sizeof(name_buf), "fpt", 1 ) ;
 | |
| #else
 | |
|     u4name_ext( name_buf, sizeof(name_buf), "FPT", 1 ) ;
 | |
| #endif
 | |
| #else
 | |
| #ifdef S4UNIX
 | |
|     u4name_ext( name_buf, sizeof(name_buf), "dbt", 1 ) ;
 | |
| #else
 | |
|     u4name_ext( name_buf, sizeof(name_buf), "DBT", 1 ) ;
 | |
| #endif
 | |
| #endif
 | |
|     if ( memo4file_open( &d4->memo_file, d4, name_buf ) < 0 )
 | |
|     {
 | |
|       d4close(d4) ;
 | |
|       return 0 ;
 | |
|     }
 | |
|   }
 | |
| #endif
 | |
| 
 | |
|   return d4 ;
 | |
| }
 | |
| 
 | |
| #ifdef S4VB_DOS
 | |
| 
 | |
| DATA4 * d4open_v( CODE4 *c4, char *name )
 | |
| {
 | |
|   return d4open( c4, c4str(name) ) ;
 | |
| }
 | |
| 
 | |
| #endif
 | |
| 
 |