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 / D4PACK.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-10-14  |  2.0 KB  |  87 lines

  1. /* d4pack.c   (c) Copyright Sequiter Software Inc., 1987, 1988, 1989.  All rights reserved.
  2. */
  3.  
  4. #include "u4error.h"
  5. #include "d4base.h"
  6.  
  7. #ifndef UNIX
  8.    #include <io.h>
  9. #endif
  10.  
  11. extern  int  d4adjust( BASE *, long ) ;
  12.  
  13.  
  14. int d4pack()
  15. {
  16.    BASE  *base_ptr ;
  17.    long   read_rec, write_rec, base_count ;
  18.  
  19.    base_ptr   = d4ptr() ;
  20.  
  21.    /* Lock the Entire Database */
  22.    if ( d4lock( -1L, 1) < 0 )   return( -1 ) ;
  23.  
  24.    base_count =  d4reccount() ;
  25.    write_rec  = 0 ;
  26.  
  27.    /* Remove the Marked Records */
  28.    for (read_rec=1; read_rec <= base_count ;  read_rec++)
  29.    {
  30.       if ( d4go( read_rec)  < 0)
  31.        return( -1 ) ;
  32.  
  33.       if ( *base_ptr->buffer == ' ')
  34.       {
  35.      /* Write the Record */
  36.      lseek( base_ptr->dos_file,
  37.         base_ptr->header_len+ write_rec* base_ptr->buffer_len, 0) ;
  38.      if ( write( base_ptr->dos_file, base_ptr->buffer, base_ptr->buffer_len)
  39.           !=  base_ptr->buffer_len )
  40.      {
  41.         u4error( E_WRITE, base_ptr->name, (char *) 0 ) ;
  42.         return( -1) ;
  43.      }
  44.      write_rec++ ;  /* Now write_rec is the record just written */
  45.       }
  46.    }
  47.  
  48.    /* 'd4adjust' is also used by 'd4zap' */
  49.    return( d4adjust(base_ptr, write_rec) ) ;
  50. }
  51.  
  52.  
  53. d4adjust( base_ptr, num_recs )
  54. BASE *base_ptr ;
  55. long  num_recs ;
  56. {
  57.    lseek( base_ptr->dos_file,
  58.       base_ptr->header_len + num_recs*base_ptr->buffer_len, 0) ;
  59.  
  60.    if ( write( base_ptr->dos_file, "\x1A", 1) != 1)
  61.    {
  62.       u4error( E_WRITE, base_ptr->name, (char *) 0 ) ;
  63.       return( -1) ;
  64.    }
  65.  
  66.    /* write the record count */
  67.    lseek( base_ptr->dos_file, (long)4, 0) ;
  68.    if ( write( base_ptr->dos_file, (char *) &num_recs, 4) != 4)
  69.    {
  70.       u4error( E_WRITE, base_ptr->name, (char *) 0 ) ;
  71.       return( -1 ) ;
  72.    }
  73.  
  74.    /* change the database size */
  75.    if( chsize( base_ptr->dos_file,
  76.       (long)base_ptr->header_len + base_ptr->buffer_len*num_recs + 1 )
  77.        != 0 )  return( -1 ) ;
  78.  
  79.    #ifndef SMALL
  80.    /* Rebuild the Index Files */
  81.    if ( i4reindex(-1) < 0 )  return -1 ;
  82.    #endif
  83.  
  84.    base_ptr->rec_num = 0 ;
  85.    d4unlock( -1L ) ;
  86. }
  87.