home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c160 / 1.ddi / SOURCE / D4BUF_IN.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-06-22  |  2.9 KB  |  142 lines

  1.  
  2. /*  (c)Copyright Sequiter Software Inc., 1987-1990.  All rights reserved.
  3.  
  4.     d4buf_init()
  5. */
  6.  
  7. #include <string.h>
  8.  
  9. #include "p4misc.h"
  10. #include "d4all.h"
  11. #include "u4error.h"
  12.  
  13. static  H4BUF  d4buf =  { 0L, 0L, 0L, 0 } ;
  14.  
  15. long  d4buf_init( long start_try, long end_try, long ch_try )
  16. {
  17.    long  lrc, on_try ;
  18.  
  19.    if ( d4buf.len > 0L )
  20.    {
  21.       if ( d4buf_clear_all() < 0 )  return -1 ;
  22.  
  23.       u4huge_free( d4buf.buf_ptr ) ;
  24.  
  25.       d4buf.len =  0L ;
  26.       lrc = d4buf_init( start_try, end_try, ch_try ) ;
  27.       return lrc ;
  28.    }
  29.  
  30.    d4buf.len =  d4buf.avail =  d4buf.sub_avail =  0L ;
  31.  
  32.    if ( end_try > start_try  ||  ch_try <= 0L )
  33.    {
  34.       ch_try  =  1L ;
  35.       end_try =  start_try ;
  36.    }
  37.  
  38.    if ( start_try == 0L )  return( 0L ) ;
  39.  
  40.    for( on_try = start_try; on_try >= end_try; on_try -= ch_try )
  41.    {
  42.       d4buf.buf_ptr  =  (char H_PTR) u4huge_alloc( on_try ) ;
  43.  
  44.       if ( d4buf.buf_ptr != (char H_PTR) 0 )  
  45.       {
  46.          d4buf.len =  d4buf.avail =  d4buf.sub_avail =  on_try ;
  47.          d4buf_calc() ;
  48.          return on_try ;
  49.       }
  50.    }
  51.  
  52.    d4buf_calc() ;
  53.    return -2 ;
  54. }
  55.  
  56.  
  57. void  d4buf_save_status( H4BUF *saved_status )
  58. {
  59.    memcpy( (char *) saved_status, (char *) &d4buf, sizeof(H4BUF) ) ;
  60. }
  61.  
  62.  
  63. void  d4buf_restore_status( H4BUF *saved_status )
  64. {
  65.    memcpy( (char *) &d4buf, (char *) saved_status, sizeof(H4BUF) ) ;
  66. }
  67.  
  68.  
  69. void  d4buf_reset()
  70. {
  71.    d4buf.sub_avail =  d4buf.avail =  d4buf.len ;
  72. }
  73.  
  74. long  d4buf_avail()
  75. {
  76.    return( d4buf.avail ) ;
  77. }
  78.  
  79. void  d4buf_sub_set()
  80. {
  81.    d4buf.sub_avail =  d4buf.avail ;
  82. }
  83.  
  84. void  d4buf_avail_set()
  85. {
  86.    d4buf.avail =  d4buf.sub_avail ;
  87. }
  88.  
  89. /*  n_items -  The number of items. 
  90.     sz -       The size of each item. */
  91.  
  92. void H_PTR  d4buf_alloc( long n_items, unsigned sz )
  93. {
  94.    unsigned  wasted ;
  95.    long      n_bytes, used ;
  96.    union 
  97.    {
  98.       struct ptr_union { int off ; short seg ; } i ;
  99.       void H_PTR ptr ;
  100.    } r ;
  101.  
  102.    n_bytes =  n_items * sz ;
  103.    used =  d4buf.len - d4buf.avail ;
  104.    wasted = 0 ;
  105.  
  106.    if ( sz > 1 )
  107.    {
  108.       #ifdef OS2
  109.          if ( 0x10000L % sz  == 0L ) 
  110.             wasted =  (unsigned) (sz - used%sz) ;
  111.          else
  112.          {
  113.             if ( n_bytes > 0x10000L )
  114.                u4error( E_INTERNAL, "d4buf_alloc", (char *) 0 ) ;
  115.       
  116.             wasted =  (unsigned) (sz - (0x10000L - used%0x10000L) % sz) ;
  117.          }
  118.       #else
  119.          wasted = (unsigned) (0x10 - used%0x10) ;
  120.       #endif
  121.    }
  122.  
  123.    if ( n_bytes+wasted > d4buf.avail )  return( (void H_PTR) 0 ) ;
  124.  
  125.    d4buf.avail -= n_bytes+wasted ;
  126.    r.ptr =  d4buf.buf_ptr+ (d4buf.len-d4buf.avail-n_bytes) ;
  127.  
  128.    #ifndef OS2
  129.    #ifndef UNIX
  130.    #ifndef IS_386
  131.    #ifndef NO_HUGE
  132.       /* For DOS 16 bit integers compilers.  Normalize the pointer. */
  133.       r.i.seg +=  r.i.off/0x10 ;
  134.       r.i.off &=  0xF ;
  135.    #endif
  136.    #endif
  137.    #endif
  138.    #endif
  139.  
  140.    return( r.ptr ) ;
  141. }
  142.