home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c160 / 1.ddi / SOURCE / M4.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-11-21  |  4.8 KB  |  194 lines

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