PROC MIKESTREE (MTREE) IS ( LITERAL NAME := "", LITERAL LIBRARIES := "Y", LITERAL GROUPS := "Y", LITERAL STARTFROM := "", LITERAL STOPAFTER := "", LITERAL FILEMASK := "", LITERAL SIZE := "", LITERAL AGE := "", LITERAL TARGET := "", LITERAL ACTION := "", LITERAL AUTO_PAGE := "N", RESPONSE (RESPONSE) RESP := RESULT) BEGIN STOPT(NAM = NOLCS) STRING PHASE, OBJ_NAME, PAGE_ACTION, OBJ_ACTION, IN_BUFF, W_BUFF, REPLY, EXTRA_REPLY, MSG_TEXT, RES_CODE, PAGE_HELP, FILE_HELP, ACTION_HELP, FILEMASK_HELP STRING STPR := HEX(11), @ STart PRotected @ STUN := HEX(3C), @ Unprotected & Steady @ CLS := HEX(0C), @ Clear Screen @ NL := HEX(15), @ New Line @ SOM := HEX(2706), @ Set SOM to Cursor @ VP := HEX(22), @ Vertical Position @ HP := HEX(23) @ Horizontal Position @ INT FLAG, SFLAG, OBJECT_LIST, WORKING_LIST, OBJ, WORK, OBJ_CNT, PTR, LAST_OBJ, OBJ_PTR, CURR_POSN, LINES, LAST_LINE, REPLY_LEN, EXTRA_REPLY_LEN, LAST_REPLY BOOL SHOW_UNDEL, ALL_DELETED, AUTO_PG, STAY_ON_PAGE, OBJ_MARKED, DO_LIBS := (SUBSTR(LIBRARIES) OR HEX(40)) = "Y", DO_GRPS := (SUBSTR(GROUPS) OR HEX(40)) = "Y" (5000) BOOL DELETED SUPERSTRING (20, 45) ONAME SUPERSTRING (20, 2) OTYPE (20) INT OPTR PAGE_HELP := CLS + VP + BIN(2) + HP + BIN(4) + "N - Next page of groups/libraries" + NL + HP + BIN(4) + "P - Previous page" + NL + HP + BIN(4) + "F - First page" + NL + HP + BIN(4) + "L - Last page" + NL + HP + BIN(4) + " " + NL + HP + BIN(4) + "D - Display groups/libraries marked for" + NL + HP + BIN(4) + " deletion. These can then be deselected if" + NL + HP + BIN(4) + " required (see 'U')" + NL + HP + BIN(4) + " " + NL + HP + BIN(4) + "U - Display groups/libraries not marked for" + NL + HP + BIN(4) + " deletion. This is used for switching back" + NL + HP + BIN(4) + " after using 'D' to select deleted groups" + NL + HP + BIN(4) + " and libraries. Will automatically switch" + NL + HP + BIN(4) + " back if all groups/libraries to be deleted"+ NL + HP + BIN(4) + " are deselected" + NL + HP + BIN(4) + " " + NL + HP + BIN(4) + "H - Show this screen" + SOM + " " FILE_HELP := CLS + VP + BIN(2) + HP + BIN(4) + "Undeleted mode:" + NL + HP + BIN(4) + "M - do MIKES_FILE_MANAGER on group/library" + NL + HP + BIN(4) + " ACTION, TARGET and FILEMASK as supplied" + NL + HP + BIN(4) + "T - execute MIKES_TREE on group/library" + NL + HP + BIN(4) + "D - Display group/library details" + NL + HP + BIN(4) + "L - List group/library contents" + NL + HP + BIN(4) + "X - Mark group/library for later deletion" + NL + HP + BIN(4) + "H - Show this screen" + NL + HP + BIN(4) + " " + NL + HP + BIN(4) + "Deleted mode:" + NL + HP + BIN(4) + " " + NL + HP + BIN(4) + "D - Display group/library details" + NL + HP + BIN(4) + "L - List group/library contents" + NL + HP + BIN(4) + "U - Unmark file for deletion" + SOM + " " ACTION_HELP := "Action parameter - allows user specified actions to be" + NL + "executed. Parameter substitution will be performed on" + NL + "the line, the following rules being obeyed:" + NL + " " + NL + "%F = filename with FGN" + NL + "%G = filename without FGN [1]" + NL + "%S = object of MFT (source)" + NL + "%T = target specified to MFT (default = user)" + NL + " " + NL + "[1] Alternative suggestions welcome" + NL + " " FILEMASK_HELP := "Filemask parameter - allows a selected subset of files" + NL + "within the group/library to be selected, using wild" + NL + "carding. Not, sadly, as sophisticated as on Unix, but" + NL + "there we go. The character '*' substitutes for any " + NL + "number of characters. A trailing '*' is always assumed,"+ NL + "but a leading one is only assumed when there is no '*'" + NL + "in the string." + NL + "If the first character is '!' then only those files" + NL + "which do not match the mask will be selected." + NL + " " WHENEVER FLAG NE 0 THEN IF FLAG > 0 THEN SMSG("MIKES_TREE: ERROR WHEN " + PHASE) RESP := FLAG RETURN ELSE SMSG("MIKES_TREE: WARNING WHEN " + PHASE) SRSMSG(FLAG) FLAG := 0 FI FI IF ((ACTION = "?") OR (FILEMASK = "?")) THEN SMSG(CLS + HP + BIN(4)) IF ACTION = "?" THEN SMSG(ACTION_HELP) FI IF FILEMASK = "?" THEN SMSG(FILEMASK_HELP) FI RETURN FI PHASE := "CREATING OBJECT_LIST WORKFILE" CRF(LNA = OBJECT_LIST, RES = FLAG) PHASE := "CREATING WORKING_LIST WORKFILE" CRF(LNA = WORKING_LIST, RES = FLAG) PHASE := "DISPLAYING GROUPS AND LIBRARIES" IF NAME = "" THEN DUD(COM = GR&LB, STA = VAL STARTFROM, STO = VAL STOPAFTER, LIS = *OBJECT_LIST, RES = FLAG) ELSE DGRD(NAM = VAL NAME, COM = GR&LB, STA = VAL STARTFROM, STO = VAL STOPAFTER, LIS = *OBJECT_LIST, RES = FLAG) FI IF ((TARGET = "") OR (TARGET STARTSWITH ":")) THEN TARGET_TYPE := "U" ELSE TARGET_TYPE := "L" PHASE := "DISPLAYING LIBRARY DETAILS OF " + TARGET DLBD(NAM = VAL TARGET, COM = BASIC, LIS = DUMMY_FILE, RES = SFLAG) IF ((SFLAG = 31501) OR (SFLAG = 39905)) THEN TARGET_TYPE := "G" PHASE := "DISPLAYING GROUP DETAILS OF " + TARGET DGRD(NAM = VAL TARGET, COM = BASIC, LIS = DUMMY_FILE, RES = SFLAG) IF SFLAG = 31501 THEN SMSG(TARGET + " IS NOT A GROUP OR LIBRARY") RESP := 1 RETURN FI FI FI PHASE := "OPENING *OBJECT LIST" OPF(NAM = *OBJECT_LIST, CHA = OBJ, RES = FLAG) PHASE := "OPENING *WORKING_LIST" OPF(NAM = *WORKING_LIST, CHA = WORK, ACC = W, RES = FLAG) @ Read until either "*** NO LIB" or "---" is at the start of buffer @ "*** NO LIB" means an empty list SFLAG := 0 IN_BUFF := FILL(256) RDR(CHA = OBJ, REC = IN_BUFF, RES = SFLAG) UNTIL (((SFLAG NE 0) OR (IN_BUFF STARTSWITH "*** NO LIB")) OR (IN_BUFF STARTSWITH "---")) DO IF IN_BUFF STARTSWITH "*** DETAILS OF GROUP" THEN GR_UNAME := ":" + ((IN_BUFF AFTER ":") BEFORE ".") FI IN_BUFF := FILL(256) RDR(CHA = OBJ, REC = IN_BUFF, RES = SFLAG) REPEAT IF IN_BUFF STARTSWITH "*** NO LIB" THEN DO_LIBS := FALSE FI IF SFLAG = 0 THEN IN_BUFF := FILL(256) RDR(CHA = OBJ, REC = IN_BUFF, RES = SFLAG) FI PTR := 1 @ The list of libraries to be displayed is now stored in the @ working list file. UNTIL (((SFLAG NE 0) OR (IN_BUFF STARTSWITH "*** LIST")) OR (IN_BUFF STARTSWITH "*** NO")) DO @ Store libraryname(fgn) in the working file. Ignore empty lines, @ '***' lines (warnings) and aliases (permissions entries) UNLESS (((IN_BUFF STARTSWITH " ") OR (IN_BUFF STARTSWITH "***")) OR (IN_BUFF STARTSWITH "ICL9NALIAS")) THEN IF DO_LIBS THEN W_BUFF := "LB" + IN_BUFF BEFORE " " W_BUFF := W_BUFF + "(" + SUBSTR(IN_BUFF, 32, 5) + ")" PHASE := "WRITING WORK RECORD" WRR(CHA = WORK, REC = W_BUFF, RES = FLAG) PTR := PTR + 1 FI FI IN_BUFF := FILL(256) RDR(CHA = OBJ, REC = IN_BUFF, RES = SFLAG) REPEAT @ Now do the same for groups UNTIL (((SFLAG NE 0) OR (IN_BUFF STARTSWITH "*** NO ")) OR (IN_BUFF STARTSWITH "---")) DO IN_BUFF := FILL(256) RDR(CHA = OBJ, REC = IN_BUFF, RES = SFLAG) REPEAT IF IN_BUFF STARTSWITH "*** NO " THEN DO_GRPS := FALSE FI IF SFLAG = 0 THEN IN_BUFF := FILL(256) RDR(CHA = OBJ, REC = IN_BUFF, RES = SFLAG) FI @ The list of groups to be displayed is now stored in the @ working list file. UNTIL ((SFLAG NE 0) OR (IN_BUFF STARTSWITH "*** TOTAL")) DO UNLESS (((IN_BUFF STARTSWITH " ") OR (IN_BUFF STARTSWITH "***")) OR (IN_BUFF STARTSWITH "ICL9NALIAS")) THEN IF DO_GRPS THEN W_BUFF := "GR" + ((IN_BUFF + " ") BEFORE " ") PHASE := "WRITING WORK RECORD" WRR(CHA = WORK, REC = W_BUFF, RES = FLAG) PTR := PTR + 1 FI FI IN_BUFF := FILL(256) RDR(CHA = OBJ, REC = IN_BUFF, RES = SFLAG) REPEAT PHASE := "CLOSING OBJECT_LIST" CLOF(CHA = OBJ, RES = FLAG) PHASE := "CLOSING WORKING_LIST" CLOF(CHA = WORK, RES = FLAG) IF PTR = 1 THEN SMSG("EMPTY OBJECT LIST") RESP := 1 RETURN FI PHASE := "REOPENING WORKING_LIST" OPF(NAM = *WORKING_LIST, CHA = WORK, RES = FLAG) @ Start processing the list file. @ If a group or library is marked for deletion, the appropriate @ boolean array entry will be set. REPLY := FILL(2000) PAGE_ACTION := " " LAST_OBJ := PTR - 1 OBJ_PTR := 1 AUTO_PG := ((SUBSTR(AUTO_PAGE) OR HEX(40)) = "Y") SHOW_UNDEL := TRUE UNTIL PAGE_ACTION = "Q" DO MSG_TEXT := CLS + STPR + HP + BIN(4) + "Action: " + STUN + " " + STPR + " Next, Prev, First, Last, " IF SHOW_UNDEL THEN MSG_TEXT := MSG_TEXT + "Deleted," ELSE MSG_TEXT := MSG_TEXT + "Undeleted," FI MSG_TEXT := MSG_TEXT + " Autopage switch, Help, Quit" + NL IF AUTO_PG THEN MSG_TEXT := MSG_TEXT + "AUTOPAGE ON" ELSE MSG_TEXT := MSG_TEXT + "AUTOPAGE OFF" FI MSG_TEXT := MSG_TEXT + NL IF SHOW_UNDEL THEN MSG_TEXT := MSG_TEXT + "Details, Help, Mfm, Query, Tree, " + "Xgr/Xlb" ELSE MSG_TEXT := MSG_TEXT + "Details, Help, Undelete" FI MSG_TEXT := MSG_TEXT + NL PTR := 0 CURR_POSN := OBJ_PTR UNTIL ((PTR > 19) OR (OBJ_PTR > LAST_OBJ)) DO IF (SHOW_UNDEL NEQ DELETED[OBJ_PTR]) THEN PHASE := "READING RECORD " + NUMERIC(OBJ_PTR) + " OF WORK" RDRN(CHA = WORK, REC = W_BUFF, RNU = OBJ_PTR, RES = FLAG) OTYPE[PTR] := SUBSTR(W_BUFF, 0, 2) ONAME[PTR] := W_BUFF AFTER OTYPE[PTR] OPTR[PTR] := OBJ_PTR PTR := PTR + 1 FI OBJ_PTR = OBJ_PTR + 1 REPEAT LAST_LINE := PTR - 1 FOR PTR FROM 0 TO LAST_LINE DO MSG_TEXT := MSG_TEXT + STUN + " " + STPR + OTYPE[PTR] + " " + ONAME[PTR] + NL REPEAT MSG_TEXT := MSG_TEXT + VP + BIN(0) + HP + BIN(13) + SOM REPLY := FILL(2000) PHASE := "ASKING MESSAGE" AMSG(PRO = MSG_TEXT, MES = REPLY, LEN = REPLY_LEN, RES = FLAG) PAGE_ACTION := SUBSTR(REPLY) OR HEX(40) IF PAGE_ACTION = "H" THEN EXTRA_REPLY := FILL(2000) PHASE := "SHOWING PAGE HELP" AMSG(PRO = PAGE_HELP, MES = EXTRA_REPLY, LEN = EXTRA_REPLY_LEN, RES = FLAG) OBJ_PTR := CURR_POSN ELSF NOT (PAGE_ACTION = "Q") THEN IF PAGE_ACTION = "A" THEN IF AUTO_PG THEN AUTO_PG := FALSE ELSE AUTO_PG := TRUE FI PAGE_ACTION := " " FI REPLY := SUBSTR(REPLY, 1, LENGTH REPLY - 1) IF ((PAGE_ACTION = " ") AND AUTO_PG) THEN PAGE_ACTION := "N" FI STAY_ON_PAGE := FALSE LAST_REPLY := LENGTH REPLY - 1 IF LAST_REPLY > LAST_LINE THEN LAST_REPLY := LAST_LINE FI PTR := 0 UNTIL PTR > LAST_REPLY DO OBJ_ACTION := SUBSTR(REPLY, PTR) OR HEX(40) SFLAG := 0 IF OTYPE[PTR] = "LB" THEN IF NAME = "" THEN OBJ_NAME := ":." + ONAME[PTR] ELSF NAME STARTSWITH ":." THEN OBJ_NAME := NAME + "." + ONAME[PTR] ELSE OBJ_NAME := ":." + NAME + "." + ONAME[PTR] FI ELSE OBJ_NAME := ONAME[PTR] FI IF OBJ_ACTION = "D" THEN IF OTYPE[PTR] = "LB" THEN DLBD(NAM = VAL OBJ_NAME, COM = BASIC, LEV = STD, RES = SFLAG) ELSE DGRD(NAM = VAL OBJ_NAME, LEV = STD, RES = SFLAG) FI EXTRA_REPLY := FILL(2000) AMSG(PRO = SOM + " ", MES = EXTRA_REPLY, LEN = EXTRA_REPLY_LEN, RES = FLAG) ELSF OBJ_ACTION = "H" THEN EXTRA_REPLY := FILL(2000) PHASE := "SHOWING FILE HELP" AMSG(PRO = FILE_HELP, MES = EXTRA_REPLY, LEN = EXTRA_REPLY_LEN, RES = FLAG) ELSF OBJ_ACTION = "L" THEN IF OTYPE[PTR] = "LB" THEN DLBD(NAM = VAL OBJ_NAME, COM = LB&LBF, LEV = STD, RES = SFLAG) ELSE DGRD(NAM = VAL OBJ_NAME, COM = F&LB&GR, LEV = STD, RES = SFLAG) FI EXTRA_REPLY := FILL(2000) AMSG(PRO = SOM + " ", MES = EXTRA_REPLY, LEN = EXTRA_REPLY_LEN, RES = FLAG) ELSF ((OBJ_ACTION = "M") AND SHOW_UNDEL) THEN MFM(OBJ = VAL OBJ_NAME, TAR = VAL TARGET, FIL = VAL FILEMASK, SIZ = VAL SIZE, AGE = VAL AGE, ACT = VAL ACTION, AUT = VAL AUTOPAGE, RES = SFLAG) ELSF ((OBJ_ACTION = "Q") AND SHOW_UNDEL) THEN IF OTYPE[PTR] = "LB" THEN DLBD(NAM = VAL OBJ_NAME, COM = LB&LBF, LEV = STD, RES = SFLAG) ELSE DGRD(NAM = VAL OBJ_NAME, COM = F&LB&GR, LEV = STD, RES = SFLAG) FI EXTRA_REPLY := FILL(2000) AMSG(PRO = SOM + " ", MES = EXTRA_REPLY, LEN = EXTRA_REPLY_LEN, RES = FLAG) EXTRA_REPLY := FILL(2000) PHASE := "ASKING DELETE OBJECT MESSAGE" SMSG(CLS) AMSG(PRO = "Delete this object? ", MES = EXTRA_REPLY, LEN = EXTRA_REPLY_LEN, RES = SFLAG) IF (SUBSTR(EXTRA_REPLY) OR HEX(40)) = "Y" THEN DELETED[OPTR[PTR]] := TRUE FI ELSF ((OBJ_ACTION = "T") AND SHOW_UNDEL) THEN IF OTYPE[PTR] = "GR" THEN MTREE(NAM = VAL OBJ_NAME, FIL = VAL FILEMASK, TAR = VAL TARGET, ACT = VAL ACTION, AUT = VAL AUTOPAGE, RES = SFLAG) FI ELSF ((OBJ_ACTION = "U") AND (NOT SHOW_UNDEL)) THEN DELETED[OPTR[PTR]] := FALSE ELSF ((OBJ_ACTION = "X") AND SHOW_UNDEL) THEN DELETED[OPTR[PTR]] := TRUE FI IF SFLAG > 0 THEN RES_CODE := NUMERIC(SFLAG, 5) STAY_ON_PAGE := TRUE EXTRA_REPLY := FILL(2000) SMSG("ERROR " + RES_CODE + " ON " + OTYPE[PTR] + " " + ONAME[PTR]) SRSMSG(SFLAG) AMSG(PRO = SOM + " ", MES = EXTRA_REPLY, LEN = EXTRA_REPLY_LEN, RES = FLAG) FI PTR := PTR + 1 REPEAT IF STAY_ON_PAGE THEN OBJ_PTR := CURR_POSN ELSF PAGE_ACTION = "D" THEN IF SHOW_UNDEL THEN SHOW_UNDEL := FALSE OBJ_PTR := 1 ELSE PAGE_ACTION := " " FI ELSF PAGE_ACTION = "U" THEN IF SHOW_UNDEL THEN PAGE_ACTION := " " ELSE SHOW_UNDEL := TRUE OBJ_PTR := 1 FI ELSF PAGE_ACTION = "N" THEN FOR OBJ_PTR FROM OBJ_PTR UNTIL ((OBJ_PTR > LAST_OBJ) OR (DELETED[OBJ_PTR] NEQ SHOW_UNDEL)) DO REPEAT IF OBJ_PTR > LAST_OBJ THEN LINES := 0 FOR OBJ_PTR FROM LAST_OBJ BY -1 UNTIL ((OBJ_PTR < 1) OR (LINES > 19)) DO IF (DELETED[OBJ_PTR] NEQ SHOW_UNDEL) THEN LINES = LINES + 1 FI REPEAT IF OBJ_PTR < 1 THEN IF LINES = 0 THEN IF SHOW_UNDEL THEN ALL_DELETED := TRUE ELSE SHOW_UNDEL := TRUE OBJ_PTR := 1 FI ELSE OBJ_PTR := 1 FI ELSE OBJ_PTR := OBJ_PTR + 1 FI FI ELSF PAGE_ACTION = "P" THEN LINES := 0 FOR OBJ_PTR FROM (CURR_POSN - 1) BY -1 UNTIL ((OBJ_PTR < 1) OR (LINES > 19)) DO IF (DELETED[OBJ_PTR] NEQ SHOW_UNDEL) THEN LINES = LINES + 1 FI REPEAT IF OBJ_PTR < 1 THEN IF LINES = 0 THEN FOR OBJ_PTR FROM 1 UNTIL ((OBJ_PTR > LAST_OBJ) OR (DELETED[OBJ_PTR] NEQ SHOW_UNDEL)) DO REPEAT IF OBJ_PTR > LAST_OBJ THEN IF SHOW_UNDEL THEN ALL_DELETED := TRUE ELSE SHOW_UNDEL := TRUE OBJ_PTR := 1 FI FI ELSE OBJ_PTR := 1 FI ELSE OBJ_PTR := OBJ_PTR + 1 FI ELSF PAGE_ACTION = "F" THEN FOR OBJ_PTR FROM 1 UNTIL ((OBJ_PTR > LAST_OBJ) OR (DELETED[OBJ_PTR] NEQ SHOW_UNDEL)) DO REPEAT IF OBJ_PTR > LAST_OBJ THEN IF SHOW_UNDEL THEN ALL_DELETED := TRUE ELSE SHOW_UNDEL := TRUE OBJ_PTR := 1 FI FI ELSF PAGE_ACTION = "L" THEN LINES := 0 FOR OBJ_PTR FROM LAST_OBJ BY -1 UNTIL ((OBJ_PTR < 1) OR (LINES > 19)) DO IF (DELETED[OBJ_PTR] NEQ SHOW_UNDEL) THEN LINES = LINES + 1 FI REPEAT IF OBJ_PTR < 1 THEN IF LINES = 0 THEN IF SHOW_UNDEL THEN ALL_DELETED := TRUE ELSE SHOW_UNDEL := TRUE OBJ_PTR := 1 FI ELSE OBJ_PTR := 1 FI ELSE OBJ_PTR := OBJ_PTR + 1 FI ELSE FOR OBJ_PTR FROM CURR_POSN UNTIL ((OBJ_PTR > LAST_OBJ) OR (DELETED[OBJ_PTR] NEQ SHOW_UNDEL)) DO REPEAT IF OBJ_PTR > LAST_OBJ THEN FOR OBJ_PTR FROM LAST_OBJ BY -1 UNTIL ((OBJ_PTR < 1) OR (DELETED[OBJ_PTR] NEQ SHOW_UNDEL)) DO REPEAT IF OBJ_PTR < 1 THEN IF SHOW_UNDEL THEN ALL_DELETED := TRUE ELSE SHOW_UNDEL := TRUE OBJ_PTR := 1 FI FI FI FI FI REPEAT SMSG(CLS) OBJ_MARKED := FALSE FOR PTR FROM 1 TO BOUND DELETED UNTIL OBJ_MARKED DO IF DELETED[PTR] THEN OBJ_MARKED := TRUE FI REPEAT IF OBJ_MARKED THEN REPLY := FILL(2000) PHASE := "ASKING DELETE MESSAGE" AMSG(PRO = "Action deletes? ", MES = REPLY, LEN = REPLY_LEN, RES = SFLAG) IF (SUBSTR(REPLY) OR HEX(40)) = "Y" THEN FOR PTR FROM 1 TO LAST_OBJ DO IF DELETED[PTR] THEN PHASE := "READING WORK FOR DELETE" RDRN(CHA = WORK, REC = W_BUFF, RNU = PTR, RES = FLAG) IF W_BUFF STARTSWITH "GR" THEN IF NAME STARTSWITH ":" THEN IF NAME INCLUDES "." THEN OBJ_NAME := NAME BEFORE "." ELSE OBJ_NAME := NAME FI ELSE OBJ_NAME := ":" FI OBJ_NAME := OBJ_NAME + "." + (W_BUFF AFTER "GR") PHASE := "DELETING GROUP " + OBJ_NAME XGR(NAM = VAL OBJ_NAME, RES = SFLAG) ELSE IF NAME = "" THEN OBJ_NAME := ":." + (W_BUFF AFTER "LB") ELSE OBJ_NAME := NAME + "." + (W_BUFF AFTER "LB") FI PHASE := "DELETING LIBRARY " + OBJ_NAME XLB(NAM = VAL OBJ_NAME, RES = SFLAG) FI IF SFLAG NE 0 THEN SMSG("ERROR WHEN " + PHASE) SRSMSG(SFLAG) SFLAG := 0 FI FI REPEAT FI FI PHASE := "CLOSING *WORKING_LIST" CLOF(CHA = WORK, RES = FLAG) END