_WCRTLINK void _WCHUGE * halloc( unsigned long n, unsigned size ) { unsigned long len; USHORT error, tseg; SEL seg; USHORT number_segments, remaining_bytes; USHORT increment; len = n * size; if( len == 0 ) return( (void _WCHUGE *)0 ); if( n > 65536 && ! only_one_bit( size ) ) return( (void _WCHUGE *)0 ); error = DosGetHugeShift( &increment ); if( error ) { __set_errno_dos( error ); return( ( void _WCHUGE *)0 ); } number_segments = len >> 16; remaining_bytes = len & 0xffff; error = DosAllocHuge( number_segments, remaining_bytes, &seg, 0, 0 ); if( error ) { __set_errno_dos( error ); return( (void _WCHUGE *)0 ); /* allocation failed */ } tseg = seg; increment = 1 << increment; while( number_segments-- ) { _os2zero64k( 0, 0x8000, tseg, 0 ); tseg += increment; } if( remaining_bytes != 0 ) { /* 30-apr-91 */ _os2zero_rest( 0, remaining_bytes, tseg, 0 ); } return( (void _WCHUGE *)((unsigned long )seg << 16) ); }
_WCRTLINK void _WCHUGE *halloc( long numb, unsigned size ) { unsigned long amount; #if defined(__WINDOWS__) HANDLE hmem; LPSTR p; amount = (unsigned long)numb * size; if( amount == 0 ) return( HUGE_NULL ); if( amount > 65536 && ! only_one_bit( size ) ) return( HUGE_NULL ); hmem = GlobalAlloc( GMEM_MOVEABLE|GMEM_ZEROINIT, amount ); if( hmem == NULL ) return( HUGE_NULL ); p = GlobalLock( hmem ); return( p ); #else long seg; unsigned int num_of_paras; char _WCHUGE *hp; amount = (unsigned long)numb * size; if( amount == 0 || amount >= 0x100000 ) return( HUGE_NULL ); if( amount > 65536 && ! only_one_bit( size ) ) return( HUGE_NULL ); num_of_paras = __ROUND_UP_SIZE_TO_PARA( amount ); seg = _dosalloc( num_of_paras ); if( seg < 0 ) return( HUGE_NULL ); /* allocation failed */ hp = (char _WCHUGE *)MK_FP( (unsigned short)seg, 0 ); for( ;; ) { size = 0x8000; if( num_of_paras < 0x0800 ) size = num_of_paras << 4; _fmemset( hp, 0, size ); if( num_of_paras < 0x0800 ) break; hp = hp + size; num_of_paras -= 0x0800; } return( (void _WCHUGE *)MK_FP( (unsigned short)seg, 0 ) ); #endif }
_WCRTLINK void _WCHUGE *halloc( long n, unsigned size ) { unsigned long len; #if defined(__WINDOWS__) HANDLE hmem; LPSTR p; len = (unsigned long)n * size; if( len == 0 ) return( HUGE_NULL ); if( len > 65536 && ! only_one_bit( size ) ) return( HUGE_NULL ); hmem = GlobalAlloc( GMEM_MOVEABLE|GMEM_ZEROINIT, len ); if( hmem == NULL ) return( HUGE_NULL ); p = GlobalLock( hmem ); return( p ); #else long seg; unsigned int paras; char _WCHUGE *hp; len = (unsigned long)n * size; if( len == 0 || len >= 0x100000 ) return( HUGE_NULL ); if( len > 65536 && ! only_one_bit( size ) ) return( HUGE_NULL ); paras = (len + 15) >> 4; seg = _dosalloc( paras ); if( seg < 0 ) return( HUGE_NULL ); /* allocation failed */ hp = (char _WCHUGE *)MK_FP( (unsigned short)seg, 0 ); for( ;; ) { size = 0x8000; if( paras < 0x0800 ) size = paras << 4; _fmemset( hp, 0, size ); if( paras < 0x0800 ) break; hp = hp + size; paras -= 0x0800; } return( (void _WCHUGE *)MK_FP( (unsigned short)seg, 0 ) ); #endif }
_WCRTLINK void_hptr (halloc)( long n, size_t size ) { short seg; unsigned long len; len = (unsigned long)n * size; if( len == 0 ) return( NULL ); if( len > 65536 && !only_one_bit( size ) ) return( NULL ); seg = qnx_segment_huge( len ); if( seg == -1 ) seg = 0; return( (void_hptr)MK_FP( seg , 0 ) ); }
_WCRTLINK void_hptr (halloc)( long n, size_t size ) { short seg; unsigned long amount; amount = (unsigned long)n * size; if( amount == 0 ) return( NULL ); if( OVERFLOW_64K( amount ) && !only_one_bit( size ) ) return( NULL ); seg = qnx_segment_huge( amount ); if( seg == -1 ) seg = 0; return( (void_hptr)MK_FP( seg , 0 ) ); }