2! PROGRAM : MAIUAF.BAS 5! VERSION : V1.0 6! EDIT : 02 7! EDIT DATE : 12-Sep-88 10 EXTEND 20 ! & & & ! M O D I F I C A T I O N H I S T O R Y & & & ! VER-ED EDIT DATE Who REASON & ! 1.0-01 05-Aug-88 TMK Initial coding for test & ! 1.0-02 12-Sep-88 TMK Fix endless loop bug & & 30 ! & & & ! P R O G R A M D E S C R I P T I O N & & & ! This program reads the account structure from the RSTS/E V9 & ! system disk and creates a DECMail-11-compatible names file by & ! combining existing entries from the file MAIL$:SNAMES.DAT & ! and entries determined from the disk structure examination. & & ! The format of a created entry is: & ! [proj,prog],"namestring",UJJJGGG,Generated username,, & ! where "namestring" is either "" or the value stored & ! from a SET ACCOUNT/NAME. & & ! Expired accounts are not entered into the created file. & & 1000 INDEX%=0% & \ WORKFN%=1% & \ NAMEFN%=2% & \ NOW%=PEEK(512%) & \ MAP$="" & \ MAP$=MAP$+CHR$(A%) FOR A%=0% TO 43% & \ MAP$=MAP$+";" & \ MAP$=MAP$+CHR$(A%) FOR A%=45% TO 255% & \ ON ERROR GOTO 32400 & \ OPEN "MAIL$:NAMES.DAT" FOR OUTPUT AS FILE WORKFN% & \ OPEN "MAIL$:SNAMES.DAT" FOR INPUT AS FILE NAMEFN% & ! SET UP INITIAL CONDITIONS & ! DEFINE ERROR TRAP & ! OPEN THE OUTPUT FILE & ! OPEN THE 'REAL' MAIL NAMES FILE & 1010 GOSUB 10000 & \ GOSUB 11000 & ! GET INFO ON NEXT LOOKUP AND NEXT 'REAL' USER & 1020 GOTO 1050 IF (PROJ%=255% AND PROG%=255%) & \ U.PPN%=U.PROG%+SWAP%(U.PROJ%) & \ PPN%=PROG%+SWAP%(PROJ%) & \ GOTO 1030 IF U.PPN% < PPN% & \ GOTO 1040 IF U.PPN% > PPN% & \ PRINT #WORKFN%,UNAM$ & \ GOTO 1010 & ! CONVERT PPN INFO TO WORDS & ! IF WE HAVE A REAL ONE LOWER THAN THE LOOKUP, GO PROCESS REAL & ! IF WE HAVE A REAL ONE HIGHER THAN THE LOOKUP, GO PROCESS LOOKUP & ! OTHERWISE THEY ARE THE SAME, REAL WINS AND GETS WRITTEN & ! AND WE LOOP AGAIN & 1030 PRINT #WORKFN%,UNAM$ & \ GOSUB 11000 & \ GOTO 1020 & ! WRITE OUT REAL ID AND ASK FOR NEXT ONE & ! THEN GO DO COMPARE AGAIN & 1040 PRINT #WORKFN%,"[";NUM1$(PROJ%);",";NUM1$(PROG%);"],";ACTNAM$; & ",U";PROJ$;PROG$;CHR$(9%);"!,Generated username,," & \ GOSUB 10000 & \ GOTO 1020 & ! WRITE OUT LOOKUP ID AND ASK FOR NEXT ONE & ! THEN GO COMPARE AGAIN & 1050 CLOSE #WORKFN% & \ CLOSE #NAMEFN% & \ GOTO 32767 & ! CLOSE OUTPUT FILE & ! AND EXIT & 10000 A$=SYS(CHR$(6%)+CHR$(25%)+CHR$(INDEX%)+CHR$(SWAP%(INDEX%))+ & CHR$(255%)+CHR$(255%)+STRING$(16%,0%)+"SY"+STRING$(2%,0%)) & \ PROG%=ASCII(MID(A$,5%,1%)) & \ PROJ%=ASCII(MID(A$,6%,1%)) & \ GOTO 10100 UNLESS PROJ% & \ PROG$=RIGHT(NUM1$(PROG%+1000%),2%) & \ PROJ$=RIGHT(NUM1$(PROJ%+1000%),2%) & \ ACTNAM$="" & ! DO LOOKUP BY INDEX FOR NEXT ACCOUNT ON SYSTEM DISK & ! EXTRACT PPN INFO & ! PROJECT 0 CAN NEVER BE INTERACTIVE, SO SKIP THEM & ! AND CONVERT TO STRINGS AS WELL & ! SET DEFAULT ACCOUNT NAME IN CASE OF NAME LOOKUP FAILURE & 10010 A$=SYS(CHR$(6%)+CHR$(-25%)+CHR$(-1%)+CHR$(4%)+CHR$(PROG%)+ & CHR$(PROJ%)+STRING$(16%,0%)+"SY"+STRING$(2%,0%)) & \ A%=ASCII(MID(A$,16%,1%)) AND 64% & \ GOTO 10100 IF A% & \ ZEN%=ASCII(MID(A$,19%,1%))+SWAP%(ASCII(MID(A$,20%,1%))) & \ GOTO 10020 IF ZEN% = -1% & \ A%=ZEN%-NOW% & \ GOTO 10100 IF A% <= 0% & ! LOOK UP ACCOUNT FLAGS AND EXPIRATION DATE & ! EXAMINE /NOINTERACTIVE FLAG & ! BAIL OUT IF SET & ! EXAMINE EXPIRATION DATE & ! IF /NOEXPIRE, NO NEED FOR FURTHER CHECKING & ! ELSE COMPUTE DAYS TO EXPIRATION & ! IF EXPIRED ALREADY, SKIP THIS ACCOUNT & 10020 ACTNAM$=CVT$$(MID(SYS(CHR$(6%)+CHR$(-25%)+CHR$(-1%)+CHR$(5%)+ & CHR$(PROG%)+CHR$(PROJ%)+STRING$(16%,0%)+"SY"+STRING$(2%,0%)) & ,8%,13%),5%) & \ ACTNAM$=XLATE(ACTNAM$,MAP$) & ! LOOK UP ACCOUNT NAME (IF PRESENT) & ! ENSURE NO COMMAS IN IT & 10030 A$=SYS(CHR$(6%)+CHR$(-25%)+CHR$(-1%)+CHR$(2%)+CHR$(PROG%)+ & CHR$(PROJ%)+STRING$(16%,0%)+"SY"+STRING$(2%,0%)) & ! MAKE A TRY FOR PRIVS TO SEE IF /NOUSER ACCOUNT & 10040 INDEX%=INDEX%+1% & \ RETURN & ! POINT TO NEXT ACCOUNT & ! RETURN INFORMATION & 10100 INDEX%=INDEX%+1% & \ GOTO 10000 & ! WE CAN'T USE THE CURRENT ACCOUNT, TRY FOR NEXT ONE & & 10200 PROJ%=255% & \ PROG%=255% & \ RETURN & ! SET FLAG INDICATING NO MORE ACCOUNTS & ! AND EXIT & 11000 RETURN IF (U.PROJ%=255% AND U.PROG%=255%) & \ INPUT LINE #NAMEFN%,UNAM$ & \ UNAM$=LEFT(UNAM$,LEN(UNAM$)-1%) & \ GOTO 11020 IF LEFT(UNAM$,1%)="!" & \ J%=INSTR(1%,UNAM$,"[") & \ GOTO 11000 IF J% <> 1% & \ J2%=INSTR(J%+1%,UNAM$,",") & \ J3%=INSTR(J2%+1%,UNAM$,"]") & \ U.PROJ%=VAL(MID(UNAM$,J%+1%,J2%-J%-1%)) & \ U.PROG%=VAL(MID(UNAM$,J2%+1%,J3%-J2%-1%)) & \ RETURN & ! FASTPATH FOR EOF PROCESSING & ! READ A LINE FROM THE 'REAL' NAMES FILE & ! STRIP TRAILING & ! GO COPY IF AN INFORMATIONAL LINE & ! SKIP THIS LINE IF NOT A REAL ENTRY & ! EXTRACT PPN INFO FROM LINE & ! AND RETURN IT & 11010 U.PROJ%=255% & \ U.PROG%=255% & \ RETURN & ! SAY WE HAVE NO MORE DATA & ! AND EXIT & 11020 PRINT #WORKFN%,UNAM$ & \ GOTO 11000 & ! COPY INFORMATIONAL LINE TO OUTPUT FILE (SEQUENCE DOESN'T MATTER) & ! AND GO PROCESS NEXT RECORD & 32400 RESUME 10200 IF ERL=10000% ! NO MORE ACCOUNTS & \ RESUME 10030 IF ERL=10020% ! NO ASSOCIATED NAME & \ RESUME 10100 IF ERL=10030% ! /NOUSER ACCOUNT & \ RESUME 11010 IF ERL=11000% ! NO MORE USERNAMES & \ PRINT "??Unexpected error ";NUM1$(ERR);" at line ";NUM1$(ERL);"." & \ RESUME 32767 & ! ERROR TRAPS & 32767 END