.TITLE WHOFND - FIND NAME AND UIC CODE .IDENT /V01/ .ENABL LC ;+ ; WRITTEN BY: GARY L. MAXWELL ; 29-MAR-80 ; NATIONAL STRONG MOTION DATA CENTER ; OFFICE OF EARTHQUAKE STUDIES ; U.S. GEOLOGICAL SURVEY ; 345 MIDDLEFIELD ROAD ; MAIL STOP 77 ; MENLO PARK, CALIFORNIA 94025 ; ; THIS MODULE TAKES EITHER THE UIC SPECIFICATION OR THE LAST ; NAME OF A USER FROM THE INPUT LINE, AND LOOKS FOR EVERY ; POSSIBLE MATCH IN THE ACCOUNT FILE. THAT IS, IF MORE THAN ; ONE USER HAS THE SAME LAST NAME OR LOGON UIC, THEN ALL SUCH ; USERS ARE LISTED ON THE TERMINAL. ; ; THE INFORMATION LISTED ON THE TERMINAL INCLUDES THE FULL NAME ; OF THE USER, THE LOGON UIC, AND THE DATE AND TIME OF THE ; MOST RECENT LOGON BY THE USER. ;- .MCALL PRINT,PMSG SPACE = <' > ACBLK: .BLKW 5 ; $EDMSG ARGUMENT BLOCK .BLKW 2 ;**NEW** GSAV: .BLKB 6 ; ASCII GROUP/MEMBER SAVE AREA .NLIST BEX NINP: .ASCIZ /%29%16/ ;**-1 TINP: .ASCIZ /%Y %2Z/ ; DATE-TIME INPUT STRING NLOGIN: .ASCIZ /Never logged in/ .LIST BEX .EVEN .PSECT WHOFND,RO NLOOK:: MOV SP,R2 ; R2 IS 'FOUND' FLAG CALL FREAD ; READ FIRST BLOCK 10$: MOV IOSB+2,RDLEN ; GET BYTES READ BEQ 50$ ; TRY AGAIN IF NOTHING THERE MOV #$ACTBF,R4 ; BEGINNING OF BUFFER 20$: MOV #$NAME,R0 ; POINT TO LAST NAME MOV R4,R1 ; COPY ACCOUNT ENTRY POINTER ADD #A.LNM,R1 ; POINT TO LAST NAME TSTB (R1) ; SKIP OVER NULL NAME ;**NEW** BEQ 40$ ;**NEW** TSTB (R0) ; "?" NAME MEANS ALL NAMES ;**NEW** BEQ 35$ ;**NEW** 30$: CMPB (R1)+,(R0)+ ; COMPARE A CHARACTER BNE 40$ ; BRANCH IF NO MATCH TSTB (R0) ; REACHED END OF NAME? BNE 30$ ; NO, TRY AGAIN 35$: ;**NEW** CLR R2 ; YES - INDICATE WE FOUND A NAME CALL ACTOUT ; PRINT THIS ENTRY 40$: ADD #A.LEN,R4 ; POINT TO NEXT ENTRY SUB #A.LEN,RDLEN ; SUBTRACT FROM BUFFER LENGTH BGT 20$ ; BRANCH IF MORE TO DO 50$: CALL AREAD ; ELSE READ NEXT BLOCK BCC 10$ ; BRANCH IF SUCCESSFUL TST R2 ; ELSE SEE IF ANYTHING FOUND BEQ 60$ ; YES, JUST EXIT CALL PNO ; ELSE PRINT 'NOT FOUND' MESSAGE 60$: RETURN ; AND RETURN ULOOK:: MOV #GSAV,R0 ; POINT TO SAVE AREA CLR R1 ; CLEAR ACCUMULATOR BISB $UGRP,R1 ; GET INPUT GROUP CODE MOV R0,R2 ; NO ZERO SUPPRESSION CALL $CBTMG ; CONVERT TO ASCII CLR R1 ; CLEAR ACCUMULATOR BISB $UMEM,R1 ; MERGE IN MEMBER CODE MOV R0,R2 ; NO ZERO SUPPRESSION CALL $CBTMG ; CONVERT TO ASCII MOV R0,R2 ; RESET 'NOT FOUND' FLAG CALL FREAD ; READ FIRST BLOCK 10$: MOV IOSB+2,RDLEN ; NUMBER OF BYTES READ BEQ 60$ ; BRANCH IF NOTHING READ MOV #$ACTBF,R4 ; POINT TO BUFFER 20$: MOV R4,R1 ; COPY ENTRY POINTER ADD #A.GRP,R1 ; POINT TO GROUP CODE MOV #GSAV,R0 ; POINT TO INPUT GROUP MOV #3,R3 ; LOOK AT THREE CHARACTERS 30$: CMPB (R0)+,(R1)+ ; MATCH? BNE 50$ ; NO, BRANCH IF NOT SOB R3,30$ ; YES, CHECK UNTIL DONE MOV R4,R1 ; RECOPY ENTRY POINTER ADD #A.MBR,R1 ; POINT TO MEMBER SPEC MOV #3,R3 ; LOOK AT THREE CHARACTERS 40$: CMPB (R0)+,(R1)+ ; MATCH? BNE 50$ ; NO, BRANCH IF NOT SOB R3,40$ ; YES, CHECK THE REST CLR R2 ; FOUND! SET FOUND FLAG CALL ACTOUT ; AND OUTPUT ENTRY 50$: ADD #A.LEN,R4 ; POINT TO NEXT ENTRY SUB #A.LEN,RDLEN ; SUBTRACT FROM BUFFER LENGTH BGT 20$ ; BRANCH IF MORE TO DO 60$: CALL AREAD ; ELSE READ NEXT BLOCK BCC 10$ ; BRANCH IF SUCCESSFUL TST R2 ; ELSE DONE - FOUND ANYTHING? BEQ 63$ ; YES, JUST RETURN CALL PNO ; ELSE PRINT 'NOT FOUND' 63$: RETURN ; AND RETURN ACTOUT: CALL $SAVAL ; SAVE ALL REGISTERS MOV #OUTBK,R0 ; POINT TO OUTPUT BLOCK MOV #NINP,R1 ; GET INPUT FOR INITIAL PAD CALL $EDMSG ; MAKE PADDING FOR NAME MOV R4,R3 ; COPY ENTRY ADDRESS ADD #A.FNM,R3 ; POINT TO FIRST NAME CLR R1 ; CLEAR COUNTER 10$: CMPB #SPACE,(R3) ; REACHED END OF NAME? BEQ 20$ ; BRANCH IF SO MOVB (R3)+,(R0)+ ; ELSE MOVE INTO OUTPUT INC R1 ; BUMP COUNTER CMP #12.,R1 ; DONE MAX. LENGTH? BGT 10$ ; BRANCH BACK IF NOT 20$: TST R1 ; DID WE TRANSFER ANYTHING? BEQ 25$ ; BRANCH IF WE DIDN'T MOVB #SPACE,(R0)+ ; ELSE PAD IN A SPACE 25$: MOV R4,R3 ; RECOPY ENTRY ADDRESS ADD #A.LNM,R3 ; POINT TO LAST NAME CLR R1 ; CLEAR COUNTER 30$: CMPB #SPACE,(R3) ; REACHED END OF NAME? BEQ 40$ ; YES, BRANCH IF SO MOVB (R3)+,(R0)+ ; ELSE MOVE BYTE INTO BLOCK INC R1 ; BUMP COUNTER CMP #14.,R1 ; DONE MAX. LENGTH YET? BGT 30$ ; NO, BRANCH BACK IF NOT 40$: MOV #NEINP,R1 ; POINT TO INPUT BLOCK CALL $EDMSG ; PAD OUT TO UIC AREA ;*RVT01 ; also print out the login device ;*RVT01 mov r4,r1 ;*RVT01 add #a.sydv,r1 ;*RVT01 movb (r1)+,(r0)+ ;*RVT01 movb (r1)+,(r0)+ ;*RVT01 movb (r1)+,(r0) ;*RVT01 CMPB #'0,(R0) ; SKIP LEADING 0 IN UNIT ;*RVT01 BEQ 45$ ;*RVT01 INC R0 ;*RVT01 45$: movb (r1)+,(r0)+ ;*RVT01 MOVB #':,(R0)+ ;*RVT01 MOVB #'[,(R0)+ ;*RVT01 MOV R4,R1 ; COPY ENTRY POINTER ADD #A.GRP,R1 ; POINT TO GROUP CODE MOV #3,R2 ; THREE BYTES TO LOOK AT 50$: CMPB #<'0>,(R1)+ ; LEADING ZERO? BNE 60$ ; NO, BRANCH AHEAD SOB R2,50$ ; ELSE KEEP LOOKING INC R2 ; ALLOW '0' SPEC (!) 60$: DEC R1 ; POINT BACK A CHAR 120$: MOVB (R1)+,(R0)+ ; COPY INTO OUTPUT BLOCK SOB R2,120$ ; DO UNTIL DONE MOVB #<',>,(R0)+ ; PUT IN COMMA MOV R4,R1 ; COPY ENTRY POINTER ADD #A.MBR,R1 ; POINT TO MEMBER SPEC MOV #3,R2 ; LOOK AT THREE CHARS 130$: CMPB #<'0>,(R1)+ ; LEADING ZERO? BNE 140$ ; NO, BRANCH IF NOT SOB R2,130$ ; KEEP LOOKING INC R2 ; ALLOW '0' SPEC (!) 140$: DEC R1 ; POINT BACK A CHAR 150$: MOVB (R1)+,(R0)+ ; COPY INTO OUTPUT BLOCK SOB R2,150$ ; DO UNTIL DONE MOV #FILINP,R1 ; GET INPUT TO TAB OUT CALL $EDMSG ; TAB OUT TO TIME AREA MOV R4,R1 ; COPY ENTRY ADDRESS ADD #A.LDAT,R1 ; POINT TO LOGIN DATE MOV #3,R3 ; THREE BYTES FOR DATE ; WE HAVE TO REVERSE DATE, SO PUSH ON STACK, AND THEN POP OFF 160$: MOVB (R1)+,R5 ; GET A BYTE BEQ 168$ ; ZERO MEANS USER NEVER LOGGED IN MOV R5,-(SP) ; PUSH ONTO STACK SOB R3,160$ ; DO UNTIL DONE MOV #ACBLK,R2 ; POINT TO ARGUMENT BLOCK MOV (SP)+,(R2)+ ; POP OFF THE THREE VALUES MOV (SP)+,(R2)+ MOV (SP)+,(R2)+ MOV #3,R3 ; WILL GET LOGON TIME NOW 165$: MOVB (R1)+,R5 ; GET A BYTE MOV R5,(R2)+ ; PUT INTO ARGUMENT BLOCK SOB R3,165$ ; DO UNTIL DONE MOV #ACBLK,R2 ; POINT TO ARGUMENT BLOCK MOV #TINP,R1 ; POINT TO INPUT STRING CALL $EDMSG ; CALL THE EDITOR BR 1680$ ; GO PRINT BUFFER 168$: MOV #NLOGIN,R2 ; POINT TO 'NO LOGIN' MSG 1681$: MOVB (R2)+,(R0)+ ; COPY A BYTE BNE 1681$ ; DO UNTIL DONE DEC R0 ; POINT BACK TO END 1680$: MOV R0,R1 ; COPY END ADDRESS MOV #OUTBK,R0 ; POINT TO OUTPUT BLOCK SUB R0,R1 ; GET LENGTH OF STRING PMSG ,,#SPACE,0 ; PRINT THE LINE RETURN ; RETURN AND RESTORE REGISTERS PNO: PRINT < No such account found>,WHOFND,0 RETURN .END