home *** CD-ROM | disk | FTP | other *** search
- /* m4.c (c)Copyright Sequiter Software Inc., 1987-1990. All rights reserved. */
-
- #include "p4misc.h"
- #include "d4all.h"
- #include "u4error.h"
- #include "m4.h"
-
- #include <string.h>
- #ifndef UNIX
- #include <io.h>
- #endif
-
- extern BASE *v4base ;
- extern int v4cur_base, v4lock_wait ;
-
-
- static char name_buf[sizeof(v4base->name)+2] ;
-
- char *m4name( int base_ref )
- {
- u4name_part( name_buf, v4base[base_ref].name, 1,0 ) ;
- u4upper( name_buf ) ;
- u4name_full( name_buf, name_buf, ".DBT" ) ;
-
- return name_buf ;
- }
-
- m4open( int base_ref )
- {
- int hand, rc ;
- char *file_name ;
- MEMO_HEADER hdr ;
-
- if ( v4base[base_ref].memo_file >= 0 )
- return( v4base[base_ref].memo_file ) ;
-
- file_name = m4name(base_ref) ;
- if ( (hand = u4open( file_name, 0 )) < 0 ) return -1 ;
- lseek( hand, 0L, 0 ) ;
- rc = read( hand, (char *) &hdr, (unsigned int) sizeof( MEMO_HEADER ) ) ;
- if ( rc != (int) sizeof(MEMO_HEADER) )
- {
- u4error( E_READ, "MEMO File: ", file_name, (char *) 0 ) ;
- close( hand ) ;
- return -1 ;
- }
-
- u4name_part( file_name, file_name, 0,0 ) ;
- u4upper( file_name ) ;
- if ( strncmp( file_name, hdr.file_name, 8 ) != 0 )
- {
- close( hand ) ;
- u4error( E_MEMO_NAME, "File Name: ", file_name, (char *) 0 ) ;
- return -1 ;
- }
-
- v4base[base_ref].memo_file = hand ;
- v4base[base_ref].memo_size = hdr.block_size ;
-
- return hand ;
- }
-
- m4exist( long field_ref )
- {
- if ( f4value(field_ref) > 0.0 )
- return 1 ;
- else
- return 0 ;
- }
-
-
- m4read( long field_ref, long rec_num, char *str, int str_len)
- {
- BASE *base_ptr ;
- long memo_num, memo_pos ;
- int old_base, new_base, rc, i_read, len_data, len_read ;
- MEMO_BLOCK memo_block ;
-
- if ( str_len < 0 ) return -1 ;
-
- old_base = v4cur_base ;
- new_base = (int) (field_ref >> 16) ;
-
- base_ptr = v4base + new_base ;
-
- if ( rec_num > d4reccount() )
- {
- d4blank() ;
- *str = '\000' ;
- return 0 ;
- }
- else
- {
- d4select( new_base ) ;
- rc = d4go( rec_num) ;
- d4select( old_base ) ;
- if ( rc < 0 ) return rc ;
- }
-
- memo_num = c4atol( f4ptr(field_ref), f4width(field_ref) ) ;
- if ( memo_num == 0L ) return 0 ;
-
- if ( m4open( new_base ) < 0 ) return -1 ;
-
- memo_pos = base_ptr->memo_size * memo_num ;
-
- rc = u4lock(base_ptr->memo_file, memo_pos, (long) str_len, v4lock_wait) ;
- if ( rc < 0) return rc ;
-
- lseek( base_ptr->memo_file, memo_pos, 0 ) ;
- if ( str_len < sizeof(memo_block) )
- {
- len_read = read( base_ptr->memo_file, (char *) &memo_block, sizeof(memo_block)) ;
- memcpy( str, (char *) &memo_block, (size_t) str_len ) ;
- }
- else
- {
- len_read = read( base_ptr->memo_file, str, str_len ) ;
- memcpy( (char *) &memo_block, str, sizeof(memo_block) ) ;
- }
-
- if ( len_read < 0 )
- {
- if ( u4unlock( base_ptr->memo_file, memo_pos, (long) str_len ) < 0 )
- return -1 ;
-
- u4error( E_READ, m4name(new_base), (char *) 0 ) ;
- return -1 ;
- }
-
- if ( ((MEMO_BLOCK *) str)->minus_one != -1 || len_read < sizeof(MEMO_BLOCK) )
- {
- /* dBASE III Style Entry */
- if ( u4unlock( base_ptr->memo_file, memo_pos, (long) str_len ) < 0 )
- return -1 ;
-
- if ( len_read == str_len ) len_read-- ;
-
- for ( i_read= 0; i_read <= len_read; i_read++ )
- if ( str[i_read] == 0x1A || i_read == len_read )
- {
- str[i_read] = '\000' ;
- return i_read ;
- }
- }
- else
- {
- /* dBASE IV Style Header */
- if ( memo_block.num_chars > 0x7FFF )
- {
- if ( u4unlock( base_ptr->memo_file, memo_pos, (long) str_len ) < 0 )
- return -1 ;
- u4error( E_MEMO_SIZE, m4name(new_base), (char *) 0 ) ;
- return -1 ;
- }
- len_data = (int) memo_block.num_chars - memo_block.start_pos ;
- len_read-= memo_block.start_pos ;
-
- memmove( str, str+memo_block.start_pos, (size_t) (str_len- memo_block.start_pos) ) ;
-
- if ( len_read >= len_data )
- {
- if ( u4unlock( base_ptr->memo_file, memo_pos, (long) str_len ) < 0 )
- return -1 ;
- str[len_data] = '\000' ;
-
- return( len_data ) ;
- }
-
- /* Read the Extra Data into the Memory Buffer */
- lseek( base_ptr->memo_file, memo_pos+len_read+memo_block.start_pos, 0 ) ;
- rc = read( base_ptr->memo_file, str+len_read, str_len-len_read-1 ) ;
-
- if ( u4unlock( base_ptr->memo_file, memo_pos, (long) str_len ) < 0 )
- return -1 ;
-
- if ( rc < 0 )
- {
- u4error( E_READ, m4name(new_base), (char *) 0 ) ;
- return -1 ;
- }
-
- len_read += rc ;
- if ( len_read > len_data )
- len_read = len_data ;
-
- str[len_read] = '\000' ;
-
- return( len_read ) ;
- }
-
- return 0 ; /* This Line is never executed; Present to stop warning */
- }
-