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 / D4USE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-08-31  |  4.8 KB  |  181 lines

  1.  
  2. /*  d4use.c   (c)Copyright Sequiter Software Inc., 1987, 1988, 1989.  All rights reserved.
  3. */
  4.  
  5. #include "d4base.h"
  6. #include "u4error.h"
  7.  
  8. #include <string.h>
  9.  
  10. #ifndef UNIX
  11.    #include <io.h>
  12. #endif
  13.  
  14. extern BASE      *v4base ;
  15. extern int       v4last_base ;
  16. extern int       v4cur_base  ;
  17. extern int       v4first ;
  18.  
  19. #define  LOCK_LEN   1L
  20.  
  21.  
  22. d4use( dbf_name )
  23. char *dbf_name ;
  24. {
  25.    int      i, rc, header_len ;
  26.    unsigned count, buffer_len ;
  27.    char    *buffer ;
  28.    char     name[90] ;
  29.  
  30.    BASE    *base_ptr ;
  31.    FIELD   *f_ptr    ;
  32.  
  33.    if ( v4first )  if ( d4init() < 0 )  return -1 ;
  34.  
  35.    u4name_full( name, dbf_name, ".DBF" ) ;
  36.    if ( (rc=d4ref(name)) >= 0 )  return( rc ) ;
  37.  
  38.    v4last_base=  h4get( (char **) &v4base, v4last_base) ;
  39.    if ( v4last_base < 0 )  return -1 ;
  40.  
  41.    base_ptr =  v4base+ v4last_base ;
  42.  
  43.    strncpy( base_ptr->name, name, 64) ;
  44.    base_ptr->name[63] = '\0' ;
  45.    strupr( base_ptr->name )  ;
  46.  
  47.    base_ptr->dos_file =  u4open( name, 0 ) ;
  48.  
  49.    if ( base_ptr->dos_file < 0)
  50.    {
  51.       v4last_base =  h4free ( (char **) &v4base, v4last_base ) ;
  52.       return   ( -1 ) ;
  53.    }
  54.  
  55.    if ( u4lock( base_ptr->dos_file, LOCK_START, LOCK_LEN, 1) != 0 )  return -1 ;
  56.  
  57.    lseek( base_ptr->dos_file, 0L, 0) ;
  58.    header_len =  (int) ( (char *)(base_ptr+1) - &base_ptr->version) ;
  59.    rc =  read( base_ptr->dos_file, &base_ptr->version, header_len) ;
  60.  
  61.    if ( rc != header_len  ||  base_ptr->header_len > 0x7FFF )
  62.    {
  63.       u4unlock( base_ptr->dos_file, LOCK_START, LOCK_LEN ) ;
  64.       close( base_ptr->dos_file );
  65.       v4last_base =  h4free ( (char **) &v4base, v4last_base ) ;
  66.       u4error( E_BAD_DBF, name, (char *) 0 ) ;
  67.       return( -1 ) ;
  68.    }
  69.  
  70.    buffer =  h4alloc( base_ptr->header_len ) ;
  71.    if ( buffer == (char *) 0 )  return( -1 ) ;
  72.  
  73.    lseek( base_ptr->dos_file, 0L, 0) ;
  74.    rc =  read( base_ptr->dos_file, buffer, base_ptr->header_len ) ;
  75.  
  76.    if ( rc != base_ptr->header_len )
  77.    {
  78.       u4unlock( base_ptr->dos_file, LOCK_START, LOCK_LEN ) ;
  79.       h4free_memory( buffer ) ;
  80.       close( base_ptr->dos_file ) ;
  81.       v4last_base =  h4free ( (char **) &v4base, v4last_base ) ;
  82.       u4error( E_BAD_DBF, name, (char *) 0 ) ;
  83.       return( -1 ) ;
  84.    }
  85.  
  86.    /* count the number of fields */
  87.    for (count=32; count <= base_ptr->header_len; count+= 32)
  88.       if ( buffer[count] ==  0xD )  break ;
  89.    base_ptr->num_fields =  (int) (count/32 - 1) ;
  90.  
  91.    f_ptr =  (FIELD *)  h4alloc( (int) sizeof(FIELD) * base_ptr->num_fields ) ;
  92.    if ( f_ptr == (FIELD *) 0 )  return( -1 ) ;
  93.  
  94.    base_ptr->fields =  f_ptr ;
  95.  
  96.    buffer_len       = 1 ;
  97.  
  98.    for (i=0; i< base_ptr->num_fields; i++)
  99.    {
  100.       memcpy( f_ptr->name,  buffer+ (i+1)*32,  11) ;
  101.  
  102.       f_ptr->type    =  buffer[ (i+1)*32 + 11 ] ;
  103.       if ( f_ptr->type == 'C' )
  104.       {
  105.          memcpy((char *) &f_ptr->width, (char *) buffer+ (i+1)*32+ 16, 2) ;
  106.          f_ptr->decimals=  0 ;
  107.       }
  108.       else
  109.       {
  110.          f_ptr->width   =  (unsigned char) buffer[ (i+1)*32 + 16 ] ;
  111.          f_ptr->decimals=  (unsigned char) buffer[ (i+1)*32 + 17 ] ;
  112.       }
  113.  
  114.       f_ptr->offset  =  buffer_len   ;
  115.       buffer_len    +=  f_ptr->width ;
  116.  
  117.       if ( buffer_len > 0x7FFF ) 
  118.       {
  119.      u4unlock( base_ptr->dos_file, LOCK_START, LOCK_LEN ) ;
  120.      close( base_ptr->dos_file ) ;
  121.      h4free_memory( buffer ) ;
  122.      h4free_memory( f_ptr ) ;
  123.      v4last_base =  h4free ( (char **) &v4base, v4last_base ) ;
  124.      close( base_ptr->dos_file ) ;
  125.      u4error( E_REC_LENGTH, (char *) 0 ) ;
  126.      return -1 ;
  127.       }
  128.  
  129.       f_ptr ++ ;
  130.    }
  131.  
  132.    h4free_memory( buffer ) ;
  133.  
  134.    base_ptr->buffer_len    =  buffer_len ;
  135.    base_ptr->index_ref     =  -1 ;
  136.    base_ptr->current_index =  -1 ;
  137.    base_ptr->memo_file     =  -1 ;
  138.    base_ptr->relate_ref    =  -1 ;
  139.    base_ptr->filter_ref    =  -1 ;
  140.  
  141.    /* Add an extra character for a NULL to end each buffer */
  142.    base_ptr->old_buf    =  h4alloc( buffer_len * 2+ 1) ;
  143.    if ( base_ptr->old_buf == (char *) 0 )  return -1 ;
  144.  
  145.    memset( base_ptr->old_buf, (int) ' ', (size_t) (buffer_len *2 + 1) ) ;
  146.    base_ptr->buffer     =  base_ptr->old_buf + buffer_len ;
  147.    base_ptr->buffer[buffer_len]  = '\0' ;
  148.  
  149.    if ( base_ptr->num_recs !=  
  150.       (filelength(base_ptr->dos_file) - base_ptr->header_len)/ 
  151.        base_ptr->buffer_len )
  152.    {
  153.       rc =  chsize( base_ptr->dos_file, base_ptr->num_recs*base_ptr->buffer_len
  154.                   +base_ptr->header_len+1) ;
  155.       if ( rc != 0 )
  156.       {
  157.      u4unlock( base_ptr->dos_file, LOCK_START, LOCK_LEN ) ;
  158.      u4error( E_CHANGE_SIZE, base_ptr->name, (char *) 0 ) ;
  159.      return -1 ;
  160.       }
  161.    }
  162.  
  163.    v4cur_base =  v4last_base ;
  164.    u4unlock( base_ptr->dos_file, LOCK_START, LOCK_LEN ) ;
  165.  
  166.    return( v4last_base );
  167.  
  168. }  /* end of d4use() */
  169.  
  170.  
  171. d4use_excl( dbf_name )
  172. char  *dbf_name ;
  173. {
  174.    int  rc ;
  175.  
  176.    rc =  d4use( dbf_name ) ;
  177.    if ( d4lock(-1L,1) < 0 )  return -1 ;
  178.  
  179.    return( rc ) ;
  180. }
  181.