-#include <stdio.h>
-#include <dos.h>
-#include <malloc.h>
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <malloc.h>\r
+\r
+struct list {
+#ifdef __WATCOMC__\r
+ struct list __based(__self) *next;
+#endif
+#ifdef __BORLANDC__
+ struct list _seg *next;
+#endif\r
+ int value;\r
+};\r
+\r
+void main(int argc, char *argv[])\r
+{\r
+ int i;
+#ifdef __WATCOMC__\r
+ __segment segu;
+ void __based(__self) *pee;\r
+ struct list __based(segu) *head;\r
+ struct list __based(segu) *p;
+#endif
+#ifdef __BORLANDC__
+ void _seg *pee;\r
+ struct list _seg *head;\r
+ struct list _seg *p;
+#endif\r
+\r
+ /* allocate based heap */\r
+ segu = _bheapseg( 65536 );\r
+ if( segu == _NULLSEG ) {\r
+ printf( "Unable to allocate based heap\n" );\r
+ exit( 1 );\r
+ }\r
+\r
+ /* create a linked list in the based heap */\r
+ head = 0;\r
+ for( i = 1; i < 4096; i++ ) {\r
+ p = _bmalloc( segu, sizeof( struct list ) );\r
+ if( p == _NULLOFF ) {\r
+ printf( "_bmalloc failed\n" );\r
+ break;\r
+ }\r
+ p->next = head;\r
+ p->value = i;\r
+ head = p;\r
+ }\r
+\r
+ /* traverse the linked list, printing out values */\r
+ for( p = head; p != 0; p = p->next ) {\r
+ if(p==head || p->next==0 || p==pee){
+ printf("Segu = %04X", p); printf( " Value = %d\n", p->value );
+ }\r
+ }\r
-typedef struct {
- a_t __based( __self ) *next;
- int number;
-}a_t;
-
-void PrintLastTwo( a_t far *list );
-
-void
-main(int argc, char *argv[])
-{
- a_t far *list;
- PrintLastTwo(list);
-}
-
- void PrintLastTwo( a_t far *list )
- {
- __segment seg;
- a_t __based( seg ) *aptr;
-
- seg = FP_SEG( list );
- aptr = FP_OFF( list );
- for( ; aptr != _NULLOFF; aptr = aptr->next ) {
- if( aptr->next == _NULLOFF ) {
- printf( "Last item is %d\n",
- aptr->number );
- } else if( aptr->next->next == _NULLOFF ) {
- printf( "Second last item is %d\n",
- aptr->number );
- }
- }
- }
-
+ printf("program=%FP\n", *argv[0]);
+ printf("seg=%04X\n", segu);
+\r
+ /* free all the elements of the linked list */\r
+ for( ; p = head; ) {\r
+ head = p->next;\r
+ _bfree( segu, p );\r
+ }\r
+ /* free the based heap */\r
+ _bfreeseg( segu );
+}\r