.TITLE NUD -- NAME UPDATE AND DISPLAY PROG .SBTTL TITLE PAGE .IDENT /VIN0.0/ ;+ ; ; AUTHOR: 1LT JOEL B IRWIN ; ; ; DATE: ; ; ; SYSTEM: OISS SUBSYSTEM: INFORMATIONAL ; ; ; FUNCTIONAL DESCRIPTION: ; ; THE NUD PROGRAM IS THE USER INTERFACE WITH THE NAME GLOBAL ; COMMON AREA. IT ALLOWS CERTAIN PRIVILEGED USERS TO UPDATE ; THE AREA AND ALLOWS ALL USERS TO DISPLAY A PART OR ALL ; OF THE AREA. ; ; ; ; RECORD OF MODIFICATIONS ; ; VERSION DATE BY DESCRIPTION ; _______ ____ __ ___________ ; ; ; ; ; ; GLOBAL EVENT FLAG USAGE: ; ; ;- .SBTTL MACROS,SYMBOLS,AND DATA .PAGE ; ; ; LOCAL MACRO DEFINITIONS AND SYSTEM MACRO CALLS ; ; ; THE GENMSG MACRO IS USED DO DEFINE THE ERROR DISPATCH TABLE ; AND THE ERROR MESSAGE TABLE. THE FIRST IS AN ARRAY WHICH ; CONTAINS POINTERS TO THE BEGINNING OF EACH OF THE ERROR ; MESSAGES. THE SECOND CONTAINS THE ACTUAL MESSAGES. EACH MESSAGE ; BEGINS WITH A BYTE CONTAINING THE NUMBER OF CHARACTERS IN THE ; MESSAGE .MACRO GENMSG MSG .PSECT ERRMES $$$=. .PSECT ERRDSP .WORD $$$ .PSECT ERRMES .NCHR $$$, .BYTE $$$ .ASCII /MSG/ .PSECT .ENDM .MCALL DIR$,GMCR$,QIOW$S,QIOW$C,EXIT$S,GTSK$S ;EXEC MACROS .MCALL STRUCT,IF,END,GETARG,SAVE,UNSAVE ;STRUCTURED MACROS .MCALL INVOKE,TEXT,INDEX,QUIT,PROC,IFB,ANDB,ELSE,MOVC .MCALL REPEAT,UNTIL,FOR,OR STRUCT ; ; ; GLOBAL SYMBOL DEFINITIONS AND DATA ; ; .NLIST BIN .SBTTL NUD - MAIN ROUTINE ; .PSECT NUD,RW ;FOR DEBUGGING PURPOSES ONLY .PSECT NUD,RO NUD: DIR$ #INPUT ;GET USER INPUT 1$: MOV #1,R1 ;DONT IGNORE BLANKS MOV #KEYTBL,R2 ;KEY TABLE ADDRESS MOV $DSW,R3 ;LENGTH OF INPUT MOV #INPUT+G.MCRB,R4 ;ADDRESS OF STRING MOV #NUDTBL,R5 ;BEGINNING OF STATE TABLE CALL .TPARS ;PARSE THE INPUT STRING IF CS ;SYNTAX ERROR OR NO INPUT IF NOINP NE ;IF INPUT MISSING PROMPT FOR IT CALL PROMPT BR 1$ END INVOKE ERROR,1 ;ERROR MESSAGE END EXIT$S .PSECT DATA,RW ;LOCAL DATA INPUT: GMCR$ ;USER INPUT STRING ; PROGRAM FLAGS MATFLG: .WORD ;0=MATCH ONCE,1=KEEP MATCHING DISFLG: .WORD ;0=DISPLAY ALLOWED INFLG: .WORD ;0=INPUT ALLOWED DELFLG: .WORD ;0=DELETE ALLOWED NOINP: .WORD ;0=USER TYPED INPUT,1=INPUT MISSING ; ARGUMENTS USED TO MODIFY OR DISPLAY NAME GCA GRPID: .WORD ;GROUP ID VALUE USRID: .WORD ;USER ID VALUE USN: .BLKW 4. ;RAD50 USER NAME .SBTTL VALID INPUT SYNTAX .PAGE ; ; NOTE: TO INSERT OR DELETE FROM NAME THE USER MUST BE [1,1] ; ; INSERTION: [N,M]=NAME (NAME IS FROM 1 TO 12 RAD50 CHARACTERS) ; ; DELETION: (1) -[N,M]=NAME (DELETES THE MATCHING ELEMENT) ; (2) -[N,M] (DELETES FIRST MATCH OF [N,M]) ; (3) -NAME (DELETES FIRST MATCH TO NAME) ; (4) -*[N,M] (DELETES ALL MATCHES TO [N,M]) ; (5) -*NAME (DELETES ALL MATCHES TO NAME) ; (6) -[*,M] (DELETES ALL MATCHES TO [*,M]) ; (7) -[N,*] (DELETES ALL MATCHES TO [N,*]) ; (8) -ALL OR [*,*] (DELETES EVRYTHING) ; ; DISPLAY: SAME AS ITEMS IN DELETION EXCEPT THE SYNTAX ; IS WITHOUT THE LEADING - AND THE ITEMS ARE ; DISPLAYED INSTEAD OF DELETED .PAGE .TITLE STATE TABLES AND ACTION ROUTINES .SBTTL STATE TABLES $RONLY=0 ;STATE AND KEYTABLES ARE READ ONLY .MCALL ISTAT$,STATE$,TRAN$ ;TPARS MACROS ISTAT$ NUDTBL,KEYTBL ;DEFINE THE TABLES STATE$ INSTATE TRAN$ $STRNG ;SKIP TO NEXT SPACE STATE$ TRAN$ $EOS,FAIL,PROMPI ;IF NOTHING IS LEFT SET UP FOR INPUT ;AND FAIL SO USER CAN BE PROMPTED TRAN$ $BLANK ;OTHERWISE SKIP PAST BLANKS AND CONTINUE STATE$ OPTST TRAN$ '-,FIELD,SETDEL ;SET NOT DISPLAY AND NOT INPUT TRAN$ $LAMDA STATE$ FIELD TRAN$ !UIC,OPDET ;SCAN FOR UIC TRAN$ "ALL",NOIN,MOVALL ;OR IS IT ALL (AND NOT INPUT) TRAN$ $EOS,FAIL ;THERE BETTER BE SOMETHING LEFT TRAN$ '*,FIELD,SETMAT ;* MEANS MULTIPLE MATCHING ALLOWED TRAN$ $RAD50,NOIN,MOVNAM ;OR PERHAPS ITS A USER NAME (AND NOT ;INPUT) ;IF NONE OF THESE ITS A BOO-BOO STATE$ OPDET TRAN$ '=,NAM TRAN$ $LAMDA,DO ;ITS DELETE OR INSERT OF A UIC STATE$ NAM TRAN$ $EOS,FAIL ;THERE BETTER BE SOMETHING LEFT TRAN$ $RAD50,NOD,MOVNAM ;BETTER FIND A NAME AFTER = ;(AND OP IS INSERT OR DELETE) STATE$ NOD TRAN$ $LAMDA,DO,SETND ;MAKE OP NOT DISPLAY STATE$ NOIN TRAN$ $LAMDA,DO,SETNI ;THIS MAKES OP NOT INPUT STATE$ DO TRAN$ $EOS,DO2 ;IF NOTHING IS LEFT CONTINUE TRAN$ $LAMDA,FAIL ;OTHERWISE SOMETHING IS WRONG STATE$ DO2 TRAN$ $LAMDA,$EXIT,PFRM ;NOW LETS DO WHAT THE USER WANTS ;AND EXIT ; THIS SECTION RECOGNIZES UIC'S SYNTACTICALLY STATE$ UIC TRAN$ '[ STATE$ TRAN$ $NUMBR,UIC2,MOVGP ;FOUND THE GROUP NUMBER TRAN$ '*,,MOVGP STATE$ UIC2 TRAN$ <',> STATE$ TRAN$ $NUMBR,UIC3,MOVUS ;FOUND USER NUMBER TRAN$ '*,,MOVUS STATE$ UIC3 TRAN$ '],$EXIT ;RECOGNIZED UIC ; STATE$ FAIL ;FORCE A FAILURE FOR PREMATURE $EOS TRAN$ $ANY,$EXIT ;THIS WONT MATCH $EOS STATE$ ;END OF STATE TABLE .SBTTL .SBTTL ACTION ROUTINES .SBTTL .PSECT NUD .PAGE PROC PROMPI, MOV #1,NOINP ;SET NO INPUT FLAG SO ERROR RETURN ;CAN BE INTERPRETED PROPERLY RETURN .PAGE PROC SETDEL,<- PROCESSOR> MOV #1,DISFLG MOV #1,INFLG ;NO DISPLAY AND NO INPUT (IE. DELETE) END .PAGE PROC MOVNAM, SAVE R0,R1,R2 MOV .PSTCN,R0 ;# OF CHARS MATCHED IN NAME IF R0 EQ ;IF WE DIDNT MATCH (RAD50 IN V6B ;CAN MATCH THE NULL STRING) MOV #1,DISFLG ;PREVENT ANYTHING FROM HAPPENING MOV #1,INFLG MOV #1,DELFLG UNSAVE R0,R1,R2 RETURN END MOV .PSTPT,R1 ;ADDRESS OF NAME IF R0 GT #12. ;IF TOO MANY CHARS IN NAME INVOKE ERROR,3 ;PRINT ERROR MESSAGE, AND MOV #12.,.PSTCN ;TRUNCATE THE COUNT END MOVC .PSTPT,#CNAM,R0 ;NOW TRANSFER THE NAME TO A LOCAL BUFFER MOV #CNAM,R0 ;NOW LETS CONVERT THE 12 ASCII CHARS MOV #1,R1 ;INTO 4 WORDS RAD50 .IRP DISP,<0,2,4,6> CALL $CAT5 MOV R1,USN+DISP .ENDM UNSAVE R0,R1,R2 ;NOW ALL IS DONE! END .PSECT DATA CNAM: .REPT 12. .ASCII / / .ENDM ;12 ASCII BLANKS INITIALLY .PSECT NUD .PAGE PROC MOVALL, MOV #1,INFLG ;ITS DEFINATELY NOT INPUT CLR GRPID ;MAKE EVERYTHING WILDCARDS CLR USRID MOV #1,MATFLG ;KEEP ON MATCHING END .PAGE PROC SETMAT, MOV #1,MATFLG ;KEEP ON MATCHING END .PAGE PROC SETND, MOV #1,DISFLG ;OPERATION IS NOT DISPLAY END .PAGE PROC SETNI, MOV #1,INFLG ;OPERATION IS NOT INPUT END .PAGE .SBTTL PROC PFRM, .SBTTL MOV #NAME,BEGGCA ;BEGINNING OF THE NAME GCA MOV #SIZE,SIZGCA ;SIZE OF THE NAME GCA .SBTTL DISPLAY SECTION IF DISFLG EQ ;SHALL WE DISPLAY? INVOKE FETCH, ;AT LEAST ONE MATCH PLEASE! IF BEGGCA EQ ;NOT EVEN ONE MATCH FOUND INVOKE ERROR,4 ;PRINT THE ERROR AND EXIT RETURN ELSE INVOKE PRFIND,BEGGCA ;DISPLAY WHAT WAS FOUND IF MATFLG NE ;TRY FOR MORE MATCHES ADD #ENTRYSZ,BEGGCA ;FROM WHERE DO WE KEEP GOING? REPEAT ;YES, KEEP MATCHING UNTIL THE END OF INVOKE FETCH, ;THE TABLE INVOKE PRFIND,BEGGCA IF BEGGCA NE ;IF SOMETHING WAS FOUND CONTINUE LOOKING ADD #ENTRYSZ,BEGGCA ;NOW LOOK AT NEXT ENTRY END UNTIL BEGGCA EQ END END RETURN ;END OF DISPLAY SECTION END .PSECT DATA BEGGCA: .WORD ;ARG1 TO CALL FOR FETCH SIZGCA: .WORD ;ARG2 TO CALL FOR FETCH .PSECT NUD .PAGE .SBTTL INPUT SECTION IF INFLG EQ ;SHALL WE INPUT? CALL CHKPRV ;CAN THE USER INPUT? IF CS ;NO - HE IS NOT PRIVILEDGED INVOKE ERROR,7 RETURN END IF GRPID EQ ;MAKE SURE NONE OF INPUTS ARE OR USRID EQ ;WILDCARDS OR USN EQ INVOKE ERROR,5 RETURN END INVOKE ENTER, ;TRY ENTERRING IT INTO THE GCA IF CS ;FAILURE.... TABLE FULL INVOKE ERROR,6 RETURN END RETURN END ;END OF INPUT SECTION .PAGE .SBTTL DELETE SECTION .SBTTL IF DELFLG EQ ;SHALL WE DELETE CALL CHKPRV ;CAN THE USER DELETE? IF CS ;NO - HE IS NOT PRIVILEDGED INVOKE ERROR,2 RETURN END INVOKE FETCH, ;FIND WHAT ;IS TO BE DELETED IF BEGGCA EQ ;DIDNT FIND IT INVOKE ERROR,4 RETURN ELSE INVOKE DELETE,BEGGCA ;BLANK IT OUT IF MATFLG NE ;TRY TO DELETE MORE? ADD #ENTRYSZ,BEGGCA ;FROM WHERE DO WE KEEP GOING? REPEAT INVOKE FETCH, ;NEXT MATCH INVOKE DELETE,BEGGCA ;DELETE IT IF BEGGCA NE ;IF SOMETHING WAS FOUND CONTINUE LOOKING ADD #ENTRYSZ,BEGGCA END UNTIL BEGGCA EQ END ;END OF CONTINUING MATCH END ;END OF AT LEAST ONE MATCH (THE 'ELSE') RETURN END ;END OF THE DELETE SECTION END ;END OF PFRM ROUTINE .PAGE PROC MOVGP, SAVE R0 MOV .PSTPT,R0 ;ADDRESS OF MATCH IFB (R0) EQ #'* ;IS IT A WILDCARD CLR GRPID ;MAKE ID = 0 MOV #1,MATFLG ;WILDCARD MATCHING ALLOWED ELSE MOV .PNUMB,GRPID ;GET AHOLD OF CONVERTED GROUP # END UNSAVE R0 END .PAGE PROC MOVUS, SAVE R0 MOV .PSTPT,R0 ;ADDRESS OF MATCH IFB (R0) EQ #'* ;IS IT WILDCARD CLR USRID ;MAKE ID = 0 MOV #1,MATFLG ;WILDCARD MATCHING ALLOWED ELSE MOV .PNUMB,USRID ;GET AHOLD OF CONVERTED USER # END UNSAVE R0 END .SBTTL .SBTTL OTHER SUBROUTINES .SBTTL .PAGE PROC PROMPT, QIOW$S #IO.WVB,#5,#1,,,,<#PRMT,#PRMTL,#0> ;PROMPT THE USER MOVC #PRONAM,#INPUT+G.MCRB,#4 ;MOVE IN PROCESSOR NAME QIOW$S #IO.RVB,#5,#1,,#IOST,,<#INPUT+G.MCRB+4.,#76.,#0> ;GET THE INPUT IFB #IE.EOF EQ IOST ;^Z TYPED IF SO EXIT EXIT$S END MOV IOST+2,$DSW ;SET UP THE NUNMBER OF CHARACTERS ADD #4,$DSW ;IN THE BUFFER END .PSECT DATA PRMT: .ASCII <15> <12> /NUD>/ PRMTL=.-PRMT PRONAM: .ASCII /NUD / ;PROCESSOR NAME IOST: .BLKW 2 ;IO STATUS WORD FOR READ .PSECT NUD .PAGE PROC CHKPRV, GTSK$S #TSKPRM ;FIND OUT A LITTLE ABOUT THIS TASK IFB TSKPRM+G.TSGC EQ #1 ;ALLOW PRIVILEDGES ONLY TO ANDB TSKPRM+G.TSPC EQ #1 ;PROGRAM RUNNING UNDER [1,1] CLC ;SUCCESS ELSE SEC ;FAILURE END RETURN .PSECT DATA TSKPRM: .BLKW 16. ;TASK PARAMETER BUFFER .PSECT NUD .PAGE TEXT PRFIND, ; ; INPUT: ; ; ARG1- POINTER TO ENTRY TO BE DISPLAYED OR 0 FOR AN AUTOMATIC ; RETURN (EFFICIENCY WITHIN THE REPEAT LOOP USED IN PFRM) ; MOV ' ,CNVT+2 ;BLANK OUT THE BUFFER MOVC #CNVT+2,#CNVT+3,#21. SAVE GETARG @1,R3 ;POINTER TO THE ENTRY TO BE PRINTED IF R3 EQ ;AUTOMATIC RETURN? BR ENDPR END MOV #CNVT+2,R0 ;R0 IS POINTER TO WHERE IT ALL GOES MOVB #'[,(R0)+ ;THE '[' MOVB GPID(R3),R1 ;CONVERT GROUP # TO BINARY AND OUT IT GOES! BIC #177400,R1 ;MAKE SURE NOT NEGATIVE CLR R2 ;ZERO SUPRESS CALL $CBOMG MOVB #',,(R0)+ ;THE ',' MOVB USID(R3),R1 ;CONVERT THE USER # TO BINARY AND OUT IT GOES! BIC #177400,R1 ;MAKE SURE NOT NEGATIVE CALL $CBOMG MOVB #'],(R0)+ ;THE ']' REPEAT ;BLANK OUT UNTIL CNVT++10. MOVB #' ,(R0)+ UNTIL R0 EQ #CNVT+12. ADD #USNAME,R3 ;ADJUST POINTER TO BEG OF RAD50 NAME FOR R4,#1,#ELSZ/2 ;NOW OUT GOES THE RAD50 NAME AFTER CONVERTED ;TO ASCII (3 CHARS AT A TIME) MOV (R3)+,R1 CALL $C5TA END QIOW$S #IO.WVB,#5,#1,,,,<#CNVT,#CNVTL,#0> ;NOW ALL GETS PRINTED ENDPR: UNSAVE END .PSECT DATA CNVT: ;THE OUTPUT BUFFER FOR DISPLAYING .ASCII <15> <12> ;CRLF .REPT 22. .ASCII / / .ENDM CNVTL=.-CNVT .PSECT NUD .PAGE ; .PSECT ERROR,RW ;FOR DEBUGGING PURPOSES ONLY .PSECT ERROR,RO TEXT ERROR, ; INPUTS: ; ; ARG1 - INDEX INTO ERROR DISPATCH TABLE CONTAINING ; THE ERROR MESSAGE ADDRESS ; ; OUTPUTS: ; ; EFFECT: ; AN ERROR MESSAGE IS PRINTED ; SAVE R0,R1 GETARG 1,R0 ;INDEX OF ERROR MESSAGE INDEX R0 ;CREATE A BYTE INDEX MOV ERRDSP(R0),R0 ;ADDRESS OF BEGINNING OF THE ERROR MESSAGE MOVB (R0)+,R1 ;# OF CHARS IN THE MESSAGE QIOW$C IO.WVB,5,1,,,,,ERROR ;PRINT THE PREAMBLE QIOW$S #IO.WVB,#5,#1,,,, ;OUTPUT THE MESSAGE UNSAVE R0,R1 QUIT PREAM: .ASCII <15> <12> /NUD -- / .SBTTL ERROR MESSAGE AND DISPATCH TABLES .PAGE ; LETS DEFINE THE TWO PSECTS ; AND THE STARTING ADDRESSES .PSECT ERRDSP,RO ;ERROR DISPATCH TABLE ERRDSP: .PSECT ERRMES,RO ;ACTUAL ERROR MESSAGES ERRMSG: ; NOW LETS DEFINE THE VARIOUS MESSAGES GENMSG ;(#1)INPUT SYNTAX ERROR GENMSG ;(#2)PRIVILEGED DELETION OPERATION GENMSG ;(#3)USER NAME IS TOO LONG GENMSG ;(#4) NOT EVEN ONE MATCH GENMSG ;(#5) NO WILDCARDS FOR INPUT GENMSG ;(#6) FULL NAME TABLE GENMSG ;(#7)PRIVILEDGED INPUT OPERATION .TITLE NUD ;TITLE NAME FOR THE RECORD .END NUD