.TITLE WHOCSI - WHO COMMAND PARSER .IDENT /V01/ .ENABL LC ;+ ; WRITTEN BY: GARY L. MAXWELL ; 29-MAR-80 ; OFFICE OF EARTHQUAKE STUDIES ; U.S. GEOLOGICAL SURVEY ; 345 MIDDLEFIELD ROAD ; MAIL STOP 77 ; MENLO PARK, CALIFORNIA 94025 ; ; ** WHOCSI ** ; ; THIS MODULE PARSES THE COMMAND LINE FOR WHO AND SETS APPROPRIATE ; BITS IN THE $FLAG WORD FOR PROCESSING BY WHO. ; ; NO RETURN IS MADE FROM THIS MODULE IF A SYNTAX ERROR IS DETECTED. ;- .MCALL PMSG,ERROR .MCALL ISTAT$,STATE$,TRAN$ ;+ ; LOCAL SYMBOLS ;- CR = 15 ; CARRIAGE RETURN LF = 12 ; LINE FEED SPACE = <' > ; SPACE CHAR .NLIST BEX HLPBUF: .BYTE .ASCII ^WHO Commands --^ .ASCII ^ >WHO^ .ASCII ^lists the terminal IDs, user names and UICs of all logged on users,^ .BYTE , .ASCII ^and the names of the active tasks owned by each user.^ .BYTE , .ASCII ^Status codes which precede tasknames are:^ .BYTE , .ASCII ^ Task executing ? Terminal input pending^ .ASCII ^ % Task stopped * I/O pending^ .ASCII ^ / Task checkpointed $ Task suspended^ .ASCII ^ # Waitfor in progress^ .BYTE ,, .ASCII ^ >WHO last-name -or- >WHO ggg,mmm -or- ^ .ASCII ^>WHO [ggg,mmm]^ .ASCII ^causes a search in the system account file for the user's UIC if^ .BYTE , .ASCII ^'last-name' is specified; otherwise, all user names matching the^ .BYTE , .ASCII ^UIC [ggg,mmm] are matched. The most recent logon date and time^ .ASCII ^are also displayed.^ .BYTE ,, .ASCII ^ >WHO /HE^ .ASCII ^prints this message.^ HLPLEN = . - HLPBUF .EVEN .LIST BEX .PAGE ;+ ; WHOCSI - PARSING ROUTINE ; ; INPUTS: R4 POINTS TO THE BEGINNING OF THE COMMAND LINE ; R3 CONTAINS THE BYTE COUNT OF THE COMMAND LINE ; ; OUTPUTS: $FLAG INDICATES THE TYPE OF WHO COMMAND GIVEN. ; IF $FLAG IS CLEAR, THEN "WHO /HE" WAS ENTERED, AND ; A HELP MESSAGE WAS PRINTED. ; ; IF 'WHO LAST-NAME' WAS ENTERED, THEN THE $NAME BUFFER ; CONTAINS "LAST-NAME". ; ; IF 'WHO UIC' WAS ENTERED, THEN $UIC CONTAINS THE BINARY ; GROUP AND MEMBER SPECIFICATIONS GIVEN. ;- WHOCSI:: CLR $FLAG ; CLEAR FLAG WORD CLR R1 ; IGNORE BLANKS IN TPARS MOV #WHOST,R5 ; POINT TO FIRST STATE MOV #WHOKTB,R2 ; POINT TO KEY TABLE CALL .TPARS ; CALL THE PARSER BCS SYNERR ; EXIT IF SYNTAX ERROR RETURN ; ELSE RETURN WITH RESULTS SYNERR: ERROR < WHO -- Syntax error> .PAGE ;+ ; TPARS STATE TABLES ;- ISTAT$ WHOSTB,WHOKTB STATE$ WHOST TRAN$ $STRNG ;**NEW** ;**-1 STATE$ TRAN$ <'[>,WBRK TRAN$ <'/>,WSWIT TRAN$ <'?>,WHEX,,WH.NAM,$FLAG ;**NEW** TRAN$ $EOS,$EXIT,,WH.DEF,$FLAG TRAN$ !UIC,WHEX,,WH.UIC,$FLAG TRAN$ $STRNG,WHEX,NAMCMD,WH.NAM,$FLAG STATE$ WBRK TRAN$ !UIC,,,WH.UIC,$FLAG STATE$ TRAN$ <']>,WHEX STATE$ UIC TRAN$ $NUMBR,,GTGRP STATE$ TRAN$ <',> STATE$ TRAN$ $NUMBR,$EXIT,GTMEM STATE$ WSWIT TRAN$ "HE",WHEX,HLPCMD TRAN$ "HEL",WHEX,HLPCMD TRAN$ "HELP",WHEX,HLPCMD STATE$ WHEX TRAN$ $EOS,$EXIT STATE$ ;+ ; END OF STATE TABLES ;- .PAGE ;+ ; PARSING ACTION ROUTINES ;- NAMCMD: MOV .PSTPT,R0 ; GET ADDRESS OF NAME MOV .PSTCN,R1 ; GET BYTE LENGTH OF NAME ADD R3,R1 ; REST OF LINE IS NAME ;*RVT01 CLR R3 ;*RVT01 MOV #$NAME,R2 ; POINT TO NAME BUFFER CMP #$NAMSZ,R1 ; IS INPUT LONGER THAN BUFFER? BGE 10$ ; NO, PROCEED MOV #$NAMSZ,R1 ; ELSE TRUNCATE TO BUFFER SIZE 10$: MOVB (R0)+,(R2)+ ; TRANSFER A BYTE SOB R1,10$ ; DO UNTIL THROUGH CLRB (R2) ; CLEAR TRAILING BYTE RETURN ; RETURN TO PARSER GTGRP: MOV #$UGRP,R0 ; POINT TO SAVE BYTE BR GTNUM ; AND GO GET GROUP SPEC GTMEM: MOV #$UMEM,R0 ; POINT BYTE FOR MEMBER GTNUM: TST .PNUMH ; HIGH ORDER SHOULD BE CLEAR BNE 10$ ; IT ISN'T - REJECT TSTB .PNUMB+1 ; SHOULD HAVE LOW ORDER BYTE ONLY BNE 10$ ; WE DON'T - REJECT MOVB .PNUMB,(R0) ; ELSE MOVE THE BINARY VALUE BNE 20$ ; OK IF VALUE WAS NON-ZERO 10$: ADD #2,(SP) ; ELSE REJECT THE TRANSITION 20$: RETURN ; AND RETURN HLPCMD: PMSG #HLPBUF,#HLPLEN,#SPACE ; PRINT HELP MESSAGE RETURN ; AND RETURN .END