home *** CD-ROM | disk | FTP | other *** search
-
- /* d4create.c (C)Copyright Sequiter Software Inc., 1987-1990. All rights reserved.
-
- Creates a database file.
- */
-
- #include "d4all.h"
- #include "u4error.h"
- #include "m4.h"
- #include "p4misc.h"
-
- #include <time.h>
- #include <string.h>
- #ifndef UNIX
- #include <io.h>
- #endif
-
- extern int v4first ;
-
- typedef struct base_header_st
- {
- char version ;
- char yy ;
- char mm ;
- char dd ;
- long num_recs ;
- unsigned short header_len ;
- unsigned short record_width ;
- char filler[20] ;
- } BASE_HEADER ;
-
- typedef struct base_field_st
- {
- char name[11] ;
- char type ;
- char filler[4] ;
- unsigned char width ;
- unsigned char decimals ;
- char filler2[14] ;
- } BASE_FIELD ;
-
-
- FIELD *d4fields()
- {
- return( d4ptr()->fields ) ;
- }
-
- d4create( char *name, int num, FIELD *fields, int safety )
- {
- BASE_HEADER *header ;
- BASE_FIELD *b_field ;
- char full_name[90], on_char ;
- int rc, i, j, file_hand, rec_width, is_memo ;
- long time_val, long_header_len ;
- struct tm *tm_ptr ;
-
- if ( v4first ) if ( d4init() < 0 ) return -1 ;
-
- long_header_len = (long)num * 32 + 34 ;
- if ( long_header_len > 0x7fff )
- {
- u4error( E_CREATE, "Too Many Fields", name, (char *) 0 ) ;
- return -1 ;
- }
-
- u4name_full( full_name, name, ".DBF" ) ;
- rc = d4ref( full_name ) ;
- if ( rc >= 0 )
- {
- if ( safety )
- {
- u4error( E_CREATE, full_name, (char *) 0 ) ;
- return( -1 ) ;
- }
- else
- {
- d4select( rc ) ;
- if ( d4select( rc ) != rc ) return( -1 ) ;
- if ( d4close() < 0 ) return( -1 ) ;
- }
- }
-
- header = (BASE_HEADER *) h4alloc( (int) long_header_len ) ;
- if ( header == (BASE_HEADER *) 0 ) return( -1 ) ;
-
- b_field = (BASE_FIELD *) header ;
- b_field++ ;
- rec_width = 0 ;
- is_memo = 0 ;
-
- for ( i=0; i< num; i++ )
- {
- memcpy( b_field->name, fields->name, sizeof(b_field->name) ) ;
- b_field->type = fields->type ;
- u4upper( &b_field->type ) ;
-
- if ( b_field->type == 'C' )
- memcpy( (char *) &b_field->width, (char *) &fields->width, 2) ;
- else
- {
- b_field->decimals = (unsigned char) fields->decimals ;
- b_field->width = (unsigned char) fields->width ;
- }
-
- if ( fields->width < 1 ) b_field->width = 1 ;
-
- u4upper( b_field->name ) ;
-
- for ( j=0; j< 10; j++ )
- {
- on_char = b_field->name[j] ;
- if ( on_char >= 'A' && on_char <= 'Z' ) continue ;
- if ( on_char >= '0' && on_char <= '9' ) continue ;
- if ( on_char == '_' ) continue ;
-
- memset( b_field->name+j, 0, (size_t) (10-j) ) ;
- break ;
- }
- b_field->name[10] = '\000' ;
-
- if ( b_field->type != 'D' && b_field->type != 'L' &&
- b_field->type != 'N' && b_field->type != 'M' &&
- b_field->type != 'F' )
- b_field->type = 'C' ;
-
- if ( b_field->type == 'L' ) b_field->width = 1 ;
- if ( b_field->type == 'D' ) b_field->width = 8 ;
- if ( b_field->type == 'M' )
- {
- b_field->width = 10 ;
- is_memo = 1 ;
- }
- if ( b_field->type == 'N' || b_field->type == 'F' )
- {
- if ( b_field->width > 19 ) b_field->width = 19 ;
- if ( b_field->width < 1 ) b_field->width = 1 ;
- if ( b_field->width <= 2 )
- b_field->decimals = 0 ;
- else
- {
- if ( b_field->decimals >= b_field->width - (unsigned char) 1 )
- b_field->decimals = b_field->width - (unsigned char) 2 ;
- }
- }
-
- rec_width += b_field->width ;
-
- b_field++ ;
- fields++ ;
- }
- memcpy( (char *) b_field, "\015\032", 2 ) ;
-
- if ( safety )
- file_hand = u4open( full_name, 1 ) ;
- else
- file_hand = u4open( full_name, 2 ) ;
-
- if ( file_hand < 0 )
- {
- h4free_memory( (char *) header ) ;
- return -1 ;
- }
-
- if ( is_memo )
- header->version = (char) 0x83 ;
- else
- header->version = 3;
-
- time( (time_t *) &time_val ) ;
- tm_ptr = localtime( (time_t *) &time_val ) ;
- header->yy = (char) tm_ptr->tm_year ;
- header->mm = (char) tm_ptr->tm_mon+ (char) 1 ;
- header->dd = (char) tm_ptr->tm_mday ;
-
- header->header_len = (unsigned short) (32*(num+1) + 1) ;
- header->record_width = (unsigned short) (rec_width + 1) ;
-
- lseek( file_hand, 0L, 0 ) ;
- rc = write( file_hand, (char *) header, 32*num+34 ) ;
- h4free_memory( (char *) header ) ;
- if ( rc != 32*num+34 )
- {
- u4error( E_WRITE, full_name, (char *) 0) ;
- return( -1 ) ;
- }
-
- close( file_hand ) ;
-
- if ( is_memo )
- {
- char memo_name[90] ;
- int memo_file ;
- MEMO_HEADER m_hdr ;
-
- u4name_part( memo_name, full_name, 1,0 ) ;
- u4name_full( memo_name, memo_name, ".DBT" ) ;
-
- if ( safety )
- memo_file = u4open( memo_name, 1 ) ;
- else
- memo_file = u4open( memo_name, 2 ) ;
-
- if ( memo_file < 0 ) return -1 ;
-
- memset( (char *) &m_hdr, 0, sizeof(m_hdr) ) ;
- m_hdr.next_block = 1L ;
- u4name_part( m_hdr.file_name, full_name, 0,0 ) ;
- m_hdr.x102 = 0x102 ;
- m_hdr.block_size = 0x200 ; /* 512 */
-
- lseek( memo_file, 0L, 0 ) ;
- if ( write( memo_file, (char *) &m_hdr, (unsigned int) sizeof(m_hdr))
- != (int) sizeof(m_hdr) )
- {
- close( memo_file ) ;
- u4error( E_WRITE, memo_name, (char *) 0 ) ;
- return( -1 ) ;
- }
-
- close( memo_file ) ;
- }
-
- return( d4use(full_name) ) ;
- }
-