home *** CD-ROM | disk | FTP | other *** search
- /* m4three.c, for Code Base 4
- (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 <process.h>
- #include <io.h>
- #endif
-
- #define MEMO_SIZE 0x200
-
- extern BASE *v4base ;
- extern int v4cur_base, v4lock_wait ;
-
- static int m3open(int) ;
-
- static int m3open( int base_ref )
- {
- int hand ;
-
- if ( (hand = u4open( m4name(base_ref), 0 )) < 0 ) return -1 ;
- v4base[base_ref].memo_file = hand ;
- v4base[base_ref].memo_size = 0x200 ;
-
- return hand ;
- }
-
- m3read( long field_ref, long rec_num, char *str, int str_len)
- {
- int new_base ;
-
- new_base = (int) (field_ref >> 16) ;
-
- if ( v4base[new_base].memo_file < 0 )
- if ( m3open( new_base ) < 0 ) return -1 ;
-
- return ( m4read(field_ref, rec_num, str, str_len) ) ;
- }
-
- m3exist( long field_ref )
- {
- return( m4exist(field_ref) ) ;
- }
-
- m3edit( long field_ref, long rec_num, char *editor_name, int max_size )
- {
- #ifndef NO_SPAWNL
- char *ptr ;
- int hand, num_read ;
- char memoedit_ptr[14] ;
-
- if ( max_size <= 0 ) return -1 ;
-
- ptr = h4alloc( max_size ) ;
- if ( ptr == (char *) 0 ) return 1 ;
-
- if ((num_read = m3read( field_ref, rec_num, ptr, max_size)) < 0 )
- {
- h4free_memory(ptr) ;
- return num_read ;
- }
-
- strcpy( memoedit_ptr, "M4" ) ;
- if ( (hand = u4temp_create(memoedit_ptr)) < 0 )
- {
- h4free_memory(ptr) ;
- return -1 ;
- }
-
- lseek( hand, 0L, 0 ) ;
- if ( write( hand, ptr, num_read ) != num_read )
- {
- h4free_memory(ptr) ;
- close(hand) ;
- u4error( E_WRITE, memoedit_ptr, (char *) 0 ) ;
- return -1 ;
- }
-
- close( hand ) ;
-
- if ( spawnl( P_WAIT, editor_name, "", memoedit_ptr, (char *) 0 ) < 0)
- {
- h4free_memory(ptr) ;
- close(hand) ;
- u4error( E_EDITOR, editor_name, (char *) 0 ) ;
- return -1 ;
- }
-
- if ( (hand = u4open(memoedit_ptr,0)) < 0 )
- {
- h4free_memory(ptr) ;
- return -1 ;
- }
-
- lseek( hand, 0L, 0 ) ;
- if ( (num_read = read(hand, ptr, max_size)) < 0 )
- {
- h4free_memory(ptr) ;
- close(hand) ;
- u4error( E_READ, memoedit_ptr, (char *) 0 ) ;
- return -1 ;
- }
-
- close(hand) ;
-
- u4remove( memoedit_ptr ) ;
-
- if ( m3write(field_ref, rec_num, ptr, num_read) < 0 )
- {
- h4free_memory(ptr) ;
- return -1 ;
- }
-
- h4free_memory( ptr ) ;
- #endif
- return 0 ;
- }
-
-
- m3write( long field_ref, long rec_num, char *str, int str_len )
- {
- BASE *base_ptr ;
- long memo_num, new_start_num ;
- int len_read, rc, len_write, new_base, old_base ;
-
- old_base = v4cur_base ;
- new_base = (int) (field_ref >> 16) ;
- base_ptr = v4base + new_base ;
-
- if ( base_ptr->memo_file < 0 )
- if ( m3open(new_base) < 0 ) return -1 ;
-
- d4select(new_base) ;
-
- if ( rec_num > d4reccount() )
- d4blank() ;
- else
- if ( (rc = d4go(rec_num)) < 0 )
- {
- d4select(old_base) ;
- return rc ;
- }
-
- memo_num = c4atol( f4ptr(field_ref), f4width(field_ref) ) ;
-
- rc = u4lock(base_ptr->memo_file, 0L, 0x7FFFFFFFL, v4lock_wait) ;
- if ( rc < 0 )
- {
- d4select(old_base) ;
- return rc ;
- }
- if ( str_len >= MEMO_SIZE && memo_num > 0 )
- {
- char buf[MEMO_SIZE] ;
- int read_size, i ;
-
- read_size = 0 ;
-
- lseek( base_ptr->memo_file, memo_num*MEMO_SIZE, 0 ) ;
-
- do
- {
- read_size += MEMO_SIZE ;
-
- len_read = read( base_ptr->memo_file, buf, MEMO_SIZE ) ;
- if ( len_read < 0 )
- {
- u4error( E_READ, m4name(new_base), (char *) 0 ) ;
- u4unlock( base_ptr->memo_file, 0L, 0x7FFFFFFFL ) ;
- d4select(old_base) ;
- return -1 ;
- }
- for ( i=0; i< MEMO_SIZE; i++ )
- if ( buf[i] == (char) 0x1A ) break ;
-
- } while ( i>= MEMO_SIZE ) ; /* Continue if Esc is not located */
-
- if ( read_size <= str_len ) memo_num = 0 ;
- }
- if ( memo_num == 0L )
- {
- lseek( base_ptr->memo_file, 0L, 0 ) ;
- rc = read( base_ptr->memo_file, (char *) &memo_num,
- (unsigned int) sizeof(memo_num)) ;
- if ( rc != (int) sizeof(memo_num) )
- {
- u4error(E_READ, m4name(new_base), (char *) 0);
- u4unlock( base_ptr->memo_file, 0L, 0x7FFFFFFFL ) ;
- d4select(old_base) ;
- return -1 ;
- }
- new_start_num = memo_num+ (str_len+MEMO_SIZE-1) / MEMO_SIZE ;
-
- lseek( base_ptr->memo_file, 0L, 0 ) ;
- rc = write( base_ptr->memo_file, (char *) &new_start_num,
- (unsigned int) sizeof(new_start_num)) ;
- if ( rc != (int) sizeof(new_start_num) ||
- write( base_ptr->memo_file, "\032", 1 ) != 1 )
- {
- u4error(E_WRITE, m4name(new_base), (char *) 0);
- u4unlock( base_ptr->memo_file, 0L, 0x7FFFFFFFL ) ;
- d4select(old_base) ;
- return -1 ;
- }
- }
-
- lseek( base_ptr->memo_file, MEMO_SIZE* memo_num, 0 ) ;
- len_write = write( base_ptr->memo_file, str, str_len ) ;
- if ( len_write == str_len)
- rc = write( base_ptr->memo_file, "\x1A", 1 ) ;
-
- if ( len_write != str_len || rc != 1 )
- {
- u4error( E_WRITE, m4name(new_base), (char *) 0 ) ;
- u4unlock( base_ptr->memo_file, 0L, 0x7FFFFFFFL ) ;
- d4select(old_base) ;
- return -1 ;
- }
-
- c4ltoa( memo_num, f4ptr(field_ref), f4width(field_ref) ) ;
-
- if ( rec_num > d4reccount() )
- rc = d4append() ;
- else
- rc = d4write(rec_num) ;
-
- if ( rc < 0 )
- {
- u4error( E_WRITE, m4name(new_base), (char *) 0 ) ;
- u4unlock( base_ptr->memo_file, 0L, 0x7FFFFFFFL) ;
- d4select(old_base) ;
- return -1 ;
- }
-
- d4select(old_base) ;
- if ( u4unlock( base_ptr->memo_file, 0L, 0x7FFFFFFFL) < 0) return -1 ;
-
- return str_len ;
- }
-