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 / CPMUG006.ARK / MAINT.BAS < prev    next >
BASIC Source File  |  1984-04-29  |  8KB  |  340 lines

  1. REM    CACHE MAILING LIST MAINTENANCE PROGRAM
  2.     PRINT    "MAINT VERSION 1.3"
  3.     FILE.NAME$="CACHE.FIL"
  4.     FILE.SIZE = 512
  5.     REC.LENG = 128
  6.     KB = 1 :REM KEYBOARD INPUT
  7.     ABORT = 255 :REM KB VALUE TO ABORT
  8.     FIELD.COUNT = 10 :REM # FIELDS IN RECORD
  9.     FILE FILE.NAME$(REC.LENG)
  10.     DIM FIELD.NAME$(FIELD.COUNT)
  11.     DIM RECORD$(FIELD.COUNT)
  12.     DIM MAC.COMD$(11)
  13.     REM    READ FIELD NAMES
  14.     DATA SORT,NAME,ORG,STREET,CITY,ZIP,\
  15.         PHONE,COMPUTER,PAID,TYPE
  16.     FOR I = 1 TO FIELD.COUNT
  17.         READ FIELD.NAME$(I)
  18.     NEXT I
  19.     REM    MAIN PROCESSING LOOP
  20. 100    IF INP(KB) = ABORT THEN MAC.COUNT = 0
  21.     IF MAC.COUNT > 0 THEN 8100
  22.     INPUT "COMMAND--->";C$
  23.     IF C$="MACRO" THEN 8000
  24. 110    IF C$="HELP" THEN 200
  25.     IF LEFT$(C$,5)="FIND " THEN 1000
  26.     IF LEFT$(C$,5)="READ " THEN 1100
  27.     IF LEFT$(C$,5)="DUMP " THEN 1200
  28.     IF LEFT$(C$,2)="C " THEN 1300
  29.     IF C$="LIST" THEN 1400
  30.     IF LEFT$(C$,2)="? " THEN 1500
  31.     IF LEFT$(C$,2)="F "THEN 1600
  32.     IF C$="WRITE" THEN 1700
  33.     IF C$="ADD" THEN 1800
  34.     IF C$="ERASE" THEN 1900
  35.     IF C$="UPDATE" THEN GOSUB 9100:GOTO 100
  36.     IF C$="FREE" THEN PRINT FRE:GOTO 100
  37.     IF LEFT$(C$,6)="PURGE " THEN 9200
  38.     IF C$="END" THEN 9999
  39. 199    PRINT "INVALID COMMAND ";C$
  40.     MAC.COUNT = 0
  41.     GOTO 100
  42. REM    GIVE HELP
  43. 200    PRINT "SUBSTITUTE PROPER VALUES ";\
  44.         "FOR THOSE IN PARENTHESES."
  45.     PRINT
  46.     PRINT "FIND (NAME)  SEE NOTE 1"
  47.     PRINT "READ (REC #)"
  48.     PRINT "DUMP (REC #)  SEE NOTE 1"
  49.     PRINT "C (FIELD NAME) (VALUE)  CHANGE"
  50.     PRINT "LIST"
  51.     PRINT "? (FIELD NAME) (VALUE) SEE NOTE 2"
  52.     PRINT "F (FIELD NAME) (VALUE) SEE NOTE 3"
  53.     PRINT "WRITE      RANDOMIZE AND WRITE"
  54.     PRINT"            (USE AFTER ADD)"
  55.     PRINT "ADD        ADD A NEW RECORD"
  56.     PRINT "ERASE      ERASES CURRENT RECORD"
  57.     PRINT "FREE       HOW MUCH SPACE FREE IN MEM"
  58.     PRINT "UPDATE     REWRITES CURRENT RECORD"
  59.     PRINT "PURGE YYDD PURGE FILE FOR A MONTH"
  60.     PRINT "END        END OF PROGRAM"
  61.     PRINT
  62.     PRINT "NOTE 1:  PRESS DEL TO STOP"
  63.     PRINT "NOTE 2:  ? MATCHES STARTING IN COL. 1"
  64.     PRINT "NOTE 3:  F SCANS ENTIRE FIELD"
  65.     PRINT
  66.     GOTO 100
  67. REM    FIND RECORD
  68. 1000    KEY$=MID$(C$,6,99)
  69.     GOSUB 8700
  70.     IF FLAG = 0 THEN\
  71.         PRINT "NO RECORD FOUND" :\
  72.         GOTO 100
  73.     GOSUB 9000
  74.     GOTO 100
  75. REM    READ BY RECORD NUMBER
  76. 1100    KEY=VAL(MID$(C$,6,99))
  77.     IF KEY < 1 OR KEY > 512 THEN \
  78.         PRINT "INVALID KEY":GOTO 100
  79.     GOSUB 8800
  80.     IF FLAG = 1 THEN\
  81.         GOSUB 9000
  82.     GOTO 100
  83. REM DUMP FILE
  84. 1200    KEY=VAL(MID$(C$,6,99))
  85.     IF KEY<1 OR KEY>FILE.SIZE THEN \
  86.         PRINT "INVALID KEY":\
  87.         GOTO 100
  88. 1210    GOSUB 8800
  89.     IF FLAG = 1 THEN GOSUB 9000
  90.     IF INP(KB)=ABORT THEN 100
  91.     KEY = KEY + 1
  92.     IF KEY >FILE.SIZE THEN \
  93.          KEY = 1 :\
  94.         MAC.COUNT = 0
  95.     GOTO 1210
  96. REM    SCAN FILE FOR MATCHING FIELD
  97. 1300    GOSUB 8910
  98.     PRINT "FIELD WAS: ";RECORD$(FIELD.NO)
  99.     IF LEFT$(FIELD.VALUE$,1)="/" THEN 1320
  100.     RECORD$(FIELD.NO)=FIELD.VALUE$
  101. 1310    GOSUB 9000
  102.     GOTO 100
  103.     REM FIELD CHANGE BY CHAR SUBSTITUTION
  104. 1320    IF RIGHT$(FIELD.VALUE$,1)="/" THEN \
  105.         FIELD.VALUE$ = LEFT$(FIELD.VALUE$,\
  106.         LEN(FIELD.VALUE$)-1)
  107.     FIELD.VALUE$=MID$(FIELD.VALUE$,2,99)
  108.     FOR I=LEN(FIELD.VALUE$) TO 1 STEP -1
  109.     IF MID$(FIELD.VALUE$,I,1)="/" THEN \
  110.         FROM$=LEFT$(FIELD.VALUE$,I-1):\
  111.         TO$=MID$(FIELD.VALUE$,I+1,99)
  112.     NEXT I
  113.     TEMP$=RECORD$(FIELD.NO)
  114.     FOR I=1 TO LEN(TEMP$)-LEN(FROM$)+1
  115.     IF MID$(TEMP$,I,LEN(FROM$))=FROM$ THEN 1330
  116.     NEXT I
  117.     PRINT "NOT FOUND"
  118.     GOTO 100
  119. 1330    RECORD$(FIELD.NO)=""
  120.     IF I=1 THEN 1340
  121.     RECORD$(FIELD.NO)=LEFT$(TEMP$,I-1)
  122. 1340    RECORD$(FIELD.NO)=RECORD$(FIELD.NO)+TO$+\
  123.         MID$(TEMP$,I+LEN(FROM$),99)
  124.     GOTO 1310
  125. REM    PRINT RECORD
  126. 1400    IF FLAG = 0 THEN\
  127.         PRINT "NO RECORD":\
  128.         GOTO 100
  129.     GOSUB 9000
  130.     GOTO 100
  131. REM    SCAN FILE FOR VALUE
  132. 1500    FIND.FLAG = 0
  133. 1505    GOSUB 8910 :REM GET NO. ,VALUE
  134.     PRINT "SCANNING FROM ";\
  135.         KEY;"FOR ";FIELD$;\
  136.         "=";FIELD.VALUE$
  137.     NUMBER.SCANNED = 0
  138.     LENGTH = LEN(FIELD.VALUE$)
  139. 1510    NUMBER.SCANNED = NUMBER.SCANNED + 1
  140.     IF NUMBER.SCANNED = FILE.SIZE THEN\
  141.         PRINT "NOT FOUND":\
  142.         GOTO 100
  143.     IF INP(KB)=ABORT THEN 100
  144.     KEY=KEY+1
  145.     IF KEY>FILE.SIZE THEN\
  146.         KEY=1:\
  147.         MAC.COUNT = 0
  148.     GOSUB 8800
  149.     IF FLAG = 0 THEN 1510
  150.     PRINT KEY,RECORD$(FIELD.NO)
  151.     IF FIND.FLAG = 1 THEN 1550
  152.     IF LEFT$(RECORD$(FIELD.NO),LENGTH)\
  153.         =FIELD.VALUE$ THEN\
  154.         GOSUB 9000:\
  155.         GOTO 100
  156.     GOTO 1510
  157.     REM SCAN THE FIELD FOR THE VALUE
  158. 1550    TEMP$=RECORD$(FIELD.NO)
  159.     IF LENGTH > LEN(TEMP$) THEN 1510
  160.     FOR I=1 TO 1+LEN(TEMP$)-LENGTH
  161.     IF MID$(TEMP$,I,LENGTH)\
  162.         =FIELD.VALUE$ THEN\
  163.         GOSUB 9000:\
  164.         GOTO 100
  165.     NEXT I
  166.     GOTO 1510
  167. REM    FIND VALUE IN FILE FOR PARTICULAR FIELD
  168. 1600    FIND.FLAG = 1
  169.     GOTO 1505
  170. REM    RANDOMLY WRITE A RECORD
  171. 1700    KEY$=RECORD$(2)
  172.     GOSUB 8900 :REM CALCULATE KEY
  173. 1710    PRINT KEY
  174.     READ #1,KEY;FLAG
  175.     IF FLAG = 0 THEN\
  176.         GOSUB 9100:\
  177.         GOTO 100
  178.     KEY = KEY + 1
  179.     IF KEY > FILE.SIZE THEN \
  180.         KEY = 1 :\
  181.         MAC.COUNT = 0
  182.     IF INP(KB) = ABORT THEN 100
  183.     GOTO 1710
  184. REM    INPUT A NEW RECORD (ADD)
  185. 1800    FOR I=1 TO FIELD.COUNT
  186.     PRINT FIELD.NAME$(I);" ";
  187.     INPUT RECORD$(I)
  188.     IF RECORD$(I)="QUIT" THEN 100
  189.     NEXT I
  190.     GOSUB 9000
  191.     GOTO 100
  192. REM    ERASE A RECORD
  193. 1900    IF KEY < 1 OR KEY > FILE.SIZE THEN 199
  194.     PRINT #1,KEY;0,RECORD$(2)
  195.     PRINT "DELETED"
  196.     GOTO 100
  197. REM    INIT MACRO PROCESSING
  198. 8000    INPUT "NUMBER OF TIMES TO REPEAT";MAC.COUNT
  199.     FOR I=1 TO 10
  200.     INPUT "MACRO COMMAND";MAC.COMD$(I)
  201.     IF MAC.COMD$(I)="END" THEN 8010
  202.     NEXT I
  203.     MAC.COMD$(11)="END"
  204. 8010    INPUT "OK TO START";ANS$
  205.     IF LEFT$(ANS$,1)="Y" THEN \
  206.         MAC.NO = 1 :\
  207.         GOTO 100
  208. 8020    MAC.COUNT = 0
  209.     PRINT "MACRO ABORTED"
  210.     GOTO 100
  211. REM    MACRO COMMANDS
  212. 8100    C$=MAC.COMD$(MAC.NO)
  213.     MAC.NO = MAC.NO + 1
  214.     IF C$<>"END" THEN \
  215.         GOTO 110
  216.     MAC.COUNT = MAC.COUNT -1
  217.     IF MAC.COUNT = 0 THEN 8020
  218.     MAC.NO = 1
  219.     GOTO 8100
  220. REM    READ RECORD K$
  221. 8700    GOSUB 8900 :REM CALCULATE KEY
  222.     TRIES = 0 :REM ALLOW UP TO 100 TRIES
  223. 8710    GOSUB 8800
  224.     IF FLAG = 1 AND KEY$=NAME$ THEN RETURN
  225.     IF FLAG =1 THEN PRINT KEY;NAME$
  226.     TRIES = TRIES + 1
  227.     IF INP(KB)=ABORT THEN 8750
  228.     KEY = KEY + 1
  229.     IF KEY > FILE.SIZE THEN \
  230.         KEY = 1
  231.     IF TRIES < 100 THEN 8710
  232.     REM CAN'T FIND RECORD
  233. 8750    FLAG = 0 :REM SHOW NOT FOUND
  234.     RETURN
  235. REM    PHYSICAL READ RECORD # IN KEY
  236. 8800    READ #1,KEY;FLAG
  237.     IF FLAG=0 THEN RETURN
  238.     READ #1,KEY;\
  239.         FLAG,\
  240.         RECORD$(1),\
  241.         RECORD$(2),\
  242.         RECORD$(3),\
  243.         RECORD$(4),\
  244.         RECORD$(5),\
  245.         RECORD$(6),\
  246.         RECORD$(7),\
  247.         RECORD$(8),\
  248.         RECORD$(9),\
  249.         RECORD$(10)
  250. REM    SET VARIABLE NAMES FROM RECORD$(N)
  251. 8850    SORT$=RECORD$(1)
  252.     NAME$=RECORD$(2)
  253.     ORG$=RECORD$(3)
  254.     STREET$=RECORD$(4)
  255.     CITY$=RECORD$(5)
  256.     ZIP$=RECORD$(6)
  257.     PHONE$=RECORD$(7)
  258.     COM$=RECORD$(8)
  259.     PAID$=RECORD$(9)
  260.     TYPE$=RECORD$(10)
  261.     RETURN
  262. REM    KEY CALCULATING ROUTINE - INPUT IN KEY$
  263. 8900    KEY=0
  264.     FOR I=1 TO LEN(KEY$) STEP 2
  265.     KEY=2*KEY+(15 AND ASC(MID$(KEY$,I,1)))
  266.     NEXT I
  267.     KEY = KEY-FILE.SIZE*INT(KEY/FILE.SIZE)
  268.     KEY = INT(KEY+.1)
  269.     IF KEY = 0 THEN KEY = 1
  270.     PRINT "RANDOMIZED TO ";KEY
  271.     RETURN
  272. REM    EXTRACT FIELD NAME, VALUE FROM C$
  273. 8910    C$=MID$(C$,3,99)
  274.     BP=0
  275.     REM FIND BLANK AFTER FIELD NAME
  276.     FOR I=LEN(C$) TO 1 STEP -1
  277.     IF MID$(C$,I,1)=" " THEN BP=I
  278.     NEXT I
  279.     IF BP<2 THEN 199
  280.     BP=BP-1
  281.     FIELD$=LEFT$(C$,BP)
  282.     FIELD.NO = 0
  283.     FOR I=1 TO FIELD.COUNT
  284.     IF LEFT$(FIELD.NAME$(I),BP)=FIELD$ THEN\
  285.         FIELD.NO = I
  286.     NEXT I
  287.     IF FIELD.NO=0 THEN\
  288.         PRINT "NO SUCH FIELD ";FIELD$:\
  289.         GOTO 100
  290.     FIELD.VALUE$=MID$(C$,BP+2,99)
  291.     FIELD$=FIELD.NAME$(FIELD.NO)
  292.     RETURN
  293. REM    RECORD PRINT ROUTINE
  294. 9000    PRINT
  295.     PRINT "RECORD #";KEY;" ";RECORD$(1) :REM SORT
  296.     PRINT RECORD$(2) :REM NAME
  297.     PRINT RECORD$(3) :REM ORG
  298.     PRINT RECORD$(4) :REM STREET
  299.     PRINT RECORD$(5);" ";RECORD$(6)
  300.     PRINT RECORD$(7);";";\
  301.         RECORD$(8);";";\
  302.         RECORD$(9);";";\
  303.         RECORD$(10)
  304.     PRINT
  305.     RETURN
  306. REM    WRITE RECORD(KEY)
  307. 9100    IF KEY < 1 OR KEY > FILE.SIZE THEN\
  308.         PRINT "INVALID KEY FOR WRITE":\
  309.         GOTO 100
  310.     PRINT #1,KEY;1,RECORD$(1),\
  311.         RECORD$(2),\
  312.         RECORD$(3),\
  313.         RECORD$(4),\
  314.         RECORD$(5),\
  315.         RECORD$(6),\
  316.         RECORD$(7),\
  317.         RECORD$(8),\
  318.         RECORD$(9),\
  319.         RECORD$(10)
  320.     RETURN
  321. REM    FILE PURGE BY DATE
  322. 9200    PRINT "FILE PURGE ROUTINE:"
  323.     DEL.DATE$=MID$(C$,7,99)
  324.     PRINT "PURGING DATE '";DEL.DATE$;"'"
  325.     PRINT:PRINT "TURN ON PRINTER."
  326.     INPUT"STARTING, ENDING RECORD";STARTING,ENDING
  327.     FOR I=STARTING TO ENDING
  328.     READ #1,I;FLAG
  329.     IF FLAG=0 THEN 9210
  330.     READ #1,I;FLAG,SO$,NA$,OR$,ST$,CI$,ZI$,PH$,CO$,PA$,TY$
  331.     IF PA$<>DEL.DATE$ THEN 9210
  332.     PRINT "DELETED ";PA$;" ";NA$
  333.     FLAG=0
  334.     PRINT #1,I;FLAG,SO$,NA$,OR$,ST$,CI$,ZI$,PH$,CO$,PA$,TY$
  335.     IF INP(1)=255 THEN 100
  336. 9210    NEXT I
  337.     PRINT "END OF PURGE"
  338.     GOTO 100
  339. 9999    END
  340.