gregg@a.cs.okstate.edu (Gregg Wonderly) (09/26/88)
Posting-number: Volume 4, Issue 93 Submitted-by: "Gregg Wonderly" <gregg@a.cs.okstate.edu> Archive-name: vms-vi-2/Part02 $ show default $ if f$search("SRC.DIR;1") .eqs. "" then - CREATE/LOG/DIRECTORY [.SRC] $ write sys$output "Creating [.SRC]TPUSUBS.MAR" $ create [.SRC]TPUSUBS.MAR $ DECK/DOLLARS="*$*$*EOD*$*$*" .TITLE TPUSUBS ;+ *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* ; ; This file contains TPU CALL_USER support routines for VI. ; ; Written by Gregg Wonderly, June, 1987 ; ;- *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* $ssdef $rmsdef $lnmdef $iodef $qiodef $trmdef $ttdef $dcdef $jpidef $dvidef $prcdef TPU_CWD=1 TPU_TRNLNM_JOB=2 TPU_TRNLNM_PROC=3 TPU_TRNLNM_SYS=4 TPU_TRNLNM_GROUP=5 TPU_GETMSG=6 TPU_SET_SYSDISK=7 TPU_SLEEP=8 TPU_PASTHRU_ON=9 TPU_PASTHRU_OFF=10 DEBUG = 0 .psect data,rd,wrt,noexe,pic ;+ --- ; ;- --- .MACRO DEBUG,str .IF NE DEBUG pushab str calls #1,g^lib$put_output .ENDC .ENDM ;+ --- ; ;- --- .MACRO trnlnm_item,code,len,bufaddr,retlenaddr .WORD len .WORD code .ADDRESS - bufaddr .ADDRESS - retlenaddr .ENDM ;+ --- ; ;- --- .MACRO put_item,buf,code,len,bufaddr,retlenaddr MOVW len,buf MOVW code,buf+2 MOVAL bufaddr,buf+4 MOVAL retlenaddr,buf+8 .ENDM ;+ --- ; ;- --- iosb: .quad 0 sysc_descr: .ASCID /SYS$COMMAND/ iochan: .word 0 newchar_buf: .blkl 3 newchar_buf_len = .-newchar_buf ; tempchar_buf: .blkb newchar_buf_len ; par_settings: .long 0 tt_descr: .ASCID /TT:/ job_descr: .ASCID /LNM$JOB/ sys_descr: .ASCID /LNM$SYSTEM/ proc_descr: .ASCID /LNM$PROCESS/ group_descr: .ASCID /LNM$GROUP/ sysdisk_descr: .ASCID /SYS$DISK/ itemlist: trnlnm_item 0,0,0,0 itemlist_2: trnlnm_item 0,0,0,0 .long 0 msgnum: .long 0 stat: .long 0 i_parm_descr: .blkb 8 i_res_descr: .blkb 8 i_parm: .blkb 512 i_res: .blkb 512 timebuf: .long 0 .long 0 dummy: .long 0 tenths=-1000000 .psect code,exe,rd,nowrt,pic ;+ *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* ; ; ;- *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* .entry sleep,^m<r2,r3,r4,r5,r6> movl 4(ap),r0 mull3 r0,#tenths,r1 movl r1,timebuf movl #-1,timebuf+4 $schdwk_s - daytim=timebuf blbc r0,10$ $hiber_s blbs r0,20$ 10$: pushl r0 calls #1,g^lib$signal 20$: ret ;+ *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* ; ; ;- *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* .entry atoi,^m<r2,r3,r4,r5> movl 4(ap),r0 ;Get the descriptor address clrl r1 ;Clear the accumulator movl 4(r0),r2 ;Get the string address cvtwl (r0),r0 ;Get the length 10$: mull2 #10,r1 ;multiply by 10 cvtbl (r2)+,r3 addl3 r3,#-48,r4 ;Add in digit addl r4,r1 sobgtr r0,10$ movl r1,r0 ret ;+ *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* ; ; ; ; ;- *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* .entry tpu$calluser,^m<r2,r3,r4,r5> movl #512,i_res_descr ;Build result descriptor movab i_res,i_res_descr+4 movl #512,i_parm_descr ;Build parameter copy descriptor movab i_parm,i_parm_descr+4 pushl 8(ap) ;Make a copy of the parameter pushab i_parm_descr calls #2,g^str$copy_dx pushab dummy ;Set the length of the string pushab i_parm_descr pushl 8(ap) calls #3,g^str$analyze_sdesc put_item - ;Set descriptor up for $TRNLNM itemlist,#lnm$_string,- #512,i_res,i_res_descr put_item - itemlist_2,#0,#0,#0,#0 ;Dummy up descriptor movl 4(ap),r1 ;Get address of case value casew (r1),#TPU_CWD,#TPU_PASTHRU_OFF;Do case case_1: .word do_cwd - case_1 .word do_trnlnm_job - case_1 .word do_trnlnm_proc - case_1 .word do_trnlnm_sys - case_1 .word do_trnlnm_group - case_1 .word do_getmsg - case_1 .word do_set_sysdisk - case_1 .word do_sleep - case_1 .word do_pasthru_on - case_1 .word do_pasthru_off - case_1 ; .word case_2 - case_1 case_2: movl #SS$_BADPARAM,r0 ret ;+ *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* ; ; ;- *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* do_cwd: movw i_parm_descr,r1 ;Get the length of parameter tstl r1 ;If zero, then get current dir bneq 10$ pushal i_res_descr ;Push args pushal i_res_descr pushl #0 calls #3,g^sys$setddir brw out 10$: ;Otherwise set the current dir pushal i_res_descr pushal i_res_descr pushal i_parm_descr calls #3,g^sys$setddir brw out ;+ *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* ; ; ; ; ;- *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* do_trnlnm_job: $trnlnm_s - attr=#LNM$M_CASE_BLIND,- tabnam=job_descr,- lognam=i_parm_descr,- itmlst=itemlist brw out ;+ *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* ; ; ; ; ;- *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* do_trnlnm_proc: $trnlnm_s - attr=#LNM$M_CASE_BLIND,- tabnam=proc_descr,- lognam=i_parm_descr,- itmlst=itemlist brw out ;+ *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* ; ; ; ; ;- *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* do_trnlnm_sys: $trnlnm_s - attr=#LNM$M_CASE_BLIND,- tabnam=sys_descr,- lognam=i_parm_descr,- itmlst=itemlist brw out ;+ *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* ; ; ; ; ;- *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* do_trnlnm_group: $trnlnm_s - attr=#LNM$M_CASE_BLIND,- tabnam=group_descr,- lognam=i_parm_descr,- itmlst=itemlist brw out ;+ *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* ; ; ; ; ;- *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* do_getmsg: pushal i_parm_descr ;Convert the string to a number calls #1,atoi movl r0,msgnum ;Store the result movl #512,i_res_descr $getmsg_s - msgid=msgnum,- msglen=i_res_descr,- bufadr=i_res_descr brw out ;+ *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* ; ; ; ; ;- *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* do_set_sysdisk: pushal i_parm_descr pushal sysdisk_descr calls #2,g^lib$set_logical clrl i_res_descr brw out ;+ *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* ; ; ; ; ;- *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* do_sleep: pushal i_parm_descr ;Convert the string to a number calls #1,atoi pushl r0 calls #1,sleep clrl i_res_descr brw out ;+ *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* ; ; ; ; ;- *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* do_pasthru_on: $assign_s - devnam=tt_descr,- chan=iochan blbs r0,10$ 5$: pushl r0 pushl r0 calls #1,g^lib$signal movl (sp)+,r0 brw out 10$: movab dassign,(fp) $qiow_s - chan=iochan,- func=#IO$_SENSEMODE,- p1=newchar_buf,- p2=#newchar_buf_len blbs r0,20$ 15$: movl r0,r2 $dassgn_s - chan=iochan clrw iochan movl r2,r0 brw 5$ ; 20$: bisl2 #TT2$M_PASTHRU,newchar_buf+8 $qiow_s - chan=iochan,- func=#IO$_SETMODE,- p1=newchar_buf,- p2=#newchar_buf_len blbc r0,15$ $dassgn_s - chan=iochan clrw iochan clrl (fp) clrl i_res_descr brw out ;+ *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* ; ; ; ; ;- *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* .entry dassign,^m<> tstw iochan beql 10$ $dassgn_s - chan=iochan clrw iochan 10$: clrl i_res_descr ret ;+ *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* ; ; ; ; ;- *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* do_pasthru_off: $assign_s - devnam=tt_descr,- chan=iochan blbs r0,10$ 5$: pushl r0 pushl r0 calls #1,g^lib$signal movl -(sp),r0 brw out 10$: movab dassign,(fp) $qiow_s - chan=iochan,- func=#IO$_SENSEMODE,- p1=newchar_buf,- p2=#newchar_buf_len blbs r0,20$ 15$: movl r0,r2 $dassgn_s - chan=iochan clrw iochan movl r2,r0 brw 5$ ; 20$: bicl2 #TT2$M_PASTHRU,newchar_buf+8 $qiow_s - chan=iochan,- func=#IO$_SETMODE,- p1=newchar_buf,- p2=#newchar_buf_len blbc r0,15$ $dassgn_s - chan=iochan clrw iochan clrl (fp) clrl i_res_descr brw out ;+ *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* ; ; ; ; ;- *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* out: blbc r0,err pushal i_res_descr pushl 12(ap) calls #2,g^str$copy_dx movl 12(ap),r1 movw i_res_descr,(r1) movl #SS$_NORMAL,r0 err: ret .end *$*$*EOD*$*$* $ if f$search("SRC.DIR;1") .eqs. "" then - CREATE/LOG/DIRECTORY [.SRC] $ write sys$output "Creating [.SRC]VI.MAR" $ create [.SRC]VI.MAR $ DECK/DOLLARS="*$*$*EOD*$*$*" ; ; This file contains the source to a program that exercises callable ; TPU. You will be interested in using this program ONLY if you ; make use of more than ONE TPU utility that requires a CALL_USER ; routine, and/or you like to define TPUSECINI as opposed to using ; the /SECTION quailfier of EDIT/TPU. ; ; This program expects to be able to use the VI$CALLUSER logical ; to find the call_user routines for VI. It also uses VISECINI ; for the name of the TPU section file. Just to be complete, it will ; also use TPU$CALLUSER and TPUSECINI if the VI logicals do not exist. ; ; Written by Gregg Wonderly, 10-jul-1987 ; $ssdef $lnmdef $psldef $fabdef $rabdef $namdef .macro item,code,blen,badr,radr .word blen .word code .address - badr .address - radr .endm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Program data section ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .psect rwdata,rd,wrt,noexe fabdef: $fab fablen=.-fabdef rabdef: $rab rablen=.-rabdef namdef: $nam namlen=.-namdef blkdescr: .address 0 exit_h: .long 0 .address exit_handler .long 0 .address exit_stat ; exit_stat: .long 0 ; clean_flags: .long TPU$M_DELETE_JOURNAL!- TPU$M_DELETE_EXITH!- TPU$M_RESET_TERMINAL!- TPU$M_KILL_PROCESSES!- TPU$M_LAST_TIME bvpval: .long 0 ; bvp: .address - tpu_init .long 0 ; calluserd: .long 0 .long 0 ; fileiod: .address - TPU$FILEIO .long 0 ; crelnm_items: item LNM$_STRING,0,trnlnm_string,dummy .long 0 dummy: .long 0 trnlnm_items: item LNM$_STRING,512,trnlnm_string,string_len .long 0 .long 0 trnlnm_string: .blkb 512 sectdescr: string_len: .long .address - trnlnm_string vicalldescr: .ascid /VI_CALLUSER/ tpucalldescr: .ascid /TPU$CALLUSER/ visectdescr: .ascid /VI_SECTION/ tpusectdescr: .ascid /TPU$SECTION/ procdescr: .ascid /LNM$PROCESS_TABLE/ badvicall: .ascid /%VI-F-BADTPUCALL, improper definition of VI$CALLUSER/ badtpucall: .ascid /%VI-F-BADTPUCALL, improper definition of TPU$CALLUSER/ nocalluser: .ascid /%VI-F-NOCALLUSER, no calluser routine could be loaded/ .psect code,rd,exe,nowrt .entry noerr,^m<> ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; The program itself, straight forward no? ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .entry viedit,^m<r2,r3,r4,r5,r6> movab noerr,(fp) ;Forget about errors we will ;handle them pushal calluserd ;Push return address location pushab tpucalldescr ;Routine name pushab vicalldescr ;Image to search through calls #3,g^lib$find_image_symbol ;Find the symbol blbs r0,10$ ;Branch on success ; cmpl r0,#RMS$_FNF ;If FNF then try TPU$CALLUSER beql 5$ pushl r0 ;Save the exit value pushab badvicall ;Pass the right message brw 8$ ;Join the other code 5$: ; ; There is no VI$CALLUSER image, so try TPU$CALLUSER. ; pushal calluserd ;Push return address location pushab tpucalldescr ;Routine name pushab tpucalldescr ;Image to search through calls #3,g^lib$find_image_symbol ;Find the symbol blbs r0,10$ ;Branch if we got that pushl r0 ;Save the status cmpl r0,#RMS$_FNF ;If FNF then say the right thing beql 7$ ;Go set up the right parameter pushab badtpucall ;Push the message descr brb 8$ ;Join other code ; 7$: pushab nocalluser ;Push the message descr ; 8$: calls #1,g^lib$put_output ;Output the message calls #1,g^sys$exit ;Stop with the status pushed ; ; Got the calluser routine, continue processing ; 10$: clrl (fp) ;Remove condition handler $trnlnm_s - tabnam=procdescr,- lognam=visectdescr,- itmlst=trnlnm_items ;Get the VISECINI defintion blbc r0,20$ ;If that fails then don't worry ;If /SECTION is not there, then ;TPU will bark for us. ; pushaq sectdescr ;On success, redefine TPUSECINI ; pushaq tpusectdescr ;to be VISECINI's value ; calls #2,g^lib$set_logical ; blbs r0,20$ ; pushl r0 ; calls #1,g^sys$exit ;Exit with the condition 20$: movab g^tpu$handler,(fp) ;Establish tpu$handler pushab calluserd ;Pass the BVP's to parseinfo pushab fileiod ;Use TPU$FILEIO calls #2,g^tpu$parseinfo ;Get the command line stuff movl r0,bvpval ;This is the value for the ;call back routine to return ;to tpu$initialize, so save it. pushab bvp ;Pass the BVP for the callback calls #1,g^tpu$initialize ;Initialize TPU blbc r0,err ;Branch on error $dclexh_s - desblk=exit_h ;Establish an exit handler blbc r0,err calls #0,g^tpu$execute_inifile ;Execute the initialization blbc r0,err cmpl r0,#TPU$_SUCCESS bneq done ;Skip control if not SUCCESS calls #0,g^tpu$control ;Call control to do editing. blbc r0,err done: brb out err: pushl r0 ;Signal any error calls #1,g^sys$exit out: ret ;Back to caller ; ; Merely return the value that tpu$parseinfo returned to us ; .entry tpu_init,^m<> movl bvpval,r0 ret ; ; This exit handler is called at image exit to cleanup the things that ; are of no more interest to us. Sadly enough, there is not a perfect ; policy for the journal file that satisfies everyone. I have always ; written out my changes from time to time, so I really don't ever use ; the journal. The current itemlist to tpu$cleanup causes the journal ; to be deleted. WARNING, don't $FORCEX a VI that you wish to have the ; journal from. ; .entry exit_handler,^m<> pushal clean_flags calls #1,g^tpu$cleanup movl exit_stat,r0 ret ; ; ; ; .entry vi$fileio,^m<r2,r3,r4,r5,r6,r7,r8,r9> movl @4(ap),r1 ;Get the code cmpl r1,#TPU$K_OPEN bneq 10$ jmp tpu_open ; 10$: cmpl r1,#TPU$K_CLOSE bneq 20$ jmp tpu_close ; 20$: cmpl r1,#TPU$K_CLOSE_DELETE bneq 30$ jmp tpu_close_delete ; 30$: cmpl r1,#TPU$K_GET bneq 40$ jmp tpu_get ; 40$: cmpl r1,#TPU$K_PUT beql tpu_put movl #SS$_BADPARAM,r0 ret ; ; $PUT routine for VI to use ; tpu_put: ; ; $GET routine for VI to use ; tpu_get: ; ; $CLOSE with delete for VI to use ; tpu_close_delete: ; ; $CLOSE for VI to use ; tpu_close: ; ; $OPEN for VI to use ; tpu_open: ret .end viedit *$*$*EOD*$*$* $ if f$search("SRC.DIR;1") .eqs. "" then - CREATE/LOG/DIRECTORY [.SRC] $ write sys$output "Creating [.SRC]TPUSUBS.OPT" $ create [.SRC]TPUSUBS.OPT $ DECK/DOLLARS="*$*$*EOD*$*$*" TPUSUBS.OBJ UNIVERSAL=TPU$CALLUSER *$*$*EOD*$*$* $ if f$search("SRC.DIR;1") .eqs. "" then - CREATE/LOG/DIRECTORY [.SRC] $ write sys$output "Creating [.SRC]STEPWISE.TPU" $ create [.SRC]STEPWISE.TPU $ DECK/DOLLARS="*$*$*EOD*$*$*" PROCEDURE step_compile (fn) LOCAL pos, buf, spos, epos, rng; ON_ERROR IF ERROR = TPU$_COMPILEFAIL THEN QUIT; ENDIF; ENDON_ERROR buf := CREATE_BUFFER ("$$temp_buf$$", fn); IF (buf = 0) THEN MESSAGE ("Error loading file!!!"); RETURN; ENDIF; POSITION (BEGINNING_OF (buf)); pos := MARK (NONE); LOOP rng := SEARCH (line_begin & "PROC", FORWARD, EXACT); EXITIF (rng = 0); spos := BEGINNING_OF (rng); POSITION (spos); MESSAGE (CURRENT_LINE); rng := SEARCH (line_begin & "ENDPROC", FORWARD, EXACT); EXITIF (rng = 0); epos := BEGINNING_OF (rng); POSITION (epos); MOVE_VERTICAL (1); pos := MARK (NONE); MOVE_HORIZONTAL (-1); COMPILE (CREATE_RANGE (spos, MARK (NONE), NONE)); ENDLOOP; POSITION (pos); COMPILE ("PROCEDURE step_compile ENDPROCEDURE;"); EXECUTE (COMPILE (CREATE_RANGE (pos, END_OF (CURRENT_BUFFER), NONE))); ENDPROCEDURE; step_compile (GET_INFO (COMMAND_LINE, "FILE_NAME")); quit; *$*$*EOD*$*$* $ if f$search("SRC.DIR;1") .eqs. "" then - CREATE/LOG/DIRECTORY [.SRC] $ write sys$output "Creating [.SRC]MAKE.COM" $ create [.SRC]MAKE.COM $ DECK/DOLLARS="*$*$*EOD*$*$*" $ do="@[-.exe]do" $ if f$logical ("vi$root") .nes. "" THEN do="@[exe]do" $ if p1 .eqs. "ALL" then p1="TPUSUBS,EXE,VI" $ if p1 .eqs. "" then p1 = "VI" $ opers =","+p1+"," $ i = 1 $! $ NEXT_ELEM: $ next = f$element (i, ",", opers) $ i = i + 1 $ if (next .eqs. "") .or. (next .eqs. ",") then goto done $ write sys$output "* Making ''next'" $ on warning then goto go_err $ goto 'next' $ go_err: $ write sys$output " \''next'\" $ goto next_elem $! $ VI: $ on warning then stop $ do edit/tpu/command=stepwise.tpu/nodispay/nosection vi.tpu $ do rename vi.gbl [-.exe] $ set noon $ mcr install vi$root:[exe]vi.gbl/replace $ set on $ goto next_elem $! $ TPUSUBS: $ on warning then stop $ do macro tpusubs $ do link/share/exe=[-.exe]tpusubs tpusubs/opt $ goto next_elem $! $ EXE: $ on warning then stop $ do macro vi $ do link/exe=[-.exe]vi vi $ goto next_elem $! $ CLEAN: $ on warning then stop $ do purge/log VI$ROOT:[*...]*.* $ do delete/log VI$ROOT:[SRC]*.obj;,VI$ROOT:[SRC]MAKE.OUT; $ goto next_elem $! $ DONE: $ on warning then stop $ exit *$*$*EOD*$*$* $ exit