home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / lambda / soundpot / p / reliance.lbr / MPRTPROC.BZS / MPRTPROC.BAS
Encoding:
BASIC Source File  |  1993-10-25  |  11.1 KB  |  448 lines

  1. REM --- MPRTPROC.BAS
  2. COMMENT
  3.     ***********************************************************
  4.     *    This Include module contains procedures for       *
  5.     *    the Reliance Mailing List program, PGM=MAIL      *
  6.     *    Contains procedures to print the labels          *
  7.     ***********************************************************
  8. END
  9.  
  10. PROCEDURE BUILD.ZIP.INDEX
  11. REM ---    Builds index of zip code + name in core, then sorts it
  12.  
  13.     REM --- The following are used to build the index
  14.     VAR    N = INTEGER    ; Subscript to index arrays
  15.     VAR    ZX.END = INTEGER ; Last element used in zip index array
  16.  
  17.     REM --- The following are used to sort the index
  18.     VAR    D = INTEGER    ; Distance separating elements compared
  19.     VAR    SORTED = BYTE    ; Boolean -- whether intermediate sort is done
  20.     VAR    ZX.KEY.SWAP = STRING:14 ; Used to swap array elements
  21.     VAR    ZX.PTR.SWAP = INTEGER   ; Used to swap array elements
  22.  
  23. REM ---    Build index in array in core
  24.  
  25.     WRITESTR "BUILDING INDEX", 19, 8
  26.     OPEN #2; MLIST
  27.     FOR N = 0 TO MAXREC
  28.         IF MX.PTR.ARRAY (N) = MAXINT THEN
  29.             N = MAXREC
  30.         ELSE
  31.             BEGIN
  32.             MX.PTR.WORK = MX.PTR.ARRAY (N)
  33.             READ #2,MX.PTR.WORK
  34.             ZX.KEY.ARRAY (N) = ZIP + SPC(9-LEN(ZIP)) + MX.KEY.ARRAY (N)
  35.             ZX.PTR.ARRAY (N) = MX.PTR.WORK
  36.             ZX.END = N
  37.             END
  38.     NEXT N
  39.     CLOSE #2
  40.  
  41.     IF ZX.END < MAXREC THEN
  42.         BEGIN
  43.         REM --- Flag end of zip array
  44.         ZX.KEY.ARRAY (ZX.END + 1) = STRING (14, 0FFH)
  45.         ZX.PTR.ARRAY (ZX.END + 1) = MAXINT
  46.         END
  47.  
  48. COMMENT
  49.     The following sorts the zip index.  The sort is a version of
  50.     the "Shell" sort translated from Grillo & Robertson, Data
  51.     Management Techniques, (Dubuque: Wm. C. Brown, 1981), page 35.
  52. END
  53.  
  54.     WRITESTR "SORTING INDEX ", 19, 8
  55.     VAR    X = INTEGER
  56.     D = ZX.END / 2
  57.     WHILE D > 0 DO
  58.         BEGIN
  59.         REM --- Print stuff to indicate something happening
  60.         PRINT "+";
  61.         REPEAT
  62.             BEGIN
  63.             SORTED = 'Y'
  64.             FOR N = 0 TO ZX.END - D
  65.                 X = N + D
  66.                 IF ZX.KEY.ARRAY (N) > ZX.KEY.ARRAY (X) THEN
  67.                     BEGIN
  68.                     ZX.KEY.SWAP = ZX.KEY.ARRAY (X)
  69.                     ZX.KEY.ARRAY (X) = ZX.KEY.ARRAY (N)
  70.                     ZX.KEY.ARRAY (N) = ZX.KEY.SWAP
  71.                     ZX.PTR.SWAP = ZX.PTR.ARRAY (X)
  72.                     ZX.PTR.ARRAY (X) = ZX.PTR.ARRAY (N)
  73.                     ZX.PTR.ARRAY (N) = ZX.PTR.SWAP
  74.                     SORTED = 'N'
  75.                     END ; END IF
  76.             NEXT N
  77.             END \    ; END REPEAT
  78.         UNTIL SORTED
  79.         D = D / 2
  80.         END    ; END WHILE
  81. END    ; END PROC = BUILD.ZIP.INDEX
  82.  
  83. REM ------------------------------------------------------------
  84.  
  85. PROCEDURE PRINT.LIST (SORT.TYPE = STRING:8; SELECT.TYPE,U.CODE = BYTE;
  86.              Z.CODE = STRING:5)
  87.     REM --- Assumes 80-column width and 66-line page length
  88.     VAR    LINE, PAGE, N = INTEGER
  89.     VAR    FORM.FEED = BYTE
  90.     FORM.FEED = 0CH
  91.     VAR    SOME.PRINTED = BYTE    ; Boolean -- Whether we found any
  92.  
  93.     WRITESTR "PUT PLAIN PAPER IN THE PRINTER, THEN PRESS <RETURN>", 19, 8
  94.     WRITESTR "TO START PRINTING, OR PRESS <ESC> TO CANCEL", 20, 8
  95.     ECHO OFF
  96.     REPEAT
  97.         INPUT3 ANS
  98.     UNTIL ANS = CARR.RTN OR ANS = ESCAPE
  99.     ECHO ON
  100.     IF ANS = ESCAPE THEN
  101.         0PRINT.LIST.END
  102.  
  103. REM --- Initialize
  104.     LINE = 99
  105.     PAGE = 0
  106.     SOME.PRINTED = 'N'
  107.     OPEN #2; MLIST
  108.  
  109. REM --- Print the list
  110.     LPRINTER
  111.     FOR N = 0 TO MAXREC
  112.         BEGIN
  113.         IF SORT.TYPE = "NAME" THEN
  114.             MX.PTR.WORK = MX.PTR.ARRAY (N)
  115.         ELSE
  116.             MX.PTR.WORK = ZX.PTR.ARRAY (N)
  117.         IF MX.PTR.WORK = MAXINT THEN
  118.             N = MAXREC
  119.         ELSE
  120.             BEGIN
  121.             READ #2,MX.PTR.WORK
  122.             IF SELECT.TYPE = '1' \
  123.             OR (SELECT.TYPE = '2' AND LEFT$(ZIP,5) = Z.CODE) \
  124.             OR (SELECT.TYPE = '3' AND USER.CODE = U.CODE) THEN
  125.                 BEGIN
  126.                 SOME.PRINTED = 'Y'
  127.                 IF LINE > 54 THEN
  128.                     BEGIN
  129.                     REM --- Print page header
  130.                     PRINT FORM.FEED
  131.                     PRINT "MAILING LIST SORTED BY ";SORT.TYPE;
  132.                     PRINT TAB(35);
  133.                     CASE SELECT.TYPE OF
  134.                     "1" : PRINT "-- ALL --";
  135.                     "2" : PRINT "ZIP CODE "; Z.CODE;
  136.                     "3" : PRINT "USER CODE "; U.CODE;
  137.                     END    ; END CASE
  138.                     PRINT TAB(65);
  139.                     PAGE = PAGE + 1
  140.                     PRINT "PAGE";PAGE
  141.                     LINE = 0
  142.                     END
  143.                 PRINT
  144.                 PRINT LAST.NAME; ", "; FRST.NAME; TAB(33);
  145.                 PRINT "Home: ";
  146.                 IF LEN(HOME.PHON) <> 0 THEN
  147.                     BEGIN
  148.                     IF LEN(HOME.PHON) = 7 THEN
  149.                         BEGIN
  150.                         PRINT MID$(HOME.PHON,1,3);
  151.                         PRINT "-"; MID$(HOME.PHON,4,4)
  152.                         END
  153.                     ELSE
  154.                         BEGIN
  155.                         PRINT "("; MID$(HOME.PHON,1,3); ")";
  156.                         PRINT MID$(HOME.PHON,4,3);
  157.                         PRINT "-"; MID$(HOME.PHON,7,4)
  158.                         END
  159.                     END
  160.                 ELSE
  161.                     PRINT
  162.                 PRINT TAB(4); ADDR1; TAB(33);
  163.                 PRINT "Work: ";
  164.                 IF LEN(WORK.PHON) <> 0 THEN
  165.                     BEGIN
  166.                     IF LEN(WORK.PHON) = 7 THEN
  167.                         BEGIN
  168.                         PRINT MID$(WORK.PHON,1,3);
  169.                         PRINT "-"; MID$(WORK.PHON,4,4)
  170.                         END
  171.                     ELSE
  172.                         BEGIN
  173.                         PRINT "("; MID$(WORK.PHON,1,3); ")";
  174.                         PRINT MID$(WORK.PHON,4,3);
  175.                         PRINT "-"; MID$(WORK.PHON,7,4)
  176.                         END
  177.                     END
  178.                 ELSE
  179.                     PRINT
  180.                 PRINT TAB(4); ADDR2; TAB(33);
  181.                 PRINT "Code: "; USER.CODE
  182.                 PRINT TAB(4); CITY; TAB(21); STATE; " "; ZIP
  183.                 LINE = LINE + 5
  184.                 END
  185.             END
  186.         END
  187.     NEXT N
  188.     CONSOLE
  189.  
  190.     IF NOT SOME.PRINTED THEN
  191.         BEGIN
  192.         WRITESTR SPC(55), 19, 8
  193.         WRITESTR SPC(55), 20, 8
  194.         PRINT BEL
  195.         WRITESTR "NO RECORDS FOUND", 19, 8
  196.         PAUSE
  197.         END
  198.  
  199.     CLOSE #2
  200.  
  201. 0PRINT.LIST.END
  202. END    ; END PROC=PRINT.LIST
  203.  
  204. REM ------------------------------------------------------------
  205.  
  206. PROCEDURE PRINT.LABELS (SORT.TYPE = STRING:5; SELECT.TYPE,U.CODE = BYTE;
  207.             Z.CODE = STRING:5)
  208. COMMENT
  209.     Print the mailing list on 2-up continuous labels.
  210.     Assumes labels 4" X 15/16" and printer doing
  211.     10 cpi horizontally and 6 lpi vertically.
  212. END
  213.  
  214.     VAR    N = INTEGER        ; Loop control
  215.     VAR    SOME.PRINTED = BYTE ; Boolean -- whether we found any
  216.     VAR    L.IS.EMPTY   = BYTE ; Boolean -- whether right buffer is empty
  217.  
  218.     REM --- The following is for the left label print buffer
  219.     VAR    L.LAST.NAME = STRING:15
  220.     VAR    L.FRST.NAME = STRING:10
  221.     VAR    L.ADDR1     = STRING:25
  222.     VAR    L.ADDR2     = STRING:25
  223.     VAR    L.CITY      = STRING:12
  224.     VAR    L.STATE     = STRING:2
  225.     VAR    L.ZIP       = STRING:9
  226.     VAR    L.USER.CODE = BYTE
  227.  
  228.     REM --- The following is for the right label print buffer
  229.     VAR    R.LAST.NAME = STRING:15
  230.     VAR    R.FRST.NAME = STRING:10
  231.     VAR    R.ADDR1     = STRING:25
  232.     VAR    R.ADDR2     = STRING:25
  233.     VAR    R.CITY      = STRING:12
  234.     VAR    R.STATE     = STRING:2
  235.     VAR    R.ZIP       = STRING:9
  236.     VAR    R.USER.CODE = BYTE
  237.  
  238.     PROCEDURE PRT.LBLS
  239.         LPRINTER
  240.         PRINT
  241.         PRINT TAB(3); L.LAST.NAME; ", "; L.FRST.NAME;
  242.         PRINT TAB(31); L.USER.CODE;
  243.         PRINT TAB(43); R.LAST.NAME; ", "; R.FRST.NAME;
  244.         PRINT TAB(71); R.USER.CODE
  245.         PRINT TAB(3); L.ADDR1; TAB(43); R.ADDR1
  246.         PRINT TAB(3); L.ADDR2; TAB(43); R.ADDR2
  247.         PRINT TAB(3); L.CITY; TAB(20); L.STATE; TAB(23); L.ZIP;
  248.         PRINT TAB(43); R.CITY; TAB(60); R.STATE; TAB(63); R.ZIP
  249.         PRINT
  250.         CONSOLE
  251.     END    ; END PROC = PRT.LBLS
  252.  
  253. REM --- Begin main line of PROC = PRINT.LABELS
  254.  
  255.     WRITESTR "PUT 2-UP CONTINUOUS LABELS IN THE PRINTER, THEN PRESS",19,8
  256.     WRITESTR "<RETURN> TO START PRINTING, OR PRESS <ESC> TO CANCEL",20,8
  257.     ECHO OFF
  258.     REPEAT
  259.         INPUT3 ANS
  260.     UNTIL ANS = CARR.RTN OR ANS = ESCAPE
  261.     ECHO ON
  262.     IF ANS = ESCAPE THEN
  263.         0PRINT.LABELS.END
  264.  
  265. REM --- Print dummy lines until forms are aligned
  266.     WRITESTR "PRINTING DUMMY LINES TILL FORMS ARE ALIGNED          ",19,8
  267.     WRITESTR SPC(53), 20, 8
  268.     R.LAST.NAME = STRING (15,'X')
  269.     R.FRST.NAME = STRING (10,'X')
  270.     R.ADDR1        = STRING (25,'X')
  271.     R.ADDR2        = STRING (25,'X')
  272.     R.CITY        = STRING (12,'X')
  273.     R.STATE        = "XX"
  274.     R.ZIP        = STRING (9,'9')
  275.     R.USER.CODE = 'X'
  276.     L.LAST.NAME = STRING (15,'X')
  277.     L.FRST.NAME = STRING (10,'X')
  278.     L.ADDR1     = STRING (25,'X')
  279.     L.ADDR2     = STRING (25,'X')
  280.     L.CITY      = STRING (12,'X')
  281.     L.STATE     = "XX"
  282.     L.ZIP       = STRING (9,'9')
  283.     L.USER.CODE = 'X'
  284.     REPEAT
  285.         BEGIN
  286.         PRT.LBLS
  287.         WRITESTR "IS THIS OK?",20,8
  288.         READ.BOOL 20, 20
  289.         END
  290.     UNTIL ANS
  291.  
  292. REM --- Fill label buffers and print
  293.  
  294.     OPEN #2; MLIST
  295.     L.IS.EMPTY = 'Y'
  296.     SOME.PRINTED = 'N'
  297.     FOR N = 0 TO MAXREC
  298.         IF SORT.TYPE = "NAME" THEN
  299.             MX.PTR.WORK = MX.PTR.ARRAY (N)
  300.         ELSE
  301.             MX.PTR.WORK = ZX.PTR.ARRAY (N)
  302.         IF MX.PTR.WORK = MAXINT THEN
  303.             N = MAXREC    ; Don't read any more
  304.         ELSE
  305.             BEGIN
  306.             READ #2, MX.PTR.WORK
  307.             IF SELECT.TYPE = '1' \
  308.             OR (SELECT.TYPE = '2' AND LEFT$(ZIP,5) = Z.CODE) \
  309.             OR (SELECT.TYPE = '3' AND USER.CODE = U.CODE) THEN
  310.                 BEGIN
  311.                 SOME.PRINTED = 'Y'
  312.                 IF L.IS.EMPTY THEN
  313.                     BEGIN
  314.                     L.LAST.NAME = LAST.NAME
  315.                     L.FRST.NAME = FRST.NAME
  316.                     L.ADDR1     = ADDR1
  317.                     L.ADDR2     = ADDR2
  318.                     L.CITY      = CITY
  319.                     L.STATE     = STATE
  320.                     L.ZIP       = ZIP
  321.                     L.USER.CODE = USER.CODE
  322.                     L.IS.EMPTY = 'N'
  323.                     END
  324.                 ELSE
  325.                     BEGIN
  326.                     R.LAST.NAME = LAST.NAME
  327.                     R.FRST.NAME = FRST.NAME
  328.                     R.ADDR1     = ADDR1
  329.                     R.ADDR2     = ADDR2
  330.                     R.CITY      = CITY
  331.                     R.STATE     = STATE
  332.                     R.ZIP       = ZIP
  333.                     R.USER.CODE = USER.CODE
  334.                     PRT.LBLS
  335.                     L.IS.EMPTY = 'Y'
  336.                     END
  337.                 END
  338.             END
  339.     NEXT N
  340.  
  341. REM --- If there is anything left to print, print it
  342.     IF NOT L.IS.EMPTY THEN
  343.         BEGIN
  344.         SOME.PRINTED = 'Y'
  345.         R.LAST.NAME = SPC(15)
  346.         R.FRST.NAME = SPC(10)
  347.         R.ADDR1     = SPC(25)
  348.         R.ADDR2     = "   *** END OF LABELS ***"
  349.         R.CITY      = SPC(12)
  350.         R.STATE     = "  "
  351.         R.ZIP       = SPC(9)
  352.         R.USER.CODE = ' '
  353.         PRT.LBLS
  354.         END
  355.  
  356.     IF NOT SOME.PRINTED THEN
  357.         BEGIN
  358.         WRITESTR SPC(55), 19, 8
  359.         WRITESTR SPC(55), 20, 8
  360.         PRINT BEL
  361.         WRITESTR "NO RECORDS FOUND", 19, 8
  362.         PAUSE
  363.         END
  364.  
  365.     CLOSE #2
  366.  
  367. 0PRINT.LABELS.END
  368. END    ; END PROC = PRINT.LABELS
  369.  
  370. REM ------------------------------------------------------------
  371.  
  372. PROCEDURE PRINT.NAMES (PRT.TYPE = INTEGER)
  373.     REM --- PRT.TYPE 1 = Print mailing list, 2 = labels
  374.  
  375.     VAR    SORT.TYPE = STRING:8    ; "NAME" or "ZIP CODE"
  376.     VAR    SELECT.TYPE = BYTE    ; 1 = all, 2 = zip code, 3 = user code
  377.     VAR    U.CODE    = BYTE    ; User code to select on
  378.     VAR    Z.CODE    = STRING:5    ; Zip code to select on
  379.  
  380.     IF PRT.TYPE = 1 THEN
  381.         PAINT.SCREEN 8
  382.     ELSE
  383.         PAINT.SCREEN 9
  384.     REM --- Ask if sort is by name or zip code
  385. 0PL0    REPEAT
  386.         GET.STRING 8,43,1,'N',""
  387.     UNTIL Q$ = "1" OR Q$ = "2" OR QESC
  388.     IF QESC THEN 0PRINT.NAMES.END
  389.     IF Q$ = "1" THEN
  390.         SORT.TYPE = "NAME"
  391.     ELSE
  392.         SORT.TYPE = "ZIP CODE"
  393.  
  394.     REM ---- Ask for selection criterion
  395. 0PL1    REPEAT
  396.         GET.STRING 14,43,1,'N',""
  397.     UNTIL Q$="1" OR Q$="2" OR Q$="3" OR QPREV OR QESC
  398.     IF QESC THEN 0PRINT.NAMES.END
  399.     IF QPREV THEN 0PL0
  400.     SELECT.TYPE = Q$
  401.  
  402.     IF SELECT.TYPE = "1" THEN
  403.         BEGIN
  404.         U.CODE = 00H
  405.         Z.CODE = STRING (5,00H)
  406.         END
  407.     ELSE IF SELECT.TYPE = "2" THEN
  408.         BEGIN
  409.         WRITESTR "ENTER THE ZIP CODE ==>",16,8
  410.         GET.STRING 16,31,5,'N',""
  411.         IF QESC THEN 0PRINT.NAMES.END
  412.         IF QPREV THEN
  413.             BEGIN
  414.             WRITESTR SPC(28),16,8
  415.             GOTO 0PL1
  416.             END
  417.         U.CODE = 00H
  418.         Z.CODE = Q$
  419.         END
  420.     ELSE IF SELECT.TYPE = "3" THEN
  421.         BEGIN
  422.         WRITESTR "ENTER THE USER CODE ==>",16,8
  423.         GET.STRING 16,32,1,'S',""
  424.         IF QESC THEN 0PRINT.NAMES.END
  425.         IF QPREV THEN
  426.             BEGIN
  427.             WRITESTR SPC(25),16,8
  428.             GOTO 0PL1
  429.             END
  430.         U.CODE = Q$
  431.         Z.CODE = STRING (5,00H)
  432.         END
  433.  
  434.     IF SORT.TYPE = "ZIP CODE" THEN
  435.         BUILD.ZIP.INDEX
  436.  
  437.     IF PRT.TYPE = 1 THEN
  438.         PRINT.LIST SORT.TYPE, SELECT.TYPE, U.CODE, Z.CODE
  439.     ELSE
  440.         PRINT.LABELS SORT.TYPE, SELECT.TYPE, U.CODE, Z.CODE
  441.  
  442. 0PRINT.NAMES.END
  443. END    ; END PROC=PRINT.NAMES
  444. 'N',""
  445.     UNTIL Q$="1" OR Q$="2" OR Q$="3" OR QPREV OR QESC
  446.     IF QESC THEN 0PRINT.NAMES.END
  447.     IF QPREV THEN 0PL0
  448.