home *** CD-ROM | disk | FTP | other *** search
/ Piper's Pit BBS/FTP: ibm 0010 - 0019 / ibm0010-0019 / ibm0010.tar / ibm0010 / CODE4-1.ZIP / SOURCE.ZIP / M4.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-10-13  |  4.9 KB  |  204 lines

  1. /* m4.c   (c)Copyright Sequiter Software Inc., 1987, 1988, 1989.  All rights reserved. */
  2.  
  3. #include "d4base.h"
  4. #include "u4error.h"
  5. #include "m4.h"
  6.  
  7. #ifndef UNIX
  8.    #include <io.h>
  9.    #include <stdlib.h>
  10. #endif
  11.  
  12. #include <string.h>
  13.  
  14.  
  15. extern  BASE  *v4base ;
  16. extern  int    v4cur_base ;
  17.  
  18.  
  19. static char  name_buf[sizeof(v4base->name)+2] ;
  20.  
  21. char *m4name( base_ref )
  22. int  base_ref ;
  23. {
  24.    u4name_part( name_buf, v4base[base_ref].name, 1,0 ) ;
  25.    strupr( name_buf ) ;
  26.    u4name_full( name_buf, name_buf, ".DBT" ) ;
  27.  
  28.    return  name_buf ;
  29. }
  30.  
  31. m4open( base_ref ) 
  32. int  base_ref ;
  33. {
  34.    int   hand, rc ;
  35.    char *file_name ;
  36.    MEMO_HEADER   hdr ;
  37.  
  38.    if ( v4base[base_ref].memo_file >= 0 )
  39.       return( v4base[base_ref].memo_file ) ;
  40.  
  41.    file_name  =  m4name(base_ref) ;
  42.    if ( (hand =  u4open( file_name, 0 )) < 0 )  return -1 ;
  43.    lseek( hand, 0L, 0 ) ;
  44.    rc =   read( hand, (char *) &hdr, (unsigned int) sizeof( MEMO_HEADER ) ) ;
  45.    if ( rc != (int) sizeof(MEMO_HEADER) )
  46.    {
  47.       u4error( E_READ, "MEMO File: ", file_name, (char *) 0 ) ;
  48.       close( hand ) ;
  49.       return -1 ;
  50.    }
  51.  
  52.    u4name_part( file_name, file_name, 0,0 ) ;
  53.    strupr( file_name ) ;
  54.    if ( strncmp( file_name, hdr.file_name, 8 )  != 0 )
  55.    {
  56.       close( hand ) ;
  57.       u4error( E_MEMO_NAME, "File Name: ", file_name, (char *) 0 ) ;
  58.       return -1 ;
  59.    }
  60.  
  61.    v4base[base_ref].memo_file =  hand ;
  62.    v4base[base_ref].memo_size =  hdr.block_size ;
  63.  
  64.    return  hand ;
  65. }
  66.  
  67. m4exist( field_ref ) 
  68. long  field_ref ;
  69. {
  70.    if (  f4value(field_ref) > 0.0 )  
  71.       return 1 ;
  72.    else
  73.       return 0 ;
  74. }
  75.  
  76.  
  77. m4read( field_ref, rec_num, str, str_len)
  78. long  field_ref, rec_num ;
  79. char *str ;
  80. int   str_len ;
  81. {
  82.    BASE  *base_ptr ;
  83.    long   memo_num, memo_pos ;
  84.    int    old_base, new_base, rc, i_read, len_data, len_read ;
  85.    MEMO_BLOCK  memo_block ;
  86.  
  87.    old_base =  v4cur_base ;
  88.    new_base =  (int) (field_ref >> 16) ;
  89.  
  90.    base_ptr =  v4base + new_base ;
  91.  
  92.    d4select( new_base ) ;
  93.    if ( rec_num > d4reccount() )
  94.    {
  95.       d4go( 0L ) ;
  96.       rc = 0 ;
  97.    }
  98.    else
  99.       rc =  d4go( rec_num) ;
  100.  
  101.    d4select( old_base ) ;
  102.  
  103.    if ( rc < 0  ||  str_len < 0)  return -1 ;
  104.    if ( rc == 1 ) 
  105.    {
  106.       *str =  '\0' ;
  107.       return 0 ;
  108.    }
  109.  
  110.    memo_num =  c4atol( f4ptr(field_ref),  f4width(field_ref) ) ;
  111.    if ( memo_num == 0L )  return 0 ;
  112.  
  113.    if ( m4open( new_base ) < 0 )    return -1 ;
  114.  
  115.    memo_pos =  base_ptr->memo_size * memo_num ;
  116.  
  117.    if ( u4lock(base_ptr->memo_file, memo_pos, (long) str_len, 1) < 0 )
  118.       return -1 ;
  119.  
  120.    lseek( base_ptr->memo_file, memo_pos, 0 ) ;
  121.    if ( str_len < sizeof(memo_block) ) 
  122.    {
  123.       len_read =  read( base_ptr->memo_file, (char *) &memo_block, sizeof(memo_block)) ;
  124.       memcpy( str, (char *) &memo_block, str_len ) ;
  125.    }
  126.    else
  127.    {
  128.       len_read =  read( base_ptr->memo_file, str, str_len ) ;
  129.       memcpy( (char *) &memo_block, str, sizeof(memo_block) ) ;
  130.    }
  131.  
  132.    if ( len_read < 0 )
  133.    {
  134.       if ( u4unlock( base_ptr->memo_file, memo_pos, (long) str_len ) < 0 ) 
  135.      return -1 ;
  136.  
  137.       u4error( E_READ, m4name(new_base), (char *) 0 ) ;
  138.       return -1 ;
  139.    }
  140.  
  141.    if ( ((MEMO_BLOCK *) str)->minus_one != -1  || len_read < sizeof(MEMO_BLOCK) )
  142.    {
  143.       /* dBASE III Style Entry */
  144.       if ( u4unlock( base_ptr->memo_file, memo_pos, (long) str_len ) < 0 ) 
  145.      return -1 ;
  146.  
  147.       if ( len_read == str_len )  len_read-- ;
  148.  
  149.       for ( i_read= 0; i_read <= len_read; i_read++ ) 
  150.      if ( str[i_read] == 0x1A || i_read == len_read )
  151.      {
  152.         str[i_read] =  '\0' ;
  153.         return  i_read ;
  154.      }
  155.    }
  156.    else
  157.    {
  158.       /* dBASE IV Style Header */
  159.       if ( memo_block.num_chars > 0x7FFF )
  160.       {
  161.      if ( u4unlock( base_ptr->memo_file, memo_pos, (long) str_len ) < 0 )
  162.         return -1 ;
  163.      u4error( E_MEMO_SIZE, m4name(new_base), (char *) 0 ) ;
  164.      return -1 ;
  165.       }
  166.       len_data =  (int) memo_block.num_chars - memo_block.start_pos ;
  167.       len_read-=  memo_block.start_pos ;
  168.  
  169.       memmove( str, str+memo_block.start_pos, str_len- memo_block.start_pos ) ;
  170.  
  171.       if ( len_read >= len_data )
  172.       {
  173.      if ( u4unlock( base_ptr->memo_file, memo_pos, (long) str_len ) < 0 )
  174.         return -1 ;
  175.      str[len_data] =  '\0' ;
  176.  
  177.          return( len_data ) ;
  178.       }
  179.  
  180.       /* Read the Extra Data into the Memory Buffer */
  181.       lseek( base_ptr->memo_file, memo_pos+len_read+memo_block.start_pos, 0 ) ;
  182.       rc =  read( base_ptr->memo_file, str+len_read, str_len-len_read-1 ) ;
  183.  
  184.       if ( u4unlock( base_ptr->memo_file, memo_pos, (long) str_len ) < 0 ) 
  185.      return -1 ;
  186.  
  187.       if ( rc < 0 )
  188.       {
  189.      u4error( E_READ, m4name(new_base), (char *) 0 ) ;
  190.      return -1 ;
  191.       }
  192.  
  193.       len_read += rc ;
  194.       if ( len_read > len_data )
  195.      len_read =  len_data ;
  196.  
  197.       str[len_read] =  '\0' ;
  198.  
  199.       return( len_read ) ;
  200.    }
  201.  
  202.    return 0 ;  /* This Line is never executed; Present to stop warning */
  203. }
  204.