home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG028.ARK / NAINT.BAS < prev    next >
BASIC Source File  |  1984-04-29  |  11KB  |  457 lines

  1.  
  2. REM    CACHE MAILING LIST MAINTENANCE PROGRAM
  3.  
  4. REM    11/05/77 ADD NOTIFY COMMAND
  5.  
  6. REM    01/16/78 ADD COMPUTER AND PHONE TO NOTIFY
  7.  
  8. REM    02/18/78 ADD PHONE DIALING FUNCTION USING \
  9.     TARBELL OUTPUT PORT AND RELAY+390 OHM RESISTOR \
  10.     ACROSS PHONE LINE
  11.  
  12. REM    4/1/78 PUT IN MUST.WRITE$ & MUST.UPDATE$ FLAGS
  13.  
  14. REM    4/2/78 MAKE 'NOTIFY' COMMAND PRINT ENTIRE PAGE
  15.  
  16.     PRINT    "MAINT VERSION 1.8"
  17.     FILE.NAME$="CACHE.FIL"
  18.     FILE.SIZE = 512
  19.     REC.LENG = 128
  20.     KB = 1 :REM KEYBOARD INPUT
  21.     ABORT = 127 :REM PRESS DEL TO ABORT
  22.     FIELD.COUNT = 10 :REM # FIELDS IN RECORD
  23.     FILE FILE.NAME$(REC.LENG)
  24.     DIM FIELD.NAME$(FIELD.COUNT)
  25.     DIM RECORD$(FIELD.COUNT)
  26.     DIM MAC.COMD$(11)
  27. REM    READ FIELD NAMES
  28.     DATA SORT,NAME,ORG,STREET,CITY,ZIP,\
  29.         PHONE,COMPUTER,PAID,TYPE
  30.     FOR I = 1 TO FIELD.COUNT
  31.         READ FIELD.NAME$(I)
  32.     NEXT I
  33.     MUST.UPDATE$ = "N"
  34.     MUST.WRITE$ = "N"
  35.  
  36. REM    MAIN PROCESSING LOOP
  37.  
  38. 100    IF (INP(KB) AND 127) = ABORT THEN MAC.COUNT = 0
  39.     IF MAC.COUNT > 0 THEN 8100
  40.     INPUT "COMMAND--->";C$
  41.     IF C$="MACRO" THEN 8000
  42. 110    IF C$="HELP" THEN 200
  43.     IF LEFT$(C$,2)="C " THEN 1300
  44.     IF C$="LIST" THEN 1400
  45.     IF C$="FREE" THEN PRINT FRE:GOTO 100
  46.     IF C$="CANCEL" THEN 2100
  47.     IF C$="WRITE" THEN 1700
  48.     IF C$="VERIFY" THEN 2200
  49.  
  50.     IF MUST.WRITE$ = "N" THEN 120
  51.     PRINT "RECORD MUST BE WRITTEN TO DISK"
  52.     PRINT "VALID COMMANDS:"
  53.     PRINT "HELP, VERIFY, FREE, C, CANCEL, LIST, WRITE"
  54.     GOTO 100
  55.  
  56. 120    IF C$="UPDATE" THEN GOSUB 9100:GOTO 100
  57.     IF MUST.UPDATE$ = "N" THEN 130
  58.     PRINT "MUST UPDATE OR CANCEL"
  59.     GOTO 100
  60.  
  61. 130    IF LEFT$(C$,5)="FIND " THEN 1000
  62.     IF LEFT$(C$,5)="READ " THEN 1100
  63.     IF LEFT$(C$,5)="DUMP " THEN 1200
  64.     IF LEFT$(C$,2)="? " THEN 1500
  65.     IF LEFT$(C$,2)="F "THEN 1600
  66.     IF C$="ADD" THEN 1800
  67.     IF C$="ERASE" THEN 1900
  68.     IF C$="CALL" OR C$="DIAL" THEN 2000
  69.     IF LEFT$(C$,7)="NOTIFY " THEN 9200
  70.     IF LEFT$(C$,6)="PURGE " THEN 9200
  71.     IF C$="END" THEN 9999
  72. 199    PRINT "INVALID COMMAND ";C$
  73.     MAC.COUNT = 0
  74.     GOTO 100
  75. REM    GIVE HELP
  76. 200    PRINT "SUBSTITUTE PROPER VALUES ";\
  77.         "FOR THOSE IN PARENTHESES."
  78.     PRINT
  79.     PRINT "FIND (NAME)  SEE NOTE 1"
  80.     PRINT "READ (REC #)"
  81.     PRINT "DUMP (REC #)  SEE NOTE 1"
  82.     PRINT "C (FIELD NAME) (VALUE)  CHANGE"
  83.     PRINT "LIST"
  84.     PRINT "? (FIELD NAME) (VALUE) SEE NOTE 2"
  85.     PRINT "F (FIELD NAME) (VALUE) SEE NOTE 3"
  86.     PRINT "WRITE      RANDOMIZE AND WRITE"
  87.     PRINT"            (USE AFTER ADD)"
  88.     PRINT "ADD        ADD A NEW RECORD"
  89.     PRINT "CANCEL     CANCEL REQUIRED WRITE OR UPDATE"
  90.     PRINT "ERASE      ERASES CURRENT RECORD"
  91.     PRINT "FREE       HOW MUCH SPACE FREE IN MEM"
  92.     PRINT "DIAL       DIAL PHONE OF CURRENT RECORD"
  93.     PRINT "UPDATE     REWRITES CURRENT RECORD"
  94.     PRINT "PURGE YYDD PURGE FILE FOR A MONTH"
  95.     PRINT "NOTIFY YYDD PRINT EXPIRATION NOTIFICATIONS"
  96.     PRINT "END        END OF PROGRAM"
  97.     PRINT
  98.     PRINT "NOTE 1:  PRESS DEL TO STOP"
  99.     PRINT "NOTE 2:  ? MATCHES STARTING IN COL. 1"
  100.     PRINT "NOTE 3:  F SCANS ENTIRE FIELD"
  101.     PRINT
  102.     GOTO 100
  103. REM    FIND RECORD
  104. 1000    KEY$=MID$(C$,6,99)
  105.     GOSUB 8700
  106.     IF FLAG = 0 THEN\
  107.         PRINT "NO RECORD FOUND" :\
  108.         GOTO 100
  109.     GOSUB 9000
  110.     GOTO 100M    READ BY RECORD NUMBER
  111. 1100    KEY=VAL(MID$(C$,6,99))
  112.     IF KEY < 1 OR KEY > 512 THEN \
  113.         PRINT "INVALID KEY":GOTO 100
  114.     GOSUB 8800
  115.     IF FLAG = 1 THEN\
  116.         GOSUB 9000
  117.     GOTO 100
  118. REM DUMP FILE
  119. 1200    KEY=VAL(MID$(C$,6,99))
  120.     IF KEY<1 OR KEY>FILE.SIZE THEN \
  121.         PRINT "INVALID KEY":\
  122.         GOTO 100
  123. 1210    GOSUB 8800
  124.     IF FLAG = 1 THEN GOSUB 9000
  125.     IF (INP(KB) AND 127)=ABORT THEN 100
  126.     KEY = KEY + 1
  127.     IF KEY >FILE.SIZE THEN \
  128.          KEY = 1 :\
  129.         MAC.COUNT = 0
  130.     GOTO 1210
  131. REM    SCAN FILE FOR MATCHING FIELD
  132. 1300    GOSUB 8910
  133.     PRINT "FIELD WAS: ";RECORD$(FIELD.NO)
  134.     IF LEFT$(FIELD.VALUE$,1)="/" THEN 1320
  135.     RECORD$(FIELD.NO)=FIELD.VALUE$
  136. 1310    GOSUB 9000
  137.     IF MUST.WRITE$ = "N" THEN MUST.UPDATE$ ="Y"
  138.     GOTO 100
  139.     REM FIELD CHANGE BY CHAR SUBSTITUTION
  140. 1320    IF RIGHT$(FIELD.VALUE$,1)="/" THEN \
  141.         FIELD.VALUE$ = LEFT$(FIELD.VALUE$,\
  142.         LEN(FIELD.VALUE$)-1)
  143.     FIELD.VALUE$=MID$(FIELD.VALUE$,2,99)
  144.     FOR I=LEN(FIELD.VALUE$) TO 1 STEP -1
  145.     IF MID$(FIELD.VALUE$,I,1)="/" THEN \
  146.         FROM$=LEFT$(FIELD.VALUE$,I-1):\
  147.         TO$=MID$(FIELD.VALUE$,I+1,99)
  148.     NEXT I
  149.     TEMP$=RECO^RD$(FIELD.NO)
  150.     FOR I=1 TO LEN(TEMP$)-LEN(FROM$)+1
  151.     IF MID$(TEMP$,I,LEN(FROM$))=FROM$ THEN 1330
  152.     NEXT I
  153.     PRINT "NOT FOUND"
  154.     GOTO 100
  155. 1330    RECORD$(FIELD.NO)=""
  156.     IF I=1 THEN 1340
  157.     RECORD$(FIELD.NO)=LEFT$(TEMP$,I-1)
  158. 1340    RECORD$(FIELD.NO)=RECORD$(FIELD.NO)+TO$+\
  159.         MID$(TEMP$,I+LEN(FROM$),99)
  160.     GOTO 1310
  161.  
  162. REM    PRINT RECORD
  163. 1400    GOSUB 9000
  164.     GOTO 100
  165.  
  166. REM    SCAN FILE FOR VALUE
  167. 1500    FIND.FLAG = 0
  168. 1505    GOSUB 8910 :REM GET NO. ,VALUE
  169.     PRINT "SCANNING FROM ";\
  170.         KEY;"FOR ";FIELD$;\
  171.         "=";FIELD.VALUE$
  172.     NUMBER.SCANNED = 0
  173.     LENGTH = LEN(FIELD.VALUE$)
  174. 1510    NUMBER.SCANNED = NUMBER.SCANNED + 1
  175.     IF NUMBER.SCANNED = FILE.SIZE THEN\
  176.         PRINT "NOT FOUND":\
  177.         GOTO 100
  178.     IF (INP(KB) AND 127)=ABORT THEN 100
  179.     KEY=KEY+1
  180.     IF KEY>FILE.SIZE THEN\
  181.         KEY=1:\
  182.         MAC.COUNT = 0
  183.     GOSUB 8800
  184.     IF FLAG = 0 THEN 1510
  185.     PRINT KEY,RECORD$(FIELD.NO)
  186.     IF FIND.FLAG = 1 THEN 1550
  187.     IF LEFT$(RECORD$(FIELD.NO),LENGTH)\
  188.         =FIELD.VALUE$ THEN\
  189.         GOSUB 9000:\
  190.         GOTO 100
  191.     GOTO 1510
  192.     REM SCAN THE FIELD FOR THE VALUE
  193. 1550    TEMP$=RECORD$(FIELD.NO)
  194.     IF LENGTH > LEN(TEMP$) THEN 1510
  195.     FOR I=1 TO 1+LEN(TEMP$)-LENGTH
  196.     IF MID$(TEMP$,I,LENGTH)\
  197.         =FIELD.VALUE$ THEN\
  198.         GOSUB 9000:\
  199.         GOTO 100
  200.     NEXT I
  201.     GOTO 1510
  202. REM    FIND VALUE IN FILE FOR PARTICULAR FIELD
  203. 1600    FIND.FLAG = 1
  204.     GOTO 1505
  205. REM    RANDOMLY WRITE A RECORD
  206. 1700    KEY$=RECORD$(2)
  207.     GOSUB 8900 :REM CALCULATE KEY
  208. 1710    PRINT KEY
  209.     READ #1,KEY;FLAG
  210.     IF FLAG = 0 THEN\
  211.         GOSUB 9100:\
  212.         GOTO 100
  213.     KEY = KEY + 1
  214.     IF KEY > FILE.SIZE THEN \
  215.         KEY = 1 :\
  216.         MAC.COUNT = 0
  217.     IF (INP(KB) AND 127) = ABORT THEN 100
  218.     GOTO 1710
  219. REM    INPUT A NEW RECORD (ADD)
  220. 1800    FOR I=1 TO FIELD.COUNT
  221.     PRINT FIELD.NAME$(I);" ";
  222.     INPUT RECORD$(I)
  223.     IF RECORD$(I)="QUIT" THEN 100
  224.     NEXT I
  225.     GOSUB 9000
  226.     MUST.WRITE$ = "Y"
  227.     GOTO 100
  228. REM    ERASE A RECORD
  229. 1900    IF KEY < 1 OR KEY > FILE.SIZE THEN 199
  230.     PRINT #1,KEY;0,RECORD$(2)
  231.     PRINT "DELETED"
  232.     GOTO 100
  233.  
  234. REM    DIAL A PHONE NUMBER
  235. 2000    IF FLAG=0 THEN \
  236.         PRINT "NO RECORD" :\
  237.         GOTO 100
  238.     PRINT "DIALING ";
  239.     OUT 108,1
  240.     FOR K=1 TO 300 : NEXT
  241.     S=1
  242.     IF LEN(PHONE$)<6 THEN 100
  243.     IF LEFT$(PHONE$,5)="(312)" THEN S=6
  244.     FOR I=S TO LEN(PHONE$)
  245.     D=ASC(MID$(PHONE$,I,1))
  246.     PRINT CHR$(D);
  247.     IF D >= ASC("0") AND D<= ASC("9") THEN \
  248.         GOSUB 2010
  249.     NEXT I
  250.     PRINT "    PICK UP PHONE"
  251.     FOR K=1 TO 300:NEXT K
  252.     OUT 108,0
  253.     GOTO 100
  254. 2010    D=D-48
  255.     IF D=0 THEN D=10
  256.     FOR J=1 TO D
  257.         OUT 108,0
  258.         FOR K=1 TO 7 : NEXT K
  259.         OUT 108,1
  260.         FOR K=1 TO 7 : NEXT K
  261.     NEXT J
  262.     FOR K=1 TO 100 : NEXT K
  263.     RETURN
  264.  
  265. REM    CANCEL MUST.UPDATE$ AND MUST.WRITE$
  266. 2100    MUST.UPDATE$ = "N"
  267.     MUST.WRITE$ = "N"
  268.     GOTO 100
  269.  
  270. REM    VERIFY A NEW RECORD
  271. 2200    FOR I=1 TO FIELD.COUNT
  272.     PRINT FIELD.NAME$(I);" ";
  273.     INPUT TEMP$
  274.     IF TEMP$="QUIT" THEN 100
  275.     IF LEN(TEMP$)<>LEN(RECORD$(I)) THEN 2210
  276.     IF TEMP$=RECORD$(I) THEN 2220
  277. REM    FIELD FAILED TO VERIFY
  278. 2210    PRINT "INVALID FIELD"
  279.     PRINT "ORIG: ";RECORD$(I)
  280.     PRINT "VER:  ";TEMP$
  281.     INPUT "KEEP OR CHANGE";C$
  282.     IF LEFT$(C$,1)="K" THEN 2220
  283.     IF LEFT$(C$,1)<>"C" THEN 2220
  284.     RECORD$(I)=TEMP$
  285. 2220    NEXT I
  286.     PRINT "VERIFIED"
  287.     GOTO 100
  288.  
  289. REM    INIT MACRO PROCESSING
  290. 8000    INPUT "NUMBER OF TIMES TO REPEAT";MAC.COUNT
  291.     FOR I=1 TO 10
  292.     INPUT "MACRO COMMAND";MAC.COMD$(I)
  293.     IF MAC.COMD$(I)="END" THEN 8010
  294.     NEXT I
  295.     MAC.COMD$(11)="END"
  296. 8010    INPUT "OK TO START";ANS$
  297.     IF LEFT$(ANS$,1)="Y" THEN \
  298.         MAC.NO = 1 :\
  299.         GOTO 100
  300. 8020    MAC.COUNT = 0
  301.     PRINT "MACRO ABORTED"
  302.     GOTO 100
  303. REM    MACRO COMMANDS
  304. 8100    C$=MAC.COMD$(MAC.NO)
  305.     MAC.NO = MAC.NO + 1
  306.     IF C$<>"END" THEN \
  307.         GOTO 110
  308.     MAC.COUNT = MAC.COUNT -1
  309.     IF MAC.COUNT = 0 THEN 8020
  310.     MAC.NO = 1
  311.     GOTO 8100
  312. REM    READ RECORD K$
  313. 8700    GOSUB 8900 :REM CALCULATE KEY
  314.     TRIES = 0 :REM ALLOW UP TO 100 TRIES
  315. 8710    GOSUB 8800
  316.     IF FLAG = 1 AND KEY$=NAME$ THEN RETURN
  317.     IF FLAG =1 THEN PRINT KEY;NAME$
  318.     TRIES = TRIES + 1
  319.     IF (INP(KB) AND 127)=ABORT THEN 8750
  320.     KEY = KEY + 1
  321.     IF KEY > FILE.SIZE THEN \
  322.         KEY = 1
  323.     IF TRIES < 100 THEN 8710
  324.     REM CAN'T FIND RECORD
  325. 8750    FLAG = 0 :REM SHOW NOT FOUND
  326.     RETURN
  327. REM    PHYSICAL READ RECORD # IN KEY
  328. 8800    READ #1,KEY;FLAG
  329.     IF FLAG=0 THEN RETURN
  330.     READ #1,KEY;\
  331.         FLAG,\
  332.         RECORD$(1),\
  333.         RECORD$(2),\
  334.         RECORD$(3),\
  335.         RECORD$(4),\
  336.         RECORD$(5),\
  337.         RECORD$(6),\
  338.         RECORD$(7),\
  339.         RECORD$(8),\
  340.         RECORD$(9),\
  341.         RECORD$(10)
  342. REM    SET VARIABLE NAMES FROM RECORD$(N)
  343. 8850    SORT$=RECORD$(1)
  344.     NAME$=RECORD$(2)
  345.     ORG$=RECORD$(3)
  346.     STREET$=RECORD$(4)
  347.     CITY$=RECORD$(5)
  348.     ZIP$=RECORD$(6)
  349.     PHONE$=RECORD$(7)
  350.     COM$=RECORD$(8)
  351.     PAID$=RECORD$(9)
  352.     TYPE$=RECORD$(10)
  353.     RETURN
  354. REM    KEY CALCULATING ROUTINE - INPUT IN KEY$
  355. 8900    KEY=0
  356.     FOR I=1 TO LEN(KEY$) STEP 2
  357.     KEY=2*KEY+(15 AND ASC(MID$(KEY$,I,1)))
  358.     NEXT I
  359.     KEY = KEY-FILE.SIZE*INT(KEY/FILE.SIZE)
  360.     KEY = INT(KEY+.1)
  361.     IF KEY = 0 THEN KEY = 1
  362.     PRINT "RANDOMIZED TO ";KEY
  363.     RETURN
  364. REM    EXTRACT FIELD NAME, VALUE FROM C$
  365. 8910    C$=MID$(C$,3,99)
  366.     BP=0
  367.     REM FIND BLANK AFTER FIELD NAME
  368.     FOR I=LEN(C$) TO 1 STEP -1
  369.     IF MID$(C$,I,1)=" " THEN BP=I
  370.     NEXT I
  371.     IF BP<2 THEN 199
  372.     BP=BP-1
  373.     FIELD$=LEFT$(C$,BP)
  374.     FIELD.NO = 0
  375.     FOR I=1 TO FIELD.COUNT
  376.     IF LEFT$(FIELD.NAME$(I),BP)=FIELD$ THEN\
  377.         FIELD.NO = I
  378.     NEXT I
  379.     IF FIELD.NO=0 THEN\
  380.         PRINT "NO SUCH FIELD ";FIELD$:\
  381.         GOTO 100
  382.     FIELD.VALUE$=MID$(C$,BP+2,99)
  383.     FIELD$=FIELD.NAME$(FIELD.NO)
  384.     RETURN
  385. REM    RECORD PRINT ROUTINE
  386. 9000    PRINT
  387.     PRINT "RECORD #";KEY;" ";RECORD$(1) :REM SORT
  388.     PRINT RECORD$(2) :REM NAME
  389.     PRINT RECORD$(3) :REM ORG
  390.     PRINT RECORD$(4) :REM STREET
  391.     PRINT RECORD$(5);" ";RECORD$(6)
  392.     PRINT RECORD$(7);";";\
  393.         RECORD$(8);";";\
  394.         RECORD$(9);";";\
  395.         RECORD$(10)
  396.     PRINT
  397.     RETURN
  398. REM    WRITE RECORD(KEY)
  399. 9100    IF KEY < 1 OR KEY > FILE.SIZE THEN\
  400.         PRINT "INVALID KEY FOR WRITE":\
  401.         GOTO 100
  402.     MUST.WRITE$="N":MUST.UPDATE$="N"
  403.     PRINT #1,KEY;1,RECORD$(1),\
  404.         RECORD$(2),\
  405.         RECORD$(3),\
  406.         RECORD$(4),\
  407.         RECORD$(5),\
  408.         RECORD$(6),\
  409.         RECORD$(7),\
  410.         RECORD$(8),\
  411.         RECORD$(9),\
  412.         RECORD$(10)
  413.     RETURN
  414.  
  415. REM    FILE PURGE OR NOTIFY BY DATE
  416. 9200    DEL.DATE$=MID$(C$,7,99)
  417.     IF LEFT$(C$,1)="N" THEN\
  418.          DEL.DATE$=MID$(DEL.DATE$,2,99)
  419.     PRINT:PRINT "TURN ON PRINTER."
  420.     INPUT"STARTING, ENDING RECORD";STARTING,ENDING
  421.     FOR I=STARTING TO ENDING
  422.     READ #1,I;FLAG
  423.     IF FLAG=0 THEN 9205
  424.     READ #1,I;FLAG,SO$,NA$,OR$,ST$,CI$,ZI$,PH$,CO$,PA$,TY$
  425.     IF PA$<>DEL.DATE$ THEN 9205
  426.     IF LEFT$(C$,1)="N" THEN 9220
  427.     PRINT "DELETED ";PA$;" ";NA$
  428.     FLAG=0
  429.     PRINT #1,I;FLAG,SO$,NA$,OR$,ST$,CI$,ZI$,PH$,CO$,PA$,TY$
  430. REM    CHECK FOR ABORT
  431. 9205    IF (INP(KB) AND 127)=ABORT THEN 100
  432. 9210    NEXT I
  433.     PRINT "END OF PURGE"
  434.     GOTO 100
  435. 9220    PRINT CHR$(14);"CACHE"
  436.     PRINT "P. O. BOX 52"
  437.     PRINT "SOUTH HOLLAND, IL. 60473"
  438.     FOR C=1 TO 5:PRINT:NEXT C
  439.     PRINT TAB(20);NA$
  440.     PRINT TAB(20);OR$
  441.     PRINT TAB(20);ST$
  442.     PRINT TAB(20);CI$;" ";ZI$
  443.     FOR C=1 TO 34:PRINT:NEXT C
  444.     PRINT "YOUR MEMBERSHIP IN C.A.C.H.E. THE CHICAGO AREA"
  445.     PRINT "COMPUTER HOBBYISTS EXCHANGE HAS "
  446.     PRINT "AN EXPIRATION DATE (YYMM) OF ";PA$;"."
  447.     PRINT "TO RENEW, SEND $10 WITH THIS CARD, TO:"
  448.     PRINT
  449.     PRINT CHR$(14);"CACHE"
  450.     PRINT "P. O. BOX 52"
  451.     PRINT "SOUTH HOLLAND, IL. 60473"
  452.     PRINT:PRINT"IF YOU HAVE QUESTIONS, CALL THE HOTLINE,"
  453.     PRINT "(312) 849-1132."
  454.     PRINT CHR$(12)
  455.     GOTO 9205
  456. 9999    END
  457.