* added compilers lcc and bcc (linux86)
[mascara-docs.git] / compilers / linux86-0.16.17 / libc / gnu_i386 / heap.c
blobbad7e257a24c664c18a06ddd6f848131b80d7123
1 /* Copyright (C) 1995-1997 Robert de Bath <rdebath@cix.compulink.co.uk>
2 * This file is part of the Linux-8086 C library and is distributed
3 * under the GNU Library General Public License.
4 */
6 #include <errno.h>
8 /****************************************************************************/
10 #if defined(__GNUC__) && defined(__i386__)
11 extern char * __brk_addr;
12 extern char * __brk();
14 #ifdef L___brk_addr
15 char * __brk_addr = 0; /* This holds the current return for sbrk(0) */
17 /* "mov %ebx,4(%esp),%ebx\n\t" "mov $45,%eax\n\t" */
19 char *
20 __brk(char * val)
22 char * retval;
23 __asm__(
24 "int $0x80"
25 : "=a" (retval)
26 : "0" (45), "b" (val)
28 return retval;
31 __brk_addr_init()
33 if( __brk_addr == 0 && (__brk_addr = __brk(0)) == 0 )
35 errno = ENOMEM;
36 return -1;
38 return 0;
40 #endif
42 #ifdef L_sbrk
43 char *
44 sbrk(brk_off)
45 int brk_off;
47 char * new_brk;
48 if( __brk_addr_init() ) return (char*)-1;
49 if( brk_off == 0 ) return __brk_addr;
51 new_brk = __brk_addr + brk_off;
52 __brk_addr = __brk(new_brk);
53 if( __brk_addr != new_brk )
55 errno = ENOMEM;
56 return (char*)-1;
58 return __brk_addr - brk_off;
60 #endif
62 #ifdef L_brk
63 int
64 brk(new_brk)
65 char * new_brk;
67 if( __brk_addr_init() ) return -1;
69 __brk_addr = __brk(new_brk);
70 if( __brk_addr == new_brk ) return 0;
71 errno = ENOMEM;
72 return -1;
74 #endif
76 #endif