/******************************************************************************* * * malloc.c * * COPYRIGHT(C) 1999(2000-2002) RENESAS TECHNOLOGY CORPORATION * AND RENESAS SOLUTIONS CORPORATION ALL RIGHTS RESERVED * * * $Id: malloc.c,v 1.6 2003/06/11 08:26:14 muranaka Exp $ * * NC30 Version 0.00.00 * * : Version 0.00.00 * * * *******************************************************************************/ #if defined(NC30) /* NCxx */ /* dummy */ #elif defined(NC77) #error "NC77 not supported" #elif defined(NC79) #error "NC79 not supported" #else #error "NC30, NC77, NC79 not defined" #endif /* NCxx */ #include #include #ifndef NULL #define NULL 0 #endif char _FAR *_mbase; /* */ char _FAR *_mnext; /* */ unsigned long _msize; /* */ struct _MEMT { struct _MEMT _FAR *top; /* */ unsigned long size; /* */ }; struct _MEMT _pool = { NULL, NULL }; /* */ struct _MEMT _memt = { NULL, NULL }; /* */ #define _MEMTSIZE sizeof( struct _MEMT ) char _FAR *getmem( unsigned int ); int rlsmem( char _FAR *cp, unsigned nbytes ); /******************************************************************************* * * calloc * * COPYRIGHT(C) 1999(2000-2002) RENESAS TECHNOLOGY CORPORATION * AND RENESAS SOLUTIONS CORPORATION ALL RIGHTS RESERVED * * * calloc -- * * #include * p = calloc( n, size ); * * char _FAR *p; * unsigned n; * unsigned size; * * * * * * * *******************************************************************************/ void _FAR *calloc( size_t n, size_t size ) /* */ { char _FAR *cp; /* */ if ( cp = malloc( n * size ) ) /* */ memset( cp, ( int )'\0', n * size ); /* */ return ( cp ); /* */ } /******************************************************************************* * * free * * COPYRIGHT(C) 1999(2000-2002) RENESAS TECHNOLOGY CORPORATION * AND RENESAS SOLUTIONS CORPORATION ALL RIGHTS RESERVED * * * free -- * * #include * ret = free( cp ); * * int ret; * void _FAR *cp; * * ret == 0 * == -1 "cp" * * malloc calloc * char * malloc calloc * * *******************************************************************************/ void free( void _FAR *cp ) /* */ { struct _MEMT _FAR *p; /* */ if( NULL == cp ) return; p = ( struct _MEMT _FAR * )cp - 1; /* */ #if 0 return ( rlsmem( ( char _FAR * )p, p->size * _MEMTSIZE ) ); #else rlsmem( ( char _FAR * )p, p->size * _MEMTSIZE ); #endif /* */ } /******************************************************************************* * * malloc -- Version 3.10.00 * * COPYRIGHT(C) 1999(2000-2002) RENESAS TECHNOLOGY CORPORATION * AND RENESAS SOLUTIONS CORPORATION ALL RIGHTS RESERVED * * * malloc -- * * #include * p = malloc( nbytes ); * * char _FAR *p; * unsigned nbytes; * * * * * * *******************************************************************************/ void _FAR *malloc( size_t nbytes ) /* */ { unsigned nunits; /* */ struct _MEMT _FAR *p; /* */ if ( nbytes == 0 ) return ( NULL ); /* "nbytes" */ nunits = ( nbytes + _MEMTSIZE * 2 - 1 ) / _MEMTSIZE; /* */ if ( ( p = ( struct _MEMT _FAR * )getmem( nunits * _MEMTSIZE ) ) == NULL ) return ( NULL ); /* */ p->size = nunits; /* */ return ( ( char _FAR * )( p + 1 ) ); /* */ } /******************************************************************************* * * realloc * * COPYRIGHT(C) 1999(2000-2002) RENESAS TECHNOLOGY CORPORATION * AND RENESAS SOLUTIONS CORPORATION ALL RIGHTS RESERVED * * * realloc -- * * #include * np = realloc( cp, nbytes ); * * char _FAR *np; * char _FAR *cp; * unsigned nbytes; * * * * * * malloc calloc * "cp" "nbytes" * * *******************************************************************************/ void _FAR *realloc( void _FAR *cp, size_t nbytes )/* */ { char _FAR *np; /* */ unsigned size; /* */ struct _MEMT _FAR *p; /* */ if ( ( np = malloc( nbytes ) ) != NULL ) { /* */ if ( cp != NULL ){ p = ( struct _MEMT _FAR * )cp - 1; /* */ size = p->size * _MEMTSIZE - _MEMTSIZE; /* */ if ( size > nbytes ) /* */ size = nbytes; /* */ memcpy( np, cp, size ); /* */ free( cp ); /* */ } } return( np ); /* */ } /******************************************************************************* * * getmem * * COPYRIGHT(C) 1999(2000-2002) RENESAS TECHNOLOGY CORPORATION * AND RENESAS SOLUTIONS CORPORATION ALL RIGHTS RESERVED * * * getmem -- * * p = getmem( nbytes ); * * char _FAR *p; * unsigned nbytes; * * * * * nbytes * * * *******************************************************************************/ char _FAR *getmem( unsigned nbytes ) /* */ { unsigned long lbytes; /* */ unsigned long lunits; /* */ struct _MEMT _FAR *p; /* */ struct _MEMT _FAR *q; /* */ lbytes = ( unsigned long )(nbytes); if ( lbytes <= 0L ) return ( NULL ); /* */ lunits = ( lbytes + _MEMTSIZE - 1 ) / _MEMTSIZE; /* */ q = &_memt; /* */ for ( p = q->top; p != NULL; q = p, p = p->top ) { /* */ if ( lunits <= p->size ) { /* */ if ( p->size != lunits ) { /* */ p->size -= lunits; /* */ p += p->size; /* */ } else q->top = p->top; /* */ _memt.size -= lunits; /* */ return ( ( char _FAR * )p ); /* */ } } if ( lunits * _MEMTSIZE >_msize ) /* */ return ( NULL ); /* */ p = ( struct _MEMT _FAR * )_mnext; /* */ _mnext += lbytes; /* */ _msize -= lbytes; /* */ if ( _pool.size == NULL ) { /* */ _pool.top = p; /* */ _pool.size = lunits; /* */ } else { /* */ q = _pool.top + _pool.size; /* */ if ( p == q ) /* */ _pool.size += lunits; /* */ } return ( ( char _FAR * )p ); /* */ } /******************************************************************************* * * rlsmem * * COPYRIGHT(C) 1999(2000-2002) RENESAS TECHNOLOGY CORPORATION * AND RENESAS SOLUTIONS CORPORATION ALL RIGHTS RESERVED * * * rlsmem -- * * ret = rlsmem( cp, nbytes ); * * int ret; * char _FAR *cp; * unsigned nbytes; * * ret == 0 * == -1 "cp" * * * * * * * * *******************************************************************************/ int rlsmem( char _FAR *cp, unsigned nbytes ) /* */ { long lbytes; /* */ long lunits; /* */ struct _MEMT _FAR *p; /* */ struct _MEMT _FAR *pu; /* */ struct _MEMT _FAR *q; /* */ struct _MEMT _FAR *qu; /* */ struct _MEMT _FAR *n; /* */ struct _MEMT _FAR *nu; /* */ lbytes = nbytes; if ( lbytes <= 0 ) return ( -1 ); /* */ n = ( struct _MEMT _FAR * )cp; /* */ lunits = ( lbytes + _MEMTSIZE - 1 ) / _MEMTSIZE; /* */ nu = n + lunits; /* */ _memt.size += lunits; /* */ q = &_memt; /* */ for ( p = q->top; p != NULL; q = p, qu = pu, p = p->top ) { /* */ pu = p + p->size; /* */ if ( p > nu ) { /* */ n->top = p; /* */ n->size = lunits; /* */ q->top = n; /* */ return ( 0 ); /* */ } if ( p == nu ) { /* */ n->top = p->top; /* */ n->size = lunits + p->size; /* */ q->top = n; /* */ return ( 0 ); /* */ } if ( n < pu ) { /* */ _memt.size -= lunits; /* */ return ( -1 ); /* */ } if ( n == pu ) { /* */ if ( p->top != NULL ) { /* */ if ( nu > p->top ) { /* */ _memt.size -= lunits; /* */ return ( -1 ); /* */ } } p->size += lunits; /* */ if ( p->top != NULL ) { /* */ if ( nu == p->top ) { /* */ p->size += nu->size; /* */ p->top = nu->top; /* */ } } return ( 0 ); /* */ } } q->top = n; /* "_MEMT" */ n->top = NULL; /* */ n->size = lunits; /* */ return ( 0 ); /* */ } /******************************************************************************* * * malloc.c * * COPYRIGHT(C) 1999(2000-2002) RENESAS TECHNOLOGY CORPORATION * AND RENESAS SOLUTIONS CORPORATION ALL RIGHTS RESERVED * * *******************************************************************************/