[comp.sources.misc] v15i093: dmake version 3.6 patch 1

dvadura@watdragon.waterloo.edu (Dennis Vadura) (12/17/90)

Posting-number: Volume 15, Issue 93
Submitted-by: Dennis Vadura <dvadura@watdragon.waterloo.edu>
Archive-name: dmake-3.6/patch04

#!/bin/sh
# this is part 4 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file dm36.p1 continued
#
CurArch=4
if test ! -r s2_seq_.tmp
then echo "Please unpack part 1 first!"
     exit 1; fi
( read Scheck
  if test "$Scheck" != $CurArch
  then echo "Please unpack part $Scheck next!"
       exit 1;
  else exit 0; fi
) < s2_seq_.tmp || exit 1
sed 's/^X//' << 'SHAR_EOF' >> dm36.p1
XX***************
XX*** 34,39 ****
XX--- 34,46 ----
XX   * 
XX  */
XX  
XX+ #if defined (_MSC_VER)
XX+ # if _MSC_VER < 500
XX+ 	Force a compile-time blowup.
XX+ 	Do not define define _MSC_VER for MSC compilers ealier than 5.0.
XX+ # endif
XX+ #endif
XX+ 
XX  /* define this for configurations that don't have the coreleft function
XX   * so that the code compiles.  To my knowledge coreleft exists only on
XX   * Turbo C, but it is needed here since the function is used in many debug
XX***************
XX*** 48,57 ****
XX  #   define SIGTERM SIGINT
XX  #endif
XX  
XX! /* Fixes unimplemented line buffering for MSC
XX   * MSC _IOLBF is the same as _IOFBF
XX-  * This redefinition causes the following warning, but ignore it
XX-  * c:/usr/include/stdio.h(129) : warning C4005: '_IOLBF' : macro redefinition
XX   */
XX  #if defined(MSDOS) && defined (_MSC_VER)
XX  #   undef  _IOLBF
XX--- 55,62 ----
XX  #   define SIGTERM SIGINT
XX  #endif
XX  
XX! /* Fixes unimplemented line buffering for MSC 5.x and 6.0.
XX   * MSC _IOLBF is the same as _IOFBF
XX   */
XX  #if defined(MSDOS) && defined (_MSC_VER)
XX  #   undef  _IOLBF
XX***************
XX*** 59,65 ****
XX  #endif
XX  
XX  /* in alloc.h: size_t is redefined
XX!  * defined in stdio.h which is included alloc.h
XX   */
XX  #if defined(MSDOS) && defined (_MSC_VER)
XX  #   define _TYPES_
XX--- 64,70 ----
XX  #endif
XX  
XX  /* in alloc.h: size_t is redefined
XX!  * defined in stdio.h which is included by alloc.h
XX   */
XX  #if defined(MSDOS) && defined (_MSC_VER)
XX  #   define _TYPES_
XX*** /u2/dvadura/src/generic/dmake/src-patchlvl1/msdos/exec.h	Sat Oct  6 12:05:40 1990
XX--- msdos/exec.h	Sun Oct 28 23:16:16 1990
XX***************
XX*** 9,16 ****
XX  #endif
XX  #endif
XX  
XX! extern int  exec ANSI((int, char far *, char far *, unsigned int,
XX! 		       unsigned int, char far *));
XX  
XX  #ifndef MK_FP
XX  #define MK_FP(seg,ofs) \
XX--- 9,15 ----
XX  #endif
XX  #endif
XX  
XX! extern int  exec ANSI((int, char far *, char far *, unsigned int, char far *));
XX  
XX  #ifndef MK_FP
XX  #define MK_FP(seg,ofs) \
XX*** /u2/dvadura/src/generic/dmake/src-patchlvl1/msdos/exec.asm	Sat Oct  6 12:05:50 1990
XX--- msdos/exec.asm	Sun Oct 28 23:16:15 1990
XX***************
XX*** 1,6 ****
XX! ; You must assemble this file with masm (or tasm) flag
XX! ;    /dmmodel where model is one of {small, compact, medium, large}
XX  ;
XX  ifdef msmall
XX  	        .model	small
XX  argbase		equ	4
XX--- 1,44 ----
XX! ; SYNOPSIS
XX! ;      Exec code for the swapping version of DOS spawn.
XX! ; 
XX! ; DESCRIPTION
XX! ;      This code is a model independent version of DOS exec that will swap
XX! ;      the calling process out to secondary storage prior to running the
XX! ;      child.  The prototype for calling the exec function is below.
XX  ;
XX+ ;      exec( int swap, char far *program, char far *cmdtail,
XX+ ;	     int environment_seg, int env_size, char far *tmpfilename );
XX+ ;
XX+ ;
XX+ ;      To assemble this file issue the command:
XX+ ;
XX+ ;         tasm /mx /t /dmmodel exec.asm
XX+ ;
XX+ ;      where 'model' is one of {small, compact, medium, large}, you may
XX+ ;      also use MASM 5.1 to assemble this file, in this case simply replace
XX+ ;      'tasm' with 'masm' in the above command line.
XX+ ;
XX+ ; AUTHOR
XX+ ;      Dennis Vadura, dvadura@watdragon.uwaterloo.ca
XX+ ;      CS DEPT, University of Waterloo, Waterloo, Ont., Canada
XX+ ;
XX+ ; COPYRIGHT
XX+ ;      Copyright (c) 1990 by Dennis Vadura.  All rights reserved.
XX+ ; 
XX+ ;      This program is free software; you can redistribute it and/or
XX+ ;      modify it under the terms of the GNU General Public License
XX+ ;      (version 1), as published by the Free Software Foundation, and
XX+ ;      found in the file 'LICENSE' included with this distribution.
XX+ ; 
XX+ ;      This program is distributed in the hope that it will be useful,
XX+ ;      but WITHOUT ANY WARRANTY; without even the implied warrant of
XX+ ;      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
XX+ ;      GNU General Public License for more details.
XX+ ; 
XX+ ;      You should have received a copy of the GNU General Public License
XX+ ;      along with this program;  if not, write to the Free Software
XX+ ;      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
XX+ ;
XX  ifdef msmall
XX  	        .model	small
XX  argbase		equ	4
XX***************
XX*** 21,28 ****
XX  a_prog		equ	<bp+argbase+2>
XX  a_tail		equ	<bp+argbase+6>
XX  a_env 		equ	<bp+argbase+10>
XX! a_esiz		equ	<bp+argbase+12>
XX! a_tmp		equ	<bp+argbase+14>
XX  
XX  
XX  ; Define all useful equ's
XX--- 59,65 ----
XX  a_prog		equ	<bp+argbase+2>
XX  a_tail		equ	<bp+argbase+6>
XX  a_env 		equ	<bp+argbase+10>
XX! a_tmp		equ	<bp+argbase+12>
XX  
XX  
XX  ; Define all useful equ's
XX***************
XX*** 49,57 ****
XX  old_ss		dw	?		; save stack seg across exec
XX  old_sp		dw	?		; save stack ptr across exec
XX  progsize	dw	?		; original size of the program
XX  resend		dw	?		; paragraph where resident code ends
XX  envseg		dw	?		; paragraph of environment segment
XX- envsize		dw	?		; length of environment in paragraphs
XX  psp		dw	?		; our own psp
XX  swap		dw	?		; swapping selection flag
XX  retcode		dw	?		; return code from exec
XX--- 86,94 ----
XX  old_ss		dw	?		; save stack seg across exec
XX  old_sp		dw	?		; save stack ptr across exec
XX  progsize	dw	?		; original size of the program
XX+ rootsize	dw	?		; size of base root kept during swap
XX  resend		dw	?		; paragraph where resident code ends
XX  envseg		dw	?		; paragraph of environment segment
XX  psp		dw	?		; our own psp
XX  swap		dw	?		; swapping selection flag
XX  retcode		dw	?		; return code from exec
XX***************
XX*** 126,132 ****
XX  ; First define the critical-error and control-brk handlers. 
XX  ; The critical error handler simply pops the machine state and returns an
XX  ; access denied result code.
XX! crit_err_handler proc near
XX  		add	sp, 6		; ip/cs/flags ...
XX  		pop	ax
XX  		pop	bx
XX--- 163,169 ----
XX  ; First define the critical-error and control-brk handlers. 
XX  ; The critical error handler simply pops the machine state and returns an
XX  ; access denied result code.
XX! crit_err_handler proc far
XX  		add	sp, 6		; ip/cs/flags ...
XX  		pop	ax
XX  		pop	bx
XX***************
XX*** 150,174 ****
XX  
XX  ;-----------------------------------------------------------------------------
XX  ; Here we set the interrupted flag, and terminate the currently running
XX! ; ess. proc 
XX! ctl_brk_handler proc near
XX  		inc	cs:interrupted		; set the flag
XX  
XX  ; Make certain it isn't us that is going to get terminated.
XX  ; There is a small window where the in_exec flag is set but the child is
XX  ; not running yet, I assume that DOS doesn't test for ctl_brk at that time
XX! ; as it is bussily creating a new ess. proc 
XX  		cmp	cs:in_exec,0
XX! 		je	just_return
XX! 		mov	ax, 04cffH		; stop the sucker!
XX! 		int	21H
XX! just_return:	ret
XX  ctl_brk_handler endp
XX  
XX  
XX  ;-----------------------------------------------------------------------------
XX  ; Something really nasty happened, so abort the exec call and exit.
XX! ; This kills the calling ess proc altogether, and is a very nasty way of
XX  ; termination since files may still be open etc.
XX  abort_exec_rhdr label near
XX  		mov	dx, offset error_rhdr
XX--- 187,211 ----
XX  
XX  ;-----------------------------------------------------------------------------
XX  ; Here we set the interrupted flag, and terminate the currently running
XX! ; process.
XX! ctl_brk_handler proc far
XX! 		clc				; make sure carry is clear
XX  		inc	cs:interrupted		; set the flag
XX  
XX  ; Make certain it isn't us that is going to get terminated.
XX  ; There is a small window where the in_exec flag is set but the child is
XX  ; not running yet, I assume that DOS doesn't test for ctl_brk at that time
XX! ; as it is bussily creating a new process.
XX  		cmp	cs:in_exec,0
XX! 		je	just_return		; note this implies CF == 0
XX! 		stc				; set CF to abort child
XX! just_return:	iret
XX  ctl_brk_handler endp
XX  
XX  
XX  ;-----------------------------------------------------------------------------
XX  ; Something really nasty happened, so abort the exec call and exit.
XX! ; This kills the calling process altogether, and is a very nasty way of
XX  ; termination since files may still be open etc.
XX  abort_exec_rhdr label near
XX  		mov	dx, offset error_rhdr
XX***************
XX*** 187,196 ****
XX  		jmp	print_it
XX  abort_exec proc near
XX  		mov	dx, offset error_string
XX! print_it:	mov	bx, [swap]
XX  		call	[free_resource+bx]
XX  		mov	ax, cs
XX  		mov	ds, ax
XX  		mov	ah, 9
XX  		int	21H
XX  kill_program:	mov	ax, 04cffH			; nuke it!
XX--- 224,235 ----
XX  		jmp	print_it
XX  abort_exec proc near
XX  		mov	dx, offset error_string
XX! print_it:	push	dx
XX! 		mov	bx, [swap]
XX  		call	[free_resource+bx]
XX  		mov	ax, cs
XX  		mov	ds, ax
XX+ 		pop	dx
XX  		mov	ah, 9
XX  		int	21H
XX  kill_program:	mov	ax, 04cffH			; nuke it!
XX***************
XX*** 402,408 ****
XX  ;	- walk DOS allocation chain and write out all other segments owned by
XX  ;	  the current program that are contiguous with the _psp segment
XX  ;	- copy the environment down to low memory
XX! ;	- resize the current _psp segment to savesize+envsize.
XX  ;	- free all segments belonging to program except current _psp segment
XX  swap_out proc near
XX  		mov	ax, 05800H	; get memory alocation strategy
XX--- 441,447 ----
XX  ;	- walk DOS allocation chain and write out all other segments owned by
XX  ;	  the current program that are contiguous with the _psp segment
XX  ;	- copy the environment down to low memory
XX! ;	- resize the current _psp segment to savesize
XX  ;	- free all segments belonging to program except current _psp segment
XX  swap_out proc near
XX  		mov	ax, 05800H	; get memory alocation strategy
XX***************
XX*** 427,432 ****
XX--- 466,472 ----
XX  		add	bx, ax			; bx is size of program to keep
XX  		sub	si, bx			; si is # of paragraphs to save.
XX  		add	di, bx			; di is paragraph to start at
XX+ 		mov	rootsize, bx
XX  		mov	resend, di		; cs:resend is saved start para
XX  		mov	al, seg_no_alloc	; set no allocation for segment
XX  		call	write_segment
XX***************
XX*** 434,441 ****
XX  
XX  ; We have now saved the portion of the program segment that will not remain
XX  ; resident during the exec.  We should now walk the DOS allocation chain and
XX! ; write out all other segments owned by the current ess. proc 
XX! 		mov	ax, [psp]
XX  		dec	ax
XX  		mov	es, ax
XX  		mov	bx, offset write_segment_data
XX--- 474,481 ----
XX  
XX  ; We have now saved the portion of the program segment that will not remain
XX  ; resident during the exec.  We should now walk the DOS allocation chain and
XX! ; write out all other segments owned by the current process.
XX! save_segments:	mov	ax, [psp]
XX  		dec	ax
XX  		mov	es, ax
XX  		mov	bx, offset write_segment_data
XX***************
XX*** 443,486 ****
XX  		jc	abort_swap_out
XX  
XX  ; Now we must walk the chain of allocated memory blocks again and free
XX! ; all those that are owned by the current ess, proc except the one that is
XX! ; the current ess' proc psp.
XX! free_segments:	mov	es, [psp]
XX  		mov	bx, offset free_dos_segment
XX  		call	walk_arena_chain
XX! 		jnc	copy_environ
XX  		jmp	abort_exec_free		; can't fix it up now.
XX  
XX! ; we have now written all segments that belong to the program to some
XX! ; other resource.  We can now copy the environment and resize the psp
XX! ; segment.
XX! copy_environ:	mov	ax, [envseg]		; get the environment segment
XX! 		or	ax, ax			; skip copy if it's null
XX! 		je	resize_program
XX! 		push	ds
XX! 		push	es
XX! 		mov	bx, [resend]		; here is where the environ goes
XX! 		mov	es, bx		
XX! 		mov	cx, [envsize]
XX! 		add	bx, cx
XX! 		sub	bx, [psp]
XX! 		mov	[envsize], bx		; bx is size of program after
XX! 		shl	cx, 1			; environ is copied.
XX! 		shl	cx, 1
XX! 		shl	cx, 1
XX! 		shl	cx, 1
XX! 		mov	ds, ax			; ds:si is source address
XX! 		xor	si, si			; es:di is dest address
XX! 		mov	di, si			; cx is count in bytes.
XX! 		call	copy_data
XX! 		mov	[envseg], es		; point the envseg at the
XX! 		pop	es			; right spot
XX! 		pop	ds
XX! 
XX! ; We now resize the program to the size specified by cs:envsize.  This will
XX! ; free the memory taken up by the current program segment.
XX  resize_program: mov	es, [psp]		; es is segment to resize.
XX! 		mov	bx, [envsize]		; bx is size of segment.
XX  		mov	ah, 04aH		; resize memory block
XX  		int	21H
XX  		jnc	swap_out_ok
XX--- 483,502 ----
XX  		jc	abort_swap_out
XX  
XX  ; Now we must walk the chain of allocated memory blocks again and free
XX! ; all those that are owned by the current process, except the one that is
XX! ; the current process' psp.
XX! free_segments:	mov	ax, [psp]
XX! 		dec	ax
XX! 		mov	es,ax
XX  		mov	bx, offset free_dos_segment
XX  		call	walk_arena_chain
XX! 		jnc	resize_program
XX  		jmp	abort_exec_free		; can't fix it up now.
XX  
XX! ; We now resize the program to the size specified by cs:rootsize.  This will
XX! ; free most of the memory taken up by the current program segment.
XX  resize_program: mov	es, [psp]		; es is segment to resize.
XX! 		mov	bx, [rootsize]		; bx is size of segment.
XX  		mov	ah, 04aH		; resize memory block
XX  		int	21H
XX  		jnc	swap_out_ok
XX***************
XX*** 513,530 ****
XX  no_swap_out:	cmp	[interrupted], 0	; were we interrupted?
XX  		jne	leave_exec		; yep, so clean up, don't exec
XX  
XX  ; set up the parameter block for the DOS exec call.
XX  ;    offset  contents
XX  ;        00  segment address of environment to be passed,
XX  ; 	     0 => use parents env.
XX! ;        02  pointer to command tail for new ess. proc 
XX  ;        06  pointer to fcb1
XX  ;        0a  pointer to fcb2
XX  		mov	cx, cs
XX  		mov	[word ptr ex_cmdtail], offset cmdtail
XX  		mov	[word ptr ex_cmdtail+2], cx
XX- 		mov	ax, [envseg]
XX- 		mov	[ex_envseg], ax
XX  
XX  ; set up registers for exec call
XX  ;	ds:dx	- pointer to pathname of program to execute
XX--- 529,557 ----
XX  no_swap_out:	cmp	[interrupted], 0	; were we interrupted?
XX  		jne	leave_exec		; yep, so clean up, don't exec
XX  
XX+ ; free passed in environment block if it is non zero.
XX+ ; This way the parent program does not need to free it.
XX+ 		mov	ax, [envseg]
XX+ 		or	ax, ax
XX+ 		je	setup_block
XX+ 		push	ax
XX+ 		mov	es, ax
XX+ 		mov	ah, 49H
XX+ 		int	21H
XX+ 		pop	ax
XX+ 
XX  ; set up the parameter block for the DOS exec call.
XX  ;    offset  contents
XX  ;        00  segment address of environment to be passed,
XX  ; 	     0 => use parents env.
XX! ;        02  pointer to command tail for new process.
XX  ;        06  pointer to fcb1
XX  ;        0a  pointer to fcb2
XX+ setup_block:	mov	ax, [envseg]
XX+ 		mov	[ex_envseg], ax
XX  		mov	cx, cs
XX  		mov	[word ptr ex_cmdtail], offset cmdtail
XX  		mov	[word ptr ex_cmdtail+2], cx
XX  
XX  ; set up registers for exec call
XX  ;	ds:dx	- pointer to pathname of program to execute
XX***************
XX*** 560,574 ****
XX  		cbw
XX  		mov	[retcode], ax
XX  
XX! leave_exec: 	mov	[in_exec], 0	; all done, reset in_exec flag
XX! 		cmp	[swap], 0	; check swap, if non-zero swap back in
XX  		je	no_swap_in
XX  		call	swap_in
XX- no_swap_in:	ret
XX- do_exec endp
XX  
XX  
XX  
XX  ;==============================================================================
XX  ; Everything past this point is overwriten with the environment and new
XX  ; program after the currently executing program is swapped out.
XX--- 587,605 ----
XX  		cbw
XX  		mov	[retcode], ax
XX  
XX! leave_exec:	cmp	[swap], 0	; check swap, if non-zero swap back in
XX  		je	no_swap_in
XX  		call	swap_in
XX  
XX+ ; Clear the in_exec after the swap back in.  This way we are guaranteed to
XX+ ; get parent in and the resources freed should a ^C be hit when we are reading
XX+ ; the image in.
XX+ no_swap_in:	mov	[in_exec], 0
XX+ 		ret
XX+ do_exec endp				
XX  
XX  
XX+ 
XX  ;==============================================================================
XX  ; Everything past this point is overwriten with the environment and new
XX  ; program after the currently executing program is swapped out.
XX***************
XX*** 596,602 ****
XX  
XX  
XX  ;-----------------------------------------------------------------------------
XX! ; This routine is used to walk the DOS alocated memory block chain and,
XX  ; starting at address supplied in the es register.  For each block it
XX  ; calls the routine specified by the bx register with the segment length
XX  ; in si, and it's address in di.  It does not apply the routine to the
XX--- 627,633 ----
XX  
XX  
XX  ;-----------------------------------------------------------------------------
XX! ; This routine is used to walk the DOS allocated memory block chain
XX  ; starting at address supplied in the es register.  For each block it
XX  ; calls the routine specified by the bx register with the segment length
XX  ; in si, and it's address in di.  It does not apply the routine to the
XX***************
XX*** 612,625 ****
XX  		mov	di, es
XX  		inc	di
XX  		mov	ax, word ptr es:1
XX  		cmp	ax, cs:psp			; is it owned by us?
XX  		jne	walk_done			; NOPE!  -- all done
XX! 		cmp	di, cs:psp			; make sure we don't
XX! 		je	next_block			; touch our psp
XX  		push	di
XX  		push	si
XX  		push	bx
XX! 		call	bx				; handle the segment
XX  		pop	bx
XX  		pop	si
XX  		pop	di
XX--- 643,663 ----
XX  		mov	di, es
XX  		inc	di
XX  		mov	ax, word ptr es:1
XX+ 
XX+ ; Stop the search if the block is NOT owned by us.  Ignore our own psp block
XX+ ; and our environment segment block.
XX  		cmp	ax, cs:psp			; is it owned by us?
XX  		jne	walk_done			; NOPE!  -- all done
XX! 		cmp	di, cs:envseg			; skip our environment
XX! 		je	next_block
XX! 		cmp	di, cs:psp			; skip our psp
XX! 		je	next_block
XX! 
XX! ; Now save state and call the routine pointed at by [bx].
XX  		push	di
XX  		push	si
XX  		push	bx
XX! 		call	bx
XX  		pop	bx
XX  		pop	si
XX  		pop	di
XX***************
XX*** 818,825 ****
XX  ; This is the main entry routine into the swap code and corresponds to the
XX  ; following C function call:
XX  ;
XX! ; exec( int swap, char far *program, char far *cmdtail,
XX! ;	int environment_seg, int env_size, char far *tmpfilename );
XX  ;
XX  ; Exec performs the following:
XX  ;	1. set up the local code segment copies of arguments to the exec call.
XX--- 856,863 ----
XX  ; This is the main entry routine into the swap code and corresponds to the
XX  ; following C function call:
XX  ;
XX! ; exec( int swap, char far *program, char far *cmdtail, int environment_seg,
XX! ;	char far *tmpfilename );
XX  ;
XX  ; Exec performs the following:
XX  ;	1. set up the local code segment copies of arguments to the exec call.
XX***************
XX*** 827,839 ****
XX  ;	   stack.
XX  ;	3. save old interrupt vectors for ctrl-brk.
XX  ;	4. install our own handler for the ctrl-brk interrupt, our handler
XX! ;	   terminates the current running ess, proc and returns with non-zero
XX  ;	   status code.
XX  ;	5. get our psp
XX  ;	6. setup arguments for exec call
XX  ;	7. exec the program, save result code on return.
XX  ;       8. restore previous ctrl-brk and crit-error handler.
XX! ;       9. restore previous ess proc stack, and segment registers.
XX  ;      10. return from exec with child result code in AX
XX  ;	   and global _Interrupted flag set to true if child execution was
XX  ;	   interrupted.
XX--- 865,877 ----
XX  ;	   stack.
XX  ;	3. save old interrupt vectors for ctrl-brk.
XX  ;	4. install our own handler for the ctrl-brk interrupt, our handler
XX! ;	   terminates the current running process, and returns with non-zero
XX  ;	   status code.
XX  ;	5. get our psp
XX  ;	6. setup arguments for exec call
XX  ;	7. exec the program, save result code on return.
XX  ;       8. restore previous ctrl-brk and crit-error handler.
XX! ;       9. restore previous process stack, and segment registers.
XX  ;      10. return from exec with child result code in AX
XX  ;	   and global _Interrupted flag set to true if child execution was
XX  ;	   interrupted.
XX***************
XX*** 862,869 ****
XX  		mov	es:swap, ax
XX  		mov	ax, ss:[a_env]		; save env seg to use
XX  		mov	es:envseg, ax
XX- 		mov	ax, ss:[a_esiz]		; get environment's size
XX- 		mov	es:envsize, ax
XX  
XX  		mov 	di, offset cs:cmdpath	; copy the command
XX  		lds 	si, ss:[a_prog]		; 65 bytes worth
XX--- 900,905 ----
XX*** /u2/dvadura/src/generic/dmake/src-patchlvl1/msdos/config.mk	Thu Oct  4 09:24:52 1990
XX--- msdos/config.mk	Sun Oct 28 23:16:14 1990
XX***************
XX*** 6,12 ****
XX  
XX  # Memory model to compile for
XX  # set to s - small, m - medium, c - compact, l - large
XX! MODEL = c
XX  
XX  STARTUPFILE	= $(OS)/startup.mk
XX  
XX--- 6,16 ----
XX  
XX  # Memory model to compile for
XX  # set to s - small, m - medium, c - compact, l - large
XX! .IF $(DEBUG)
XX!    MODEL = l
XX! .ELSE
XX!    MODEL = c
XX! .END
XX  
XX  STARTUPFILE	= $(OS)/startup.mk
XX  
XX***************
XX*** 18,25 ****
XX  LDTMPLIB	= <+$(LDLIBS:s,/,\\,:t"+\n")\n+>
XX  
XX  # Debug flags
XX! DB_CFLAGS	= -DDBUG -v
XX! DB_LDFLAGS	= /v
XX  DB_LDLIBS	=
XX  
XX  # NO Debug flags
XX--- 22,29 ----
XX  LDTMPLIB	= <+$(LDLIBS:s,/,\\,:t"+\n")\n+>
XX  
XX  # Debug flags
XX! DB_CFLAGS	= -DDBUG
XX! DB_LDFLAGS	=
XX  DB_LDLIBS	=
XX  
XX  # NO Debug flags
XX***************
XX*** 31,38 ****
XX  CFLAGS         += -I$(OS)
XX  
XX  # Common MSDOS source files.
XX! # Define NOSWAP to non-null for the swap code to be excluded on making.
XX! .IF $(NOSWAP) == $(NULL)
XX     SWP_SRC = find.c spawn.c
XX     ASRC += exec.asm
XX  .END
XX--- 35,44 ----
XX  CFLAGS         += -I$(OS)
XX  
XX  # Common MSDOS source files.
XX! # Define SWAP to anything but 'y' for the swap code to be excluded on making.
XX! # Swapping for DOS versions is enabled by default.
XX! SWAP *= y
XX! .IF $(SWAP) == y
XX     SWP_SRC = find.c spawn.c
XX     ASRC += exec.asm
XX  .END
XX*** /u2/dvadura/src/generic/dmake/src-patchlvl1/msdos/arlib.c	Sat Oct  6 12:05:18 1990
XX--- msdos/arlib.c	Mon Oct 22 16:53:32 1990
XX***************
XX*** 1,4 ****
XX! /* RCS      -- $Header: /u2/dvadura/src/generic/dmake/src/msdos/RCS/arlib.c,v 1.1 90/10/06 12:05:19 dvadura Exp $
XX  -- SYNOPSIS -- Library access code.
XX  -- 
XX  -- DESCRIPTION
XX--- 1,4 ----
XX! /* RCS      -- $Header: /u2/dvadura/src/generic/dmake/src/msdos/RCS/arlib.c,v 1.1 90/10/06 12:05:19 dvadura Exp Locker: dvadura $
XX  -- SYNOPSIS -- Library access code.
XX  -- 
XX  -- DESCRIPTION
XX***************
XX*** 35,41 ****
XX  
XX  #include "extern.h"
XX  #include "stdmacs.h"
XX- #include "vextern.h"
XX  
XX  time_t
XX  seek_arch(name, lib)
XX--- 35,40 ----
XX*** /u2/dvadura/src/generic/dmake/src-patchlvl1/man/dmake.tf	Sat Oct  6 12:05:02 1990
XX--- man/dmake.tf	Sun Oct 28 13:26:42 1990
XX***************
XX*** 3,15 ****
XX  .ds TB "0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.5i +0.5i +2.0i
XX  .de Ip
XX  .fi
XX! .nr Ip \w\\$1 
XX  .IP "\\$1" \\n(Ipu
XX  \\$2
XX  .nf
XX  ..
XX  .de Is
XX! .nr )I \w\\$1u
XX  ..
XX  .de Ii
XX  .in \\n()Ru
XX--- 3,15 ----
XX  .ds TB "0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.5i +0.5i +2.0i
XX  .de Ip
XX  .fi
XX! .nr Ip \w'\\$1 '
XX  .IP "\\$1" \\n(Ipu
XX  \\$2
XX  .nf
XX  ..
XX  .de Is
XX! .nr )I \w'\\$1'u
XX  ..
XX  .de Ii
XX  .in \\n()Ru
XX***************
XX*** 50,57 ****
XX  .B -f
XX  flag then \fBdmake\fR uses standard input as the source of the makefile text.
XX  .PP
XX! Any macro definitions (arguments with embedded
XX! .Q "="
XX  signs) that appear on the command line are processed first
XX  and supercede definitions for macros of the same name found
XX  within the makefile.  In general it is impossible for definitions found
XX--- 50,56 ----
XX  .B -f
XX  flag then \fBdmake\fR uses standard input as the source of the makefile text.
XX  .PP
XX! Any macro definitions (arguments with embedded "="
XX  signs) that appear on the command line are processed first
XX  and supercede definitions for macros of the same name found
XX  within the makefile.  In general it is impossible for definitions found
XX***************
XX*** 77,85 ****
XX  section found at the end of this document.
XX  .SH OPTIONS
XX  .IP "\fB\-A\fR"
XX! Enable AUGMAKE special inference rule transformations (see the
XX! .Q "PERCENT(%) RULES"
XX! section), these are set to off by default.
XX  .IP "\fB\-e\fR"
XX  Read the environment and define all strings of the
XX  form '\fBENV-VAR\fP=\fIevalue\fP'
XX--- 76,83 ----
XX  section found at the end of this document.
XX  .SH OPTIONS
XX  .IP "\fB\-A\fR"
XX! Enable AUGMAKE special inference rule transformations
XX! (see the "PERCENT(%) RULES" section), these are set to off by default.
XX  .IP "\fB\-e\fR"
XX  Read the environment and define all strings of the
XX  form '\fBENV-VAR\fP=\fIevalue\fP'
XX***************
XX*** 120,128 ****
XX  (useful for debugging, but cannot be re-read by \fBdmake\fP)
XX  .IP "\fB\-P#\fR"
XX  On systems that support multi-processing cause \fBdmake\fP to use \fI#\fP
XX! concurrent child processes to make targets.  See the
XX! .Q "MULTI PROCESSING"
XX! section for more information.
XX  .IP "\fB\-q\fR"
XX  Check and see if the target is up to date.  Exits with code 0 if up to date,
XX  1 otherwise.
XX--- 118,125 ----
XX  (useful for debugging, but cannot be re-read by \fBdmake\fP)
XX  .IP "\fB\-P#\fR"
XX  On systems that support multi-processing cause \fBdmake\fP to use \fI#\fP
XX! concurrent child processes to make targets.
XX! See the "MULTI PROCESSING" section for more information.
XX  .IP "\fB\-q\fR"
XX  Check and see if the target is up to date.  Exits with code 0 if up to date,
XX  1 otherwise.
XX***************
XX*** 718,724 ****
XX  Thus using another example we have:
XX  .RS
XX  .sp
XX! .Is "test/{ f1  ""f2"" """" }.o    "
XX  .Ii "test/{f1 f2}.o"
XX  --> test/f1.o test/f2.o
XX  .Ii "test/ {f1 f2}.o"
XX--- 715,721 ----
XX  Thus using another example we have:
XX  .RS
XX  .sp
XX! .Is "test/{ f1  f2 }.o    "
XX  .Ii "test/{f1 f2}.o"
XX  --> test/f1.o test/f2.o
XX  .Ii "test/ {f1 f2}.o"
XX***************
XX*** 725,732 ****
XX  --> test/ f1.o f2.o
XX  .Ii "test/{f1 f2} .o"
XX  --> test/f1 test/f2 .o
XX! .Ii "test/{ f1  ""f2"" """" }.o"
XX! --> test/f1.o test/f2.o test/.o
XX  .sp
XX  .Ii and
XX  .sp
XX--- 722,729 ----
XX  --> test/ f1.o f2.o
XX  .Ii "test/{f1 f2} .o"
XX  --> test/f1 test/f2 .o
XX! .Ii "test/{ "f1"  """" }.o"
XX! --> test/f1.o test/.o
XX  .sp
XX  .Ii and
XX  .sp
XX*** /u2/dvadura/src/generic/dmake/src-patchlvl1/man/dmake.p	Sat Oct  6 12:26:44 1990
XX--- man/dmake.p	Sun Oct 28 13:27:42 1990
XX***************
XX*** 869,879 ****
XX       A null token in the token list is specified using "".  Thus
XX       using another example we have:
XX  
XX!           test/{f1 f2}.o            --> test/f1.o test/f2.o
XX!           test/ {f1 f2}.o           --> test/ f1.o f2.o
XX!           test/{f1 f2} .o           --> test/f1 test/f2 .o
XX!           test/{ f1  "f2" "" }.o    --> test/f1.o test/f2.o
XX!                                     test/.o
XX  
XX            and
XX  
XX--- 869,878 ----
XX       A null token in the token list is specified using "".  Thus
XX       using another example we have:
XX  
XX!           test/{f1 f2}.o       --> test/f1.o test/f2.o
XX!           test/ {f1 f2}.o      --> test/ f1.o f2.o
XX!           test/{f1 f2} .o      --> test/f1 test/f2 .o
XX!           test/{               --> test/f1.o test/.o
XX  
XX            and
XX  
XX***************
XX*** 890,895 ****
XX--- 889,895 ----
XX       dencies.  Such entries are called _t_a_r_g_e_t_/_p_r_e_r_e_q_u_i_s_i_t_e or
XX       _r_u_l_e definitions.  Each rule definition is optionally fol-
XX       lowed by a set of lines that provide a recipe for updating
XX+      any targets defined by the rule.  Whenever ddmmaakkee attempts to
XX  
XX  
XX  
XX***************
XX*** 902,908 ****
XX  
XX  
XX  
XX-      any targets defined by the rule.  Whenever ddmmaakkee attempts to
XX       bring a target up to date and an explicit recipe is provided
XX       with a rule defining the target, that recipe is used to
XX       update the target.  A rule definition begins with a line
XX--- 902,907 ----
XX***************
XX*** 954,959 ****
XX--- 953,959 ----
XX  
XX       --    says to clear the previous list of prerequisites before
XX            adding the new prerequisites.  Thus,
XX+ 
XX  
XX  
XX  
XX*** /u2/dvadura/src/generic/dmake/src-patchlvl1/man/dmake.nc	Sat Oct  6 12:26:46 1990
XX--- man/dmake.nc	Mon Oct 29 20:29:13 1990
XX***************
XX*** 869,879 ****
XX       A null token in the token list is specified using "".  Thus
XX       using another example we have:
XX  
XX!           test/{f1 f2}.o            --> test/f1.o test/f2.o
XX!           test/ {f1 f2}.o           --> test/ f1.o f2.o
XX!           test/{f1 f2} .o           --> test/f1 test/f2 .o
XX!           test/{ f1  "f2" "" }.o    --> test/f1.o test/f2.o
XX!                                     test/.o
XX  
XX            and
XX  
XX--- 869,878 ----
XX       A null token in the token list is specified using "".  Thus
XX       using another example we have:
XX  
XX!           test/{f1 f2}.o       --> test/f1.o test/f2.o
XX!           test/ {f1 f2}.o      --> test/ f1.o f2.o
XX!           test/{f1 f2} .o      --> test/f1 test/f2 .o
XX!           test/{               --> test/f1.o test/.o
XX  
XX            and
XX  
XX***************
XX*** 890,895 ****
XX--- 889,895 ----
XX       dencies.  Such entries are called target/prerequisite or
XX       rule definitions.  Each rule definition is optionally fol-
XX       lowed by a set of lines that provide a recipe for updating
XX+      any targets defined by the rule.  Whenever dmake attempts to
XX  
XX  
XX  
XX***************
XX*** 902,908 ****
XX  
XX  
XX  
XX-      any targets defined by the rule.  Whenever dmake attempts to
XX       bring a target up to date and an explicit recipe is provided
XX       with a rule defining the target, that recipe is used to
XX       update the target.  A rule definition begins with a line
XX--- 902,907 ----
XX***************
XX*** 954,959 ****
XX--- 953,959 ----
XX  
XX       -    says to clear the previous list of prerequisites before
XX            adding the new prerequisites.  Thus,
XX+ 
XX  
XX  
XX  
XX*** /u2/dvadura/src/generic/dmake/src-patchlvl1/makefile.mk	Tue Oct  9 21:19:30 1990
XX--- makefile.mk	Tue Oct 30 13:24:08 1990
XX***************
XX*** 9,15 ****
XX  #
XX  # Valid values for the above macros are:
XX  #
XX! #	OS            - unix, msdos
XX  #       OSRELEASE     - bsd43, sysvr3, 386ix
XX  #		      - tccdos, mscdos  (valid only of OS == msdos)
XX  #       OSENVIRONMENT - uw {valid for unix, bsd43 configuration only.}
XX--- 9,15 ----
XX  #
XX  # Valid values for the above macros are:
XX  #
XX! #	OS            - unix, msdos, tos
XX  #       OSRELEASE     - bsd43, sysvr3, 386ix
XX  #		      - tccdos, mscdos  (valid only of OS == msdos)
XX  #       OSENVIRONMENT - uw {valid for unix, bsd43 configuration only.}
XX***************
XX*** 153,162 ****
XX  #
XX  #	dmake scripts	-- makes all the script files at once.
XX  #
XX! SH = $(@:s/swp-/-/:s,-,/,:s/scripts/${SCRIPTFILE}/:s/c60d/cd/)
XX! MS = MAKESTARTUP=$(@:s/swp-/-/:s,-,/,:s/scripts/startup.mk/:s/c60d/cd/)
XX  
XX! scripts: unix-scripts msdos-scripts
XX  
XX  # To add a new environment for UNIX, simply create the appropriate entry
XX  # in the style below for the macro which contains the OS, OSRELEASE and
XX--- 153,164 ----
XX  #
XX  #	dmake scripts	-- makes all the script files at once.
XX  #
XX! SH_n = $(@:s/swp-/-/:s,-,/,:s/scripts/${SCRIPTFILE}/)
XX! MS_n = MAKESTARTUP=$(@:s/swp-/-/:s,-,/,:s/scripts/startup.mk/)
XX! SH = $(SH_n:s/c40d/cd/:s/c50d/cd/:s/c51d/cd/:s/c60d/cd/)
XX! MS = $(MS_n:s/c40d/cd/:s/c50d/cd/:s/c51d/cd/:s/c60d/cd/)
XX  
XX! scripts: unix-scripts atari-tos-scripts msdos-scripts
XX  
XX  # To add a new environment for UNIX, simply create the appropriate entry
XX  # in the style below for the macro which contains the OS, OSRELEASE and
XX***************
XX*** 169,176 ****
XX  unix-386ix-scripts-flags   = OS=unix OSRELEASE=386ix  OSENVIRONMENT=
XX  unix-bsd43-uw-scripts-flags= OS=unix OSRELEASE=bsd43  OSENVIRONMENT=uw
XX  unix-bsd43-vf-scripts-flags= OS=unix OSRELEASE=bsd43  OSENVIRONMENT=vf
XX  
XX! unix-scripts: clean
XX  	$(MAKE) SCRIPTFILE=make.sh unix-bsd43-scripts
XX  	$(MAKE) SCRIPTFILE=make.sh unix-bsd43-uw-scripts
XX  	$(MAKE) SCRIPTFILE=make.sh unix-bsd43-vf-scripts
XX--- 171,179 ----
XX  unix-386ix-scripts-flags   = OS=unix OSRELEASE=386ix  OSENVIRONMENT=
XX  unix-bsd43-uw-scripts-flags= OS=unix OSRELEASE=bsd43  OSENVIRONMENT=uw
XX  unix-bsd43-vf-scripts-flags= OS=unix OSRELEASE=bsd43  OSENVIRONMENT=vf
XX+ tos--scripts-flags          = OS=tos  OSRELEASE=       OSENVIRONMENT=
XX  
XX! unix-scripts .SWAP : clean
XX  	$(MAKE) SCRIPTFILE=make.sh unix-bsd43-scripts
XX  	$(MAKE) SCRIPTFILE=make.sh unix-bsd43-uw-scripts
XX  	$(MAKE) SCRIPTFILE=make.sh unix-bsd43-vf-scripts
XX***************
XX*** 178,185 ****
XX  	$(MAKE) SCRIPTFILE=make.sh unix-sysvr1-scripts
XX  	$(MAKE) SCRIPTFILE=make.sh unix-386ix-scripts
XX  
XX! unix-%-scripts:; $(MAKECMD) -ns $(MS) $($@-flags) >$(SH)
XX  
XX  # We make the standard dos scripts here, but we have to go and fix up the
XX  # make.bat file since it contains names of temporary files for the response
XX  # files required by the linker.  We need to also construct the response file
XX--- 181,192 ----
XX  	$(MAKE) SCRIPTFILE=make.sh unix-sysvr1-scripts
XX  	$(MAKE) SCRIPTFILE=make.sh unix-386ix-scripts
XX  
XX! unix-%-scripts .SWAP :; $(MAKECMD) -ns $(MS) $($@-flags) >$(SH)
XX! tos-%-scripts  .SWAP :; $(MAKECMD) -ns $(MS) $($@-flags) >$(SH)
XX  
XX+ atari-tos-scripts .SWAP : clean
XX+ 	$(MAKE) SCRIPTFILE=make.sh tos--scripts
XX+ 
XX  # We make the standard dos scripts here, but we have to go and fix up the
XX  # make.bat file since it contains names of temporary files for the response
XX  # files required by the linker.  We need to also construct the response file
XX***************
XX*** 190,216 ****
XX  # unix environment, and then make certain that the fix-msdos-%-scripts target
XX  # performs the correct function for the new environment.
XX  msdos-cf = OS=msdos OSENVIRONMENT=
XX! msdos-tccdos-scripts-flags = $(msdos-cf) OSRELEASE=tccdos NOSWAP=y
XX  msdos-tccdosswp-scripts-flags = $(msdos-cf) OSRELEASE=tccdos
XX! msdos-mscdos-scripts-flags = $(msdos-cf) OSRELEASE=mscdos NOSWAP=y
XX! msdos-msc60dos-scripts-flags= $(msdos-cf) OSRELEASE=mscdos NOSWAP=y MSC_VER=6.0
XX! msdos-mscdosswp-scripts-flags = $(msdos-cf) OSRELEASE=mscdos
XX  msdos-msc60dosswp-scripts-flags = $(msdos-cf) OSRELEASE=mscdos MSC_VER=6.0
XX  
XX! msdos-scripts: clean
XX  	$(MAKE) SCRIPTFILE=mk.bat msdos-tccdos-scripts
XX  	$(MAKE) SCRIPTFILE=mkswp.bat msdos-tccdosswp-scripts
XX- 	$(MAKE) SCRIPTFILE=mk.bat msdos-mscdos-scripts
XX- 	$(MAKE) SCRIPTFILE=mk60.bat msdos-msc60dos-scripts
XX- 	$(MAKE) SCRIPTFILE=mkswp.bat msdos-mscdosswp-scripts
XX- 	$(MAKE) SCRIPTFILE=mk60swp.bat msdos-msc60dosswp-scripts
XX  
XX! msdos-%-scripts:
XX  	$(MAKE) -nus $(MS) $($@-flags) >$(SH)
XX  	$(MAKE) -s $(MAKEMACROS) $(MS) $($@-flags) fix-msdos-$*-scripts
XX  
XX! MAPOBJ = $(*:s/tccdos/obj/:s/mscdos/obj/:s/msc60dos/obj60/).rsp
XX! MAPLIB = $(*:s/tccdos/lib/:s/mscdos/lib/:s/msc60dos/lib60/).rsp
XX  OBJRSP = $(SH:s,fix/,,:s,${SCRIPTFILE},${MAPOBJ},)
XX  LIBRSP = $(SH:s,fix/,,:s,${SCRIPTFILE},${MAPLIB},)
XX  DOSOBJ = $(CSTARTUP) $(OBJDIR)/{$(OBJECTS)}
XX--- 197,230 ----
XX  # unix environment, and then make certain that the fix-msdos-%-scripts target
XX  # performs the correct function for the new environment.
XX  msdos-cf = OS=msdos OSENVIRONMENT=
XX! msdos-tccdos-scripts-flags = $(msdos-cf) OSRELEASE=tccdos SWAP=n
XX  msdos-tccdosswp-scripts-flags = $(msdos-cf) OSRELEASE=tccdos
XX! msdos-msc40dos-scripts-flags= $(msdos-cf) OSRELEASE=mscdos SWAP=n MSC_VER=4.0
XX! msdos-msc40dosswp-scripts-flags = $(msdos-cf) OSRELEASE=mscdos MSC_VER=4.0
XX! msdos-msc50dos-scripts-flags= $(msdos-cf) OSRELEASE=mscdos SWAP=n MSC_VER=5.0
XX! msdos-msc50dosswp-scripts-flags = $(msdos-cf) OSRELEASE=mscdos MSC_VER=5.0
XX! msdos-msc51dos-scripts-flags= $(msdos-cf) OSRELEASE=mscdos SWAP=n MSC_VER=5.1
XX! msdos-msc51dosswp-scripts-flags = $(msdos-cf) OSRELEASE=mscdos MSC_VER=5.1
XX! msdos-msc60dos-scripts-flags= $(msdos-cf) OSRELEASE=mscdos SWAP=n MSC_VER=6.0
XX  msdos-msc60dosswp-scripts-flags = $(msdos-cf) OSRELEASE=mscdos MSC_VER=6.0
XX  
XX! msdos-scripts: clean tcc-scripts msc-scripts;
XX! 
XX! tcc-scripts .SWAP :
XX  	$(MAKE) SCRIPTFILE=mk.bat msdos-tccdos-scripts
XX  	$(MAKE) SCRIPTFILE=mkswp.bat msdos-tccdosswp-scripts
XX  
XX! msc-scripts .SWAP :! 40 50 51 60
XX! 	$(MAKE) SCRIPTFILE=mk$?.bat msdos-msc$?dos-scripts
XX! 	$(MAKE) SCRIPTFILE=mk$?swp.bat msdos-msc$?dosswp-scripts
XX! 40 50 51 60:;
XX! 
XX! msdos-%-scripts .SWAP :
XX  	$(MAKE) -nus $(MS) $($@-flags) >$(SH)
XX  	$(MAKE) -s $(MAKEMACROS) $(MS) $($@-flags) fix-msdos-$*-scripts
XX  
XX! MAPOBJ = obj$(SWAP:s/y/swp/:s/n//).rsp
XX! MAPLIB = lib$(SWAP:s/y/swp/:s/n//).rsp
XX  OBJRSP = $(SH:s,fix/,,:s,${SCRIPTFILE},${MAPOBJ},)
XX  LIBRSP = $(SH:s,fix/,,:s,${SCRIPTFILE},${MAPLIB},)
XX  DOSOBJ = $(CSTARTUP) $(OBJDIR)/{$(OBJECTS)}
XX*** /u2/dvadura/src/generic/dmake/src-patchlvl1/makefile	Sat Oct  6 12:04:34 1990
XX--- makefile	Tue Oct 30 13:23:40 1990
XX***************
XX*** 12,35 ****
XX  	@echo "   make bsd43vf       - Generic BSD 4.3 that needs vfprintf"
XX  	@echo "   make sysvr3        - Generic SysV R3 UNIX"
XX  	@echo "   make sysvr1        - Generic SysV R1 UNIX"
XX- 	@echo "   make 386ix         - 386/ix (SysV R3) [NOTE: not tested]"
XX  	@echo "   make dynix         - Sequent DYNIX system"
XX  	@echo "   make ultrix        - Ultrix 3.0 system"
XX  	@echo "   make mips          - Any MIPS box"
XX  	@echo "   make tcc           - DOS with tcc 2.0"
XX  	@echo "   make tccswp        - swapping DOS version with tcc 2.0"
XX! 	@echo "   make msc           - DOS with MSC 4.0 to 5.1"
XX  	@echo "   make msc60         - DOS with MSC 6.0"
XX! 	@echo "   make mscswp        - swapping DOS version with MSC 4.0 to 5.1"
XX  	@echo "   make msc60swp      - swapping DOS version with MSC 6.0"
XX  
XX  bsd43uw :; /bin/sh -x < unix/bsd43/uw/make.sh
XX  bsd43vf dynix mips        :; /bin/sh -x < unix/bsd43/vf/make.sh
XX  sysvr1 sysvr3 bsd43 386ix :; /bin/sh -x < unix/$@/make.sh
XX! ultrix : sysvr3;
XX  
XX  # DOS with some form of make and sh
XX  # Note if you do not have a 'make and/or sh' program under MSDOS then
XX  # typing 'make' in the dmake distribution directory will invoke the make.bat
SHAR_EOF
echo "End of part 4, continue with part 5"
echo "5" > s2_seq_.tmp
exit 0