home *** CD-ROM | disk | FTP | other *** search
-
- /* (c)Copyright Sequiter Software Inc., 1987-1990. All rights reserved.
-
- d4buf_init()
- */
-
- #include <string.h>
-
- #include "p4misc.h"
- #include "d4all.h"
- #include "u4error.h"
-
- static H4BUF d4buf = { 0L, 0L, 0L, 0 } ;
-
- long d4buf_init( long start_try, long end_try, long ch_try )
- {
- long lrc, on_try ;
-
- if ( d4buf.len > 0L )
- {
- if ( d4buf_clear_all() < 0 ) return -1 ;
-
- u4huge_free( d4buf.buf_ptr ) ;
-
- d4buf.len = 0L ;
- lrc = d4buf_init( start_try, end_try, ch_try ) ;
- return lrc ;
- }
-
- d4buf.len = d4buf.avail = d4buf.sub_avail = 0L ;
-
- if ( end_try > start_try || ch_try <= 0L )
- {
- ch_try = 1L ;
- end_try = start_try ;
- }
-
- if ( start_try == 0L ) return( 0L ) ;
-
- for( on_try = start_try; on_try >= end_try; on_try -= ch_try )
- {
- d4buf.buf_ptr = (char H_PTR) u4huge_alloc( on_try ) ;
-
- if ( d4buf.buf_ptr != (char H_PTR) 0 )
- {
- d4buf.len = d4buf.avail = d4buf.sub_avail = on_try ;
- d4buf_calc() ;
- return on_try ;
- }
- }
-
- d4buf_calc() ;
- return -2 ;
- }
-
-
- void d4buf_save_status( H4BUF *saved_status )
- {
- memcpy( (char *) saved_status, (char *) &d4buf, sizeof(H4BUF) ) ;
- }
-
-
- void d4buf_restore_status( H4BUF *saved_status )
- {
- memcpy( (char *) &d4buf, (char *) saved_status, sizeof(H4BUF) ) ;
- }
-
-
- void d4buf_reset()
- {
- d4buf.sub_avail = d4buf.avail = d4buf.len ;
- }
-
- long d4buf_avail()
- {
- return( d4buf.avail ) ;
- }
-
- void d4buf_sub_set()
- {
- d4buf.sub_avail = d4buf.avail ;
- }
-
- void d4buf_avail_set()
- {
- d4buf.avail = d4buf.sub_avail ;
- }
-
- /* n_items - The number of items.
- sz - The size of each item. */
-
- void H_PTR d4buf_alloc( long n_items, unsigned sz )
- {
- unsigned wasted ;
- long n_bytes, used ;
- union
- {
- struct ptr_union { int off ; short seg ; } i ;
- void H_PTR ptr ;
- } r ;
-
- n_bytes = n_items * sz ;
- used = d4buf.len - d4buf.avail ;
- wasted = 0 ;
-
- if ( sz > 1 )
- {
- #ifdef OS2
- if ( 0x10000L % sz == 0L )
- wasted = (unsigned) (sz - used%sz) ;
- else
- {
- if ( n_bytes > 0x10000L )
- u4error( E_INTERNAL, "d4buf_alloc", (char *) 0 ) ;
-
- wasted = (unsigned) (sz - (0x10000L - used%0x10000L) % sz) ;
- }
- #else
- wasted = (unsigned) (0x10 - used%0x10) ;
- #endif
- }
-
- if ( n_bytes+wasted > d4buf.avail ) return( (void H_PTR) 0 ) ;
-
- d4buf.avail -= n_bytes+wasted ;
- r.ptr = d4buf.buf_ptr+ (d4buf.len-d4buf.avail-n_bytes) ;
-
- #ifndef OS2
- #ifndef UNIX
- #ifndef IS_386
- #ifndef NO_HUGE
- /* For DOS 16 bit integers compilers. Normalize the pointer. */
- r.i.seg += r.i.off/0x10 ;
- r.i.off &= 0xF ;
- #endif
- #endif
- #endif
- #endif
-
- return( r.ptr ) ;
- }
-