10  REM:   CHAIN: Chain maintenance program
20  REM:
21  REM:   Written by David Shayer
23  REM:   Overhauled by Brad Zaller  SMHS 9/81
24  REM:
30  DIM A$[100],F$[100],P$[100],B$[100],I$[100]
40  FILES *,*
42  REM:   The BREAK key must be disabled due to the sensitivity of
44  REM:   the security system.  An aborted chain could be fatal.
50  REM b=brk(0)
60  REM:   In the next line, A$ must be set to the account
70  REM:   in which the LOG file resides.
80  A$="A101"
90  SYSTEM F$,"TIM"
110  IF POS("A0A1X0X1Q4",F$[1,2]) <> 0 THEN 140
120  CHAIN B5,"$HELLO",350
130  STOP 
140  F$="LOG."
150  F$[LEN(F$)+1]=A$
160  ASSIGN F$,1,R,"HAN"
170  IF R=0 THEN 210
180  ASSIGN *,1
190  PRINT "Assign error (Flag file) - Cannot continue"'7"."
191  SYSTEM X,"MES-"'7":::ASSIGN ERROR:::LOG FILE:::CHAIN:::"'7
200  STOP 
210  PRINT LIN(1);"*** Chain ***"
220  F$="INFOC."
230  F$[7]=A$
410  PRINT LIN(1);"Command: ";
420  LINPUT A$
425  A$=UOS$(A$)
430  IF LEN(A$)=0 THEN 410
440  IF A$[1,3]#"//S" THEN 460
450  STOP 
460  IF A$[1,3]#"//H" THEN 490
461  PRINT LIN(1);TAB(12);"Valid chain commands:";LIN(1)
462  PRINT "   (A)dd      - Adds a chain into the system"
463  PRINT "   (C)hange   - Alters a single chain entry"
464  PRINT "   (D)ump     - Dumps titles of all chains"
465  PRINT "   (L)ist     - Lists a given chain entry"
466  PRINT "   (K)ill     - Removes a chain from the system";LIN(1)
467  PRINT "   (//R)epgen - Transfers control to the REPGEN program"
468  PRINT "   (//S)top   - Exits this program"
469  ASSIGN "INFOC.A101",2,R,"CONTROL"
470  IF  END #2 THEN 410
471  READ #2;B$
472  PRINT LIN(1);"Continue? ";
473  LINPUT A$
474  A$=UOS$(A$)
475  IF A$[1,1]#"Y" THEN 410
476  PRINT LIN(1);"   Chain info file updated: ";B$;LIN(1)
477  READ #2;I$
478  PRINT I$
479  GOTO 477
490  IF A$[1,3]="//R" THEN 2920
495  P=POS("ACKLD",A$[1,1])
500  GOTO P OF 530,950,1190,1420,1550
510  PRINT A$;": Invalid command"
520  GOTO 410
530  REM ***** Add a chain to the system *****
540  PRINT LIN(1);"Account: ";
550  LINPUT A$
555  A$=UOS$(A$)
560  IF LEN(A$)=0 THEN 410
570  GOSUB 2480
580  IF R=1 THEN 540
590  PRINT "Program: ";
600  LINPUT P$
605  P$=UOS$(P$)
610  IF LEN(P$)=0 THEN 410
620  GOSUB 1990
630  IF R=1 THEN 590
640  GOSUB 1720
650  IF  END #1 THEN 920
660  GOTO R OF 700,870
670  UNLOCK #1
680  PRINT A$;" already has a chain; Use the (C)hange option."
690  GOTO 410
700  FOR X=LEN(A$)+1 TO 25
710  A$[X,X]=" "
720  NEXT X
730  A$[15,25]=P$
740  READ #1,100;E
750  FOR X=1 TO E
760  READ #1;F$
770  IF F$[1,1]#" " THEN 820
780  F$=A$
790  READ #1,100
800  ADVANCE #1;X,R
810  GOTO 880
820  NEXT X
830  PRINT #1;A$
840  READ #1,100
850  UPDATE #1;E+1
860  GOTO 890
870  F$[15,25]=P$
880  UPDATE #1;F$
890  UNLOCK #1
900  PRINT A$[1,POS(A$," ")-1];", ";P$[1,POS(P$," ")-1];": Chain entered"
910  GOTO 410
920  UNLOCK #1
930  PRINT '7"No room in flag file - Chain '";A$;", ";P$;"' not entered."'7
940  GOTO 410
950  REM ***** Change chain entry *****
960  PRINT LIN(1);"Account: ";
970  LINPUT A$
975  A$=UOS$(A$)
980  IF LEN(A$)=0 THEN 410
990  GOSUB 2480
1000  IF R=1 THEN 960
1002  GOSUB 1720
1003  IF R=0 THEN 1010
1004  UNLOCK #1
1005  PRINT A$;" doesn't have a chain - Use the (A)dd option."
1007  GOTO 410
1010  PRINT "New chain: ";
1020  LINPUT P$
1025  P$=UOS$(P$)
1030  IF LEN(P$)=0 THEN 410
1040  GOSUB 1990
1050  IF R=1 THEN 1010
1110  F$[15,25]=P$
1120  FOR X=8+LEN(P$) TO 14
1130  F$[X,X]=" "
1140  NEXT X
1150  UPDATE #1;F$
1160  UNLOCK #1
1170  PRINT A$;" chain changed to '";P$[1,POS(P$," ")-1];"'."
1180  GOTO 410
1190  REM ***** Remove a chain entry *****
1200  PRINT LIN(1);"Account: ";
1210  LINPUT A$
1215  A$=UOS$(A$)
1220  IF LEN(A$)=0 THEN 410
1230  GOSUB 2480
1240  IF R=1 THEN 1200
1250  GOSUB 1720
1260  IF R=0 THEN 1300
1270  UNLOCK #1
1280  PRINT A$;" doesn't have a chain."
1290  GOTO 410
1300  IF NUM(F$[7,7])#32 OR NUM(F$[8,8])#32 THEN 1350
1310  FOR X=1 TO 25
1320  F$[X,X]=" "
1330  NEXT X
1340  GOTO 1380
1350  FOR X=15 TO 25
1360  F$[X,X]=" "
1370  NEXT X
1380  UPDATE #1;F$
1390  UNLOCK #1
1400  PRINT A$;": Chain removed"
1410  GOTO 410
1420  REM ***** List a chain entry *****
1430  PRINT LIN(1);"Account: ";
1440  LINPUT A$
1445  A$=UOS$(A$)
1450  IF LEN(A$)=0 THEN 410
1460  GOSUB 2480
1470  IF R=1 THEN 1430
1480  GOSUB 1720
1490  UNLOCK #1
1500  IF R=0 THEN 1530
1510  PRINT A$;" doesn't have a chain."
1520  GOTO 410
1530  PRINT A$;": ";F$[15,POS(F$[15,LEN(F$)]," ")+13]
1540  GOTO 410
1550  REM ***** Dump all chain entries *****
1560  PRINT LIN(2);"Account","Chain"
1570  LOCK #1
1580  READ #1,100;E
1590  UNLOCK #1
1600  FOR X=1 TO E
1610  LOCK #1
1620  READ #1,100
1630  ADVANCE #1;X,R
1640  READ #1;F$
1650  UNLOCK #1
1660  IF F$[1,1]=" " THEN 1690
1670  IF F$[15,15]=" " THEN 1690
1680  PRINT F$[1,6],F$[15,25]
1690  NEXT X
1700  PRINT LIN(2)
1710  GOTO 410
1720  REM ***** Look for account in file *****
1730  REM:   A$ = Account to be checked
1740  REM:   R  = return variable; 0=Good account, 1=No such account
1750  REM R-RETURN VARIABLE  0=GOOD ACCOUNT  1=NO SUCH ACCOUNT
1760  REM:        2=Account entered in file, but without a chain
1770  REM:   File pointer will be positioned just before entry if good,
1780  REM:   if no good then at end of file.
1790  LOCK #1
1800  IF  END #1 THEN 1960
1810  READ #1,100;E
1820  FOR X=1 TO E
1830  READ #1;F$
1840  IF F$[1,1]=" " THEN 1860
1850  IF A$=F$[1,POS(F$," ")-1 MIN 6] THEN 1890
1860  NEXT X
1870  R=1
1880  RETURN 
1890  R=0
1900  READ #1,100
1910  ADVANCE #1;X,R
1920  IF F$[15,15]=" " THEN 1940
1930  RETURN 
1940  R=2
1950  RETURN 
1960  UNLOCK #1
1970  PRINT "Data format error in flag file - Cannot continue"'7
1980  STOP 
1990  REM ***** Check program name *****
2000  REM:   P$ = Name to be checked
2010  REM:   R  = return variable;  0=Good name, 1=Bad name
2020  R=0
2030  P$=UOS$(P$)
2040  IF P$[1,3]#"//S" THEN 2060
2050  STOP 
2060  IF P$[1,3]#"//H" THEN 2100
2070  PRINT "Enter the title of the program you wish to chain the"
2080  PRINT "user to.  Ex: PROG1   $CLOCK   SECURE.A123   *INFORM"
2090  GOTO 2455
2100  IF P$="$HELLO" THEN 2450
2110  IF P$="HELLO.A000" THEN 2450
2120  IF P$="LOGON.A100" THEN 2450
2130  IF LEN(P$)<1 OR LEN(P$)>11 THEN 2450
2140  IF NUM(P$)=36 OR NUM(P$)=42 THEN 2340
2150  IF POS(P$,".")#0 THEN 2230
2160  IF LEN(P$)>6 THEN 2450
2170  FOR X=1 TO LEN(P$)
2180  IF NUM(P$[X,X])>47 AND NUM(P$[X,X])<58 THEN 2210
2190  IF NUM(P$[X,X])>64 AND NUM(P$[X,X])<91 THEN 2210
2200  GOTO 2450
2210  NEXT X
2220  GOTO 2410
2230  IF POS(P$,".")=1 THEN 2450
2240  FOR X=1 TO POS(P$,".")-1
2250  IF NUM(P$[X,X])>47 AND NUM(P$[X,X])<58 THEN 2280
2260  IF NUM(P$[X,X])>64 AND NUM(P$[X,X])<91 THEN 2280
2270  GOTO 2450
2280  NEXT X
2290  IF NUM(P$[X+1,X+1])<65 OR NUM(P$[X+1,X+1])>90 THEN 2450
2300  FOR Y=X+2 TO LEN(P$)
2310  IF NUM(P$[Y,Y])<48 OR NUM(P$[Y,Y])>57 THEN 2450
2320  NEXT Y
2330  GOTO 2410
2340  IF POS(P$,".")#0 THEN 2450
2350  IF LEN(P$)>7 THEN 2450
2360  FOR X=2 TO LEN(P$)
2370  IF NUM(P$[X,X])>47 AND NUM(P$[X,X])<58 THEN 2400
2380  IF NUM(P$[X,X])>64 AND NUM(P$[X,X])<91 THEN 2400
2390  GOTO 2450
2400  NEXT X
2410  FOR X=LEN(P$)+1 TO 15
2420  P$[X,X]=" "
2430  NEXT X
2440  RETURN 
2450  PRINT P$;": Illegal chain"
2455  R=1
2460  PRINT 
2470  RETURN 
2480  REM ***** Check for valid account name *****
2490  REM:   A$ = Account to be checked
2500  REM:   R  = Return variable; 0=Good account, 1=Bad account
2510  R=0
2520  A$=UOS$(A$)
2530  IF A$[1,3]#"//S" THEN 2550
2540  STOP 
2550  IF A$[1,3]#"//H" THEN 2590
2560  PRINT "Enter a valid port, account, or combination port/account."
2570  PRINT "Example:  09   N123   14F110   R100   01E099   ALL"
2580  GOTO 2900
2590  IF LEN(A$)<1 OR LEN(A$)>6 THEN 2870
2600  IF A$="ALL" THEN 2670
2610  IF NUM(A$)>47 AND NUM(A$)<58 THEN 2680
2620  IF NUM(A$)<65 OR NUM(A$)>90 THEN 2890
2630  IF LEN(A$)>4 THEN 2890
2640  FOR X=2 TO LEN(A$)
2650  IF NUM(A$[X,X])<48 OR NUM(A$[X,X])>57 THEN 2890
2660  NEXT X
2670  RETURN 
2680  IF LEN(A$)=1 THEN 2830
2690  IF NUM(A$[2,2])<48 OR NUM(A$[2,2])>57 THEN 2770
2700  IF LEN(A$)=2 THEN 2760
2710  IF NUM(A$[3,3])<65 OR NUM(A$[3,3])>90 THEN 2890
2720  IF LEN(A$)=3 THEN 2760
2730  FOR X=4 TO LEN(A$)
2740  IF NUM(A$[X,X])<48 OR NUM(A$[X,X])>57 THEN 2890
2750  NEXT X
2760  RETURN 
2770  IF NUM(A$[2,2])<65 OR NUM(A$[2,2])>90 THEN 2890
2780  IF LEN(A$)=2 THEN 2860
2790  IF LEN(A$)>5 THEN 2890
2800  FOR X=3 TO LEN(A$)
2810  IF NUM(A$[X,X])<48 OR NUM(A$[X,X])>57 THEN 2890
2820  NEXT X
2830  F$=A$
2840  A$="0"
2850  A$[2]=F$
2860  RETURN 
2870  PRINT "6 characters maximum"
2880  GOTO 2900
2890  PRINT A$;": Illegal account"
2900  R=1
2910  RETURN 
2920  REM ***** Chain to $REPGEN *****
2930  PRINT LIN(1);"*** Repgen ***"
2940  CHAIN "$REPGEN"
2950  PRINT '7"Program $REPGEN not found"
2960  GOTO 410
2970  END 
