home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / CLIPPER / MISC / EMXLIB8F.ZIP / EMX / LIB / SYS / SBRK.C < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-02  |  1.5 KB  |  66 lines

  1. /* sys/sbrk.c (emx+gcc) -- Copyright (c) 1992-1993 by Eberhard Mattes */
  2.  
  3. #include <sys/emx.h>
  4. #include <os2emx.h>
  5. #include <errno.h>
  6. #include "syscalls.h"
  7.  
  8. void *__sbrk (int incr)
  9. {
  10.   ULONG rc;
  11.   void *old;
  12.   unsigned old_size, new_size;
  13.   unsigned addr, rest, size;
  14.  
  15.   old = _sys_heap_brk;
  16.   old_size = (char *)_sys_heap_brk - (char *)_sys_heap_base;
  17.   new_size = old_size + incr;
  18.   if (incr <= 0)
  19.     {
  20.       if (-incr > old_size)
  21.         {
  22.           errno = ENOMEM;
  23.           return ((void *)(-1));
  24.         }
  25.       _sys_heap_brk = (char *)_sys_heap_brk + incr;
  26.       return (old);
  27.     }
  28.   else if (new_size < old_size) /* overflow */
  29.     {
  30.       errno = ENOMEM;
  31.       return ((void *)(-1));
  32.     }
  33.   else if (new_size > _sys_heap_size)
  34.     {
  35.       errno = ENOMEM;
  36.       return ((void *)(-1));
  37.     }
  38.   else
  39.     {
  40.       addr = (unsigned)_sys_heap_brk;
  41.       size = incr;
  42.       if (addr & 0xfff)
  43.         {
  44.           rest = 0x1000 - (addr & 0xfff);
  45.           if (incr <= rest)
  46.             size = 0;
  47.           else
  48.             {
  49.               size -= rest;
  50.               addr += rest;
  51.             }
  52.         }
  53.       if (size != 0)
  54.         {
  55.           rc = DosSetMem ((void *)addr, size, PAG_DEFAULT | PAG_COMMIT);
  56.           if (rc != 0)
  57.             {
  58.               _sys_set_errno (rc);
  59.               return ((void *)(-1));
  60.             }
  61.         }
  62.       _sys_heap_brk = (char *)_sys_heap_brk + incr;
  63.       return (old);
  64.     }
  65. }
  66.