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 / MAILLIST.DOC < prev    next >
Text File  |  1984-04-29  |  23KB  |  608 lines

  1. FILENAME: MAILLIST.DOC, 09/25/77 by Ward Christensen
  2.     12/17/77 ADD 'RESIZE' DOC
  3.     4/1/78 ADD "MUST WRITE" AND "MUST UPDATE" DOC
  4.     4/8/78 ADD LETTER WRITING INFO FOR REPORT.BAS
  5. ------------------------------------------------------------
  6.     DOCUMENTATION FILE FOR THE COMPUTER CLUB
  7.     MAILING LIST PROGRAMS WRITTEN IN BASIC-E.
  8. -------------------------------------------------------
  9. THESE PROGRAMS ARE BEING PROVIDED THROUGH THE COURTESY OF
  10. THE AUTHOR FOR THE SOLE USE OF HOBBYIST COMPUTER CLUBS IN
  11. MAINTAINING THEIR MAILING LISTS.  ABSOLUTELY NOT FOR OTHER
  12. COMMERCIAL USE.  WHY?  I HATE JUNK MAIL LISTS, AND I DEFINE
  13. JUNK MAIL LISTS AS ANY MAIL LIST WHERE THE RECIPIENT DID
  14. NOT EXPLICITLY ASK FOR THE MAILING.
  15. ------------------------------------------------------
  16.  
  17. The needs of a computer club in maintaining a mailing
  18. list consist of the following requirements:
  19.  
  20.      1)  A file of names with sufficient information
  21.      about each member.
  22.      2)  A maintenance program to add, change, and delete
  23.      records.
  24.      3)  A sort program to change the order of the file (by
  25.      last name, zip, etc.) for report purposes.
  26.      4)  A program to print:
  27.          Alphabetic master listings
  28.          Mailing labels (usually in Zip sequence)
  29.          Name tags for meeting use.
  30.  
  31. The programs to fulfill these needs are:
  32.  
  33.      1)  PREFORMAT.BAS preformats the required size file
  34.      2)  MAINT.BAS maintains the mailing list
  35.      3)  SORT.ASM sorts the file, producing an index file
  36.      4)  REPORT.BAS prints listings labels and name tags.
  37.      4)  RESIZE.BAS to change the master file size
  38.      5)  QUICKIE.BAS skeleton program for modification
  39. ------------------------------------------------------------
  40. As currently implemented, the file consists of 512, 128
  41. byte (1 sector) records.  It was originally thought that
  42. 1 sector records would be required because of the sort
  43. program written in assembler.  However, the sort program
  44. was eventually written to be independent of file length.
  45. Note that 128 is still a very good value, because of
  46. the efficiency of BASIC/E only having to
  47. read 1 sector per record.  If the record length was
  48. say, 150 bytes, then 2 sectors would always have to
  49. be read.  Also, random writing would have to read
  50. modify, and write sectors because of the sector overlap.
  51.  
  52.  
  53. For speed of access during maintenance, the file is
  54. written using a randomizing or hashing technique on the
  55. person's name.  The algorithm is as follows:  A variable
  56. is initialized to 0.  Then, every other letter in the person's
  57. name (1, 3, 5 ... n) is, one at a time, added into the
  58. variable.  The variable is doubled between each addition.
  59. Then, the result is divided by the number of records in
  60. the file, and the remainder is used as a record number.
  61. When adding, if the record is already in use, the file is
  62. sequentially read from that point until an open record is
  63. found.  When retrieving, the record randomized to is read,
  64. and the name is matched.  If it is not the right name,
  65. the file is read sequentially until the a record with
  66. a matching name is found.  You may press 'DEL' (or rubout)
  67. to stop the scan in case, for instance, you misspelled the
  68. name.  Note that the technique is simple, and is not for-
  69. giving of misspelled names.
  70.  
  71. The algorithm, in BASIC this is:
  72.     KEY=0
  73.     FOR I=1 TO LEN(KEY$) STEP 2
  74.     KEY = 2*KEY + ASC(MID$(KEY$,I,1))
  75.     NEXT I
  76.     KEY = KEY- FILE.SIZE*INT(KEY/FILE.SIZE)
  77.     IF KEY = 0 THEN KEY = 1
  78. ------------------------------------------------------------
  79. The file currently has the following fields in the record:
  80.  
  81. SORT:    A 4 byte field on which the file is sorted, to
  82.     be in alpha sequence.  This means that you do
  83.     not store the file as 'lastname,firstname'
  84.     which is very 'computeristic' and 'impersonal'.
  85.     instead, you key in the name in it's natural
  86.     form, then use the 4 byte SORT field
  87.     for sorting.  For example, if the name is
  88.     James R. Smith, then the sort field would be
  89.     keyed in as SMIT.
  90.  
  91. NAME:    The person's 'natural' name, i.e. first name first.
  92.     Remember BASIC won't allow commas,
  93.     so don't key in J. SMITH, JR. but rather
  94.     J. SMITH JR.
  95.  
  96. ORGANIZATION:    This field is normally blank, but is provided
  97.     when a 4-line address is required.  When
  98.     adding a person, BASIC/E will not accept
  99.     a totally blank input, so 1 blank must be keyed
  100.     when ORGANIZATION is not present.
  101.  
  102. STREET:    The street address
  103.  
  104. CITY:    The city AND state.  Since BASIC will not
  105.     allow a comma in an input line, simply use
  106.     a space after the city, such as:
  107.             CHICAGO IL
  108.     I originally considered putting STATE as a
  109.     separate field, but BASIC/E files use quotes
  110.     around each field, and separate fields by
  111.     commas.  Thereore, a 2 byte state field would
  112.     take 5 bytes.  There just wasn't sufficient
  113.     room in a 128 byte record.  (Although recall
  114.     that I now realize the record length does not
  115.     have to be restricted to 128 bytes.
  116.  
  117. ZIP:    5 byte numeric zip code
  118.  
  119. PHONE:    10 digits, with parenthesis, spaces, and dash, as:
  120.     (312) 555-1212
  121.  
  122. COMPUTER:    A 5 byte field used to keep track of the 
  123.     computer owned, such as A8800, IMSAI, DGZ80, etc.
  124.  
  125. PAID:    A 2 byte field showing when membership is again due,
  126.     in the form YYMM such as 7809
  127.  
  128. TYPE:    A 1 byte 'type of member' field.  Currently used:
  129.     G    Group (another computer club)
  130.     M    Magazine
  131.     H    Hobbyist
  132.     V    Vendor
  133.  
  134.     These are arbitrary values, however the REPORT
  135.     program, when printing name tags for a meeting,
  136.     will not print tags for type G or type M.
  137.  
  138. --------------------PREFORMAT PROGRAM--------------------
  139.  
  140. This program preformats the file.  It writes records
  141. with a '0' flag byte, i.e. empty records.  From then
  142. on, the Maint program is used to add, change, and delete
  143. members of the file.
  144.  
  145. ------------------MAINTENANCE PROGRAM--------------------
  146.  
  147. This program maintains the file.  It has the following
  148. commands implemented to do so:
  149.  
  150. MACRO:    Allows issuing a string of up to 10
  151.     commands, over and over.  Useful for
  152.     doing such things as scanning the
  153.     file for a certain field
  154.     value, then changing the value,
  155.     and doing it over and over.
  156.     FORMAT:    MACRO
  157.     You will be prompted for input.
  158.     When running in MACRO mode, a DEL
  159.     from the keyboard will stop execution
  160.  
  161. HELP:    Prints a summary of the commands
  162.     available.
  163.  
  164. FIND:    This is the ONLY command which
  165.     accesses the file thru the randomizing routine.
  166.     FORMAT:  FIND name   where name is the
  167.     exactly spelled name of a person in the file.
  168.     EXAMPLE: FIND WARD CHRISTENSEN
  169.     The name is arithmetically hashed to a record
  170.     number.  The file is scanned from that record
  171.     number forward (wraps from end to beginning)
  172.     until a matching name is found.  You can press
  173.     DEL at any time to stop the scan and return
  174.     to command mode.
  175.  
  176. READ:    This command is used to read a particular
  177.     record in the file by record number.  It is
  178.     not frequently needed.
  179.     FORMAT:  READ recno
  180.     EXAMPLE: READ 20
  181.  
  182. DUMP:    This command sequentially dumps the file
  183.     from a given starting record number.
  184.     Press DEL to stop the dumping.
  185.     FORMAT: DUMP recno
  186.     EXAMPLE: DUMP 155
  187.  
  188. C:    This command is used to change the contents
  189.     of a field in the record most recently read
  190.     into memory.  It can change an entire field
  191.     by replacing it with a new value, or can do
  192.     a character string replacement such as to correct
  193.     a misspelled field value.
  194.     FORMAT: C fieldname newvalue
  195.     EXAMPLE: C NAME J. SMITH
  196.     The field name can be abbreviated.  The
  197.     table of field names in the program will
  198.     be searched until the first 'n' letters
  199.     of a name match the 'n' letters in the field name
  200.     used in the C command.  N is therefore a sufficient
  201.     abbreviation for NAME, but C will find CITY
  202.     and not COMPUTER, so use CO for COMPUTER.
  203.  
  204.     FORMAT: C fieldname /oldvalue/newvalue/
  205.     EXAMPLE: C N /TIANSON/TENSEN/
  206.     The above example would change WARD CHRISTIANSON
  207.     to WARD CHRISTENSEN.  The closing '/' is
  208.     optional.
  209.  
  210.     NOTE that a flag is set in the program, requiring
  211.     you to do an UPDATE command (or WRITE if you did
  212.     an ADD).  I added this because I found some times
  213.     I would forget.  You can cancel the flag with
  214.     the command: CANCEL
  215.  
  216. LIST:    Used to list the contents of the record
  217.     most recently read into memory.
  218.     FORMAT: LIST
  219.  
  220. ?:    This command is used to scan the disk
  221.     from the current position (the last record
  222.     number read) for any field matching a value
  223.     placed in the command.  Only the first 'n'
  224.     characters of the field on disk are matched,
  225.     where 'n' is the number of characters given
  226.     in the command.  The match always starts
  227.     with the leftmost byte of the field.
  228.     FORMAT: ? fieldname value
  229.     EXAMPLE: ? CO ALTAIR
  230.     The contents of each field read will be
  231.     displayed whether or not it matches.
  232.     Use DEL to stop the scan.
  233.  
  234. F:    This command (Find) works like ?
  235.     except that the field read from disk is scanned
  236.     for a match at each position in the field, not
  237.     just the first.  For example, if everyone
  238.     in the club having a Z-80 computer has
  239.     a 'Z' somewhere in their COMPUTER field,
  240.     but it differs from user to user (such as DGZ80,
  241.     IMSZ8, Z2, etc.) then you could find
  242.     someone with a Z80 by saying:
  243.     F CO Z
  244.     FORMAT: F fieldname charstring
  245.     EXAMPLE: F CI IL
  246.     NOTE this runs 'lots' slower than '?' because
  247.     of multiple comparisons being done on each
  248.     field.
  249.  
  250. WRITE:    This command is used to randomize and write
  251.     a record to disk.  It is used after the ADD
  252.     command, or when changing someones name.
  253.     See "CHANGING A NAME" below.
  254.     FORMAT: WRITE
  255.  
  256. ADD:    This command is used to add a new name
  257.     to the file.  You will be prompted for each
  258.     field.  If a field is blank, you cannot just
  259.     press C/R because BASIC/E will give you a
  260.     WARNING II message.  Therefore, put in 1 space
  261.     the press return.
  262.  
  263.     If you want to stop the ADD function, such as
  264.     if you realize you made a mistake and don't
  265.     want to go back and change it with the C function,
  266.     type QUIT in response to any input.
  267.     FORMAT: ADD
  268.     You will be prompted for the input.
  269.     NOTE the record is only built in a matrix
  270.     in memory, and that the WRITE function must be
  271.     executed to actually write the name to disk.
  272.     This allows using the C and LIST command to
  273.     verify and change the contents of the record
  274.     before writing it to disk.  A flag is set in
  275.     the program, to help remind you to write it back.
  276.     The only functions you will be able to execute
  277.     are those which will not destroy the record:
  278.         C
  279.         LIST
  280.         VERIFY
  281.         WRITE
  282.     If you want to cancel the record, resetting
  283.     the flag, use the command: CANCEL
  284.     Also, see "CHANGING A NAME" below.
  285.  
  286.     There is one problem when adding records to
  287.     the file, and that is that you cannot add a record
  288.     which exceeds the record length.  BASIC/E will
  289.     unforgivingly issue an ER error and drop you
  290.     back into CP/M.  Due to the preallocation of the file,
  291.     however, this is not serious as only the record
  292.     currently being added is lost.  A 'lot' of
  293.     code could be added to add up the lengths of each
  294.     field, plus 1 for the flag, plus 3 for each field
  295.     (the quotes around the value, plus the comma separating
  296.     values) but I just decided not to bother.
  297.  
  298.  
  299. ERASE:    This command will erase the record most
  300.     recently read.  The record will still remain in memory
  301.     such that a WRITE command could be used to write
  302.     it back to disk, as would be required with a name
  303.     change.
  304.     FORMAT: ERASE
  305.  
  306. UPDATE:    This command writes a record BACK to disk, and
  307.     is used following a FIND or READ command.  Npote
  308.     that if used after an ADD command, you will overlay
  309.     the wrong record.  You must use WRITE after ADD.
  310.     FORMAT: UPDATE
  311.  
  312. FREE:    Used to determine how much memory is left
  313.     during the running of the MAINT program.  Used
  314.     during program development to see if room remained
  315.     to add more function
  316.  
  317. PURGE:    Used to purge the file of records whose memberships
  318.     have expired.  The file is scanned for a matching
  319.     date (PAID field) as given in the command, and
  320.     all records matching are deleted.  It is suggested
  321.     the printer be turned on before issuing the PURGE
  322.     command to keep an 'audit trail' of who was purged.
  323.     FORMAT: PURGE yymm
  324.     EXAMPLE: PURGE 7709
  325.  
  326. CANCEL: Cancels the flags set in the program which require
  327.     you to WRITE after an ADD, or UPDATE after FINDing
  328.     a record and Changing it.
  329.  
  330. END:    Used to end execution.  Control-C can also
  331.     be used, as the file doesn't have to be closed,
  332.     because it is pre-allocated.
  333.  
  334. CHANGING A NAME: Since the file is written by randomizing
  335.     the name field, you cannot simply FIND someone, use C
  336.     to change their name, and UPDATE the record.  Why?
  337.     Next time you want to find them, you will type
  338.     FIND newname and will randomize to it.  However,
  339.     the name is stored under the randomizing of the
  340.     OLD name.  Therefore, after changing a name,
  341.     issue an ERASE to get rid of the old record, then
  342.     WRITE to re-randomize the new name and write the
  343.     record.  This works because ERASE doesn't change
  344.     the contents of the record maintained in the
  345.     matrix in memory.
  346. --------------------SORT PROGRAM--------------------
  347.  
  348. The sort program is an assembler program which reads the
  349. mailing list, extracting the first 5 characters of a
  350. specified field, and doing a memory-resident bubble sort
  351. of the field and it's correspoiding record number.
  352. It then writes an ASCII file of just the record numbers.
  353. It is currently set up for 3 byte record numbers,
  354. but may be easily changed for 4 byte record numbers.
  355. (Comments in SORT.ASM show how).  The file of record
  356. numbers is then used in the REPORT program to process the
  357. file in the sequence asked for.  The index file is read
  358. into a table rather than accessed sequentially, for speed.
  359.  
  360.     FORMAT: SORT infilename outfilename fieldnumber
  361.     EXAMPLE: SORT CACHE.FIL NAME 1
  362.  
  363.     Note that 'outfilename' can be any valid
  364.     CP/M file name.
  365.  
  366.     The field numbers currently implemented are as
  367.     follows:
  368.  
  369.     1.    SORT
  370.     2.    NAME
  371.     3.    ORGANIZATION
  372.     4.    STREET
  373.     5.    CITY
  374.     6.    ZIP
  375.     7.    PHONE
  376.     8.    COMPUTER
  377.     9.    PAID
  378.     10.    TYPE
  379.  
  380. --------------------REPORT PROGRAM--------------------
  381.  
  382. The report program is used to produce listings, mailing
  383. labels, name tags, meeting announcement letters, listings
  384. of expiring memberships, etc.  The listings can be either
  385. 130 columns wide, or can be printed with 2 lines for each
  386. person, on 8.5 wide paper.  Name tags and Labels may be
  387. printed 3-up or 4-up, with variable width and height labels.
  388. It is currently written for a Centronics 101 with the feature
  389. of expanding the width of characters when you print CHR$(14).
  390. If you do not have this facility, the program will have
  391. to be changed.  Note this affects only the printing of name
  392. tags (which print the name and computer double width) and
  393. the title of the report.  Also the program prints CHR$(11)
  394. (Vertical Tab) to eject the paper to a new page.  If you
  395. do not have this feature, you will have to insert the proper
  396. number of null print statements to cause an eject to the
  397. next page.  Some printers may require CHR$(12) (Forms Feed)
  398. instead.
  399.  
  400. Since there is not currently a way to turn on the printer
  401. from BASIC/E, this program requires a CBIOS with manual
  402. printer control, such as thru a sense switch, to operate
  403. correctly.  The program prompts you with 'press linefeed'
  404. which then allows you time to turn on the sense switch.
  405. When it sees the linefeed on  the keyboard port, it starts
  406. the listing.  When the listing is complete, it awaits a
  407. 'del' from the keyboard before continuing.  This again gives
  408. you time to turn off the sense switch controlling the printer.
  409. Randy Suess of the Chicago Area Computer Hobbyist Exchange
  410. suggested an alternative if you do not have sense switch
  411. control, and that is to input a dummy message, which you
  412. can then type 'space, control-p' in reply to. This will
  413. turn on the printer.  You will have trouble with the end
  414. of the report or labels, because you cannot shut it off
  415. again, but that is not serious.  In running the report program,
  416. I was sorry to see how slow it accessed the disk.  I then
  417. realized that the file was being closed and opened each
  418. time the random access took it into another extent.  I tried
  419. to find a solution, and found one: I opened a separate 'file'
  420. for each extent.  Then, I divided reads such that reads
  421. to the first extent read via the first file, to the second
  422. extent via the second file, etc.  After a few accesses,
  423. each 'file' was open for it's own extent, and performance
  424. was quite good.  The commands currently implemented in the
  425. program are: 
  426.  
  427. HELP:    Prints a summary of commands available.
  428.  
  429. INDEX:    Names the file of record numbers (output
  430.     from the SORT program), and causes the file to
  431.     be read into memory.
  432.  
  433.     FORMAT: INDEX filename
  434.     EXAMPLE: INDEX NAME.FIL
  435.  
  436. POSITION: Positions the file to a particular
  437.     record relative to the INDEX file which has
  438.     been read.  Used to restart a listing, or
  439.     to scan for starting the listing in the middle.
  440.     It can position either by record number, or
  441.     by the contents of the field sorted upon.
  442.  
  443.     FORMAT: POSITION recno
  444.     EXAMPLE: POSITION 55
  445.             or
  446.     FORMAT: POSITION fieldname fieldvalue
  447.     EXAMPLE: POSITION ZIP 60419
  448.  
  449.     In the first example, the file is positioned
  450.     to the 55th record in the index
  451.     table.  In the second example, the file is
  452.     sequentially read (from whatever position is
  453.     currently is at) until a zip matching 60419 is
  454.     found.  You may find it useful to use the
  455.     first format to get 'close' because positioning by
  456.     record number is fast, then use the position by
  457.     field value until the exact one is found.
  458.     NOTE that it is somewhat meaningless to POSITION
  459.     on a field which is not the sort field, as the
  460.     field being positioned upon is not read in order.
  461.  
  462.     NOTE if you stop the listing, then want to
  463.     restart it from the beginning, you must
  464.     issue POSITION 1 to start over again.
  465.  
  466. TITLE:    This command is used to supply a title
  467.     for the listing.
  468.  
  469.     FORMAT: TITLE any character string
  470.     EXAMPLE: TITLE SEPTEMBER MEETING ALPHA LISTING
  471.  
  472. PRINT:    This command is used to initiate the printing
  473.     of a listing.  The listing will be either:
  474.     72 columns wide if width < 80, or
  475.     132 columns wide if width > 79.
  476.     Other than being less than or greater than 80,
  477.     the setting of width does not effect the output
  478.     of the PRINT function.
  479.     FORMAT: PRINT
  480.  
  481. WIDTH:    Sets print width.  The meaning of the width
  482.     depends upon the function being asked for:
  483.  
  484.     TAGS or LABELS - the WIDTH setting is the actual
  485.     number of characters wide the labels are.
  486.  
  487.     PRINT - the WIDTH setting determines the report width
  488.     but only as to whether width is <80 or >79.
  489.  
  490.     FORMAT: WIDTH nn
  491.     EXAMPLE: WIDTH 36
  492.  
  493. LENGTH:    Sets the length of the gummed
  494.     labels used for the LABELS or TAGS function.
  495.     Default is 6 lines long.
  496.  
  497.     FORMAT: LENGTH nn
  498.     EXAMPLE: LENGTH 5
  499.  
  500. TAGS:    Initiates the printing of name tags.
  501.     An algorithm is used to split the first name
  502.     from the last name:  The name is scanned from
  503.     the back until a space is found.  The part
  504.     of the name to the right of the space is now
  505.     considered the last name, and the part to the
  506.     left the first name.  Then, certain 'reasonableness'
  507.     tests are performed:  If the first 2 letters of the
  508.     last name are JR, then the scan continues again
  509.     to the left.  Then, the last few characters of
  510.     the 'first name' are checked to see if they are any
  511.     of the common double word last names, such as
  512.     ' VAN' or ' DE' or ' DI' or ' MC'.  If so,
  513.     scanning continues again.  You might have to change
  514.     this algorithm depending upon the names you encounter,
  515.     such as 3 word names (VAN DER HEIDE) or VON, or
  516.     the myriad of names I have not yet dreamed of.
  517.     FORMAT: TAGS
  518.  
  519. LABELS:    This initiates the printing of mailing labels.
  520.     It uses the settings of WIDTH, LENGTH, and UP
  521.     to determine the physical format.
  522.  
  523.     A typical label is printed as follows:
  524.  
  525.         FERN P. DOCK        7709
  526.         HENWAY CORPORATION
  527.         BOX 1234
  528.         FERNWOOD OH        12345
  529.  
  530.     (What's a HENWAY?   about 3 pounds).
  531.  
  532.     Note the PAID date is printed in the upper
  533.     right of the label.
  534.     FORMAT: LABELS
  535.  
  536. CHECK:    This function checks the setting of the
  537.     various variables, such as what record
  538.     you are positioned to, whether an index has
  539.     been read or not, and the current settings
  540.     of: WIDTH, LENGTH, etc.
  541.     FORMAT: CHECK
  542.  
  543. UP:    This is used to cause printing of LABELS
  544.     or name TAGS 3-UP or 4-UP.  (UP referring to
  545.     how many labels are printed side-by-side.
  546.     The program has not been generalized to handle
  547.     1-up or 2-up.
  548.  
  549.     FORMAT: UP n
  550.     EXAMPLE: UP 3
  551.  
  552.     3 or 4 are the only values supported.
  553.  
  554. LOAD filename.filetype: Used to load a letter file
  555.     into memory.  The letter file consists of up to
  556.     40 lines.  The following command is used to
  557.     print the letters (such as meeting announcements)
  558.  
  559. LETTER:    Causes a letter, contained in a matrix in memory
  560.     (loaded there via the LOAD command) to be printed.
  561.     The index table is used to determine the order
  562.     that the letters are written in (typically ZIP).
  563.     You must use the LOAD command to read the letter,
  564.     and the INDEX command to load the index (created
  565.     by the SORT program) before running LETTER.
  566.  
  567.     The format of the letter is as follows:  The person's
  568.     name is printed, then the letter.  Then a forms feed
  569.     (chr$(12)) is printed, to skip to the BOTTOM THIRD
  570.     of the page.  The return address is printed, then
  571.     "ADDRESS CORRECTION REQUESTED", then the name and
  572.     address from the file, and finally at the bottom
  573.     of the page, a membership status line.  NOTE that
  574.     this means that you MUST set up your printer so
  575.     that forms feed feeds to the BOTTOM THIRD of the
  576.     paper.  This is for efficiency, as the biggest skip
  577.     done in the letter is from the end of the letter
  578.     to the 'postal letter' part.
  579.  
  580. END:    Causes ending of program execution.
  581.  
  582. --------------------MISC. COMMENTS--------------------
  583.  
  584. Use abbreviations to keep the width of each field
  585. within the width allowed in the report program,
  586. or else the TAB to the next field will cause an extra
  587. line to be printed.  This will offset the line counter,
  588. and may cause the program to print a page which is too
  589. long.
  590.  
  591.  
  592. -------------------RESIZE PROGRAM---------------------
  593.  
  594. The RESIZE program converts the file from one size to
  595. another.  It reads the old file sequentially, and randomizes
  596. and writes the new file.  It asks for the filenames
  597. during execution, so the program need not be recompiled
  598. to change names.  It need only be recompiled if changing
  599. fields, or record size from the default 128.
  600.  
  601. The program will allow A: and B: specifications for
  602. the file, so the new size file may be built on a disk other
  603. than the one the original one was on.
  604.  
  605. N-O-T-E that the mailing list file is a standard CP/M
  606. file, and may therefore be processed with the 'PIP'
  607. utility.
  608.