home *** CD-ROM | disk | FTP | other *** search
- /*
- * Emulation of sbrk() that uses a fixed size preallocated buffer.
- * The buffer consumes half of the largest available memory segment,
- * or whatever it can get.
- */
-
- #ifndef HAVE_SBRK
-
- #include <errno.h>
- #include <exec/memory.h>
-
- char *_endptr; /* Start of sbrk() region */
- static int sbrksize; /* Size of the preallocated sbrk buffer */
- static char *sbrkval; /* Current pointer into sbrk buffer */
-
- static void sbrk_free_all (void)
- {
- extern void FreeMem (char *, int);
-
- FreeMem (_endptr, sbrksize);
- }
-
- char *sbrk (int incr)
- {
- char *sbrkrtn;
- char *newbrkval;
- extern char *AllocMem (int, int);
- extern int AvailMem (int);
- extern int atexit (void (*func)(void));
-
- if (_endptr == (char *) 0)
- {
- sbrksize = AvailMem (MEMF_LARGEST);
- while (sbrksize > 0) /* Should work first time... */
- {
- sbrksize >>= 1;
- sbrkval = _endptr = AllocMem (sbrksize, 0);
- if (sbrkval)
- {
- atexit (sbrk_free_all);
- break;
- }
- }
- }
- sbrkrtn = sbrkval;
- newbrkval = sbrkval + incr;
- if ((newbrkval >= _endptr) && (newbrkval < (_endptr + sbrksize)))
- {
- sbrkval = newbrkval;
- }
- else
- {
- sbrkrtn = (char *) -1;
- errno = ENOMEM;
- }
- return (sbrkrtn);
- }
-
- #endif /* HAVE_SBRK */
-
- #ifdef TEST_MAIN
-
- main ()
- {
- printf ("Begin value = 0x%x\n", sbrk (0));
- printf ("End is at 0x%x\n", _endptr);
- printf ("Sbrk buffer is 0x%x (%d) bytes\n", sbrksize, sbrksize);
- printf ("sbrk (0) = 0x%x\n", sbrk (0x0));
- printf ("sbrk (0x1000) = 0x%x\n", sbrk (0x1000));
- printf ("sbrk (0x2000) = 0x%x\n", sbrk (0x2000));
- printf ("sbrk (0x5000) = 0x%x\n", sbrk (0x5000));
- printf ("sbrk (0) = 0x%x\n", sbrk (0x0));
- printf ("sbrk (-0x5000) = 0x%x\n", sbrk (-0x5000));
- printf ("sbrk (-0x2000) = 0x%x\n", sbrk (-0x2000));
- printf ("sbrk (-0x1000) = 0x%x\n", sbrk (-0x1000));
- printf ("sbrk (0) = 0x%x\n", sbrk (0x0));
- }
-
- #endif
-