home *** CD-ROM | disk | FTP | other *** search
- ############################################################################
- #
- # File: labels.icn
- #
- # Subject: Program to format mailing labels
- #
- # Author: Ralph E. Griswold
- #
- # Date: December 30, 1991
- #
- ###########################################################################
- #
- # This program produces labels using coded information taken
- # from the input file. In the input file, a line beginning with #
- # is a label header. Subsequent lines up to the next header or
- # end-of-file are accumulated and output so as to be centered hor-
- # izontally and vertically on label forms. Lines beginning with *
- # are treated as comments and are ignored.
- #
- # Options: The following options are available:
- #
- # -c n Print n copies of each label.
- #
- # -s s Select only those labels whose headers contain a char-
- # acter in s.
- #
- # -t Format for curved tape labels (the default is to format
- # for rectangular mailing labels).
- #
- # -w n Limit line width to n characters. The default width is
- # 40.
- #
- # -l n Limit the number of printed lines per label to n. The
- # default is 8.
- #
- # -d n Limit the depth of the label to n. The default is 9 for
- # rectangular labels and 12 for tape labels (-t).
- #
- # Options are processed from left to right. If the number of
- # printed lines is set to a value that exceeds the depth of the
- # label, the depth is set to the number of lines. If the depth is
- # set to a value that is less than the number of printed lines, the
- # number of printed lines is set to the depth. Note that the order
- # in which these options are specified may affect the results.
- #
- # Printing Labels: Label forms should be used with a pin-feed pla-
- # ten. For mailing labels, the carriage should be adjusted so that
- # the first character is printed at the leftmost position on the
- # label and so that the first line of the output is printed on the
- # topmost line of the label. For curved tape labels, some experi-
- # mentation may be required to get the text positioned properly.
- #
- # Diagnostics: If the limits on line width or the number of lines
- # per label are exceeded, a label with an error message is written
- # to standard error output.
- #
- ############################################################################
- #
- # Links: options, buffer
- #
- # See also: address.doc, adllist.icn, adlfiltr.icn, adlcount.icn,
- # adlcheck.icn, zipsort.icn
- #
- ############################################################################
-
- link options, buffer
-
- global lsize, repet, llength, ldepth, opts, selectors
-
- procedure main(args)
- local y, i, line
-
- selectors := '#'
- lsize := 9
- ldepth := 8
- llength := 40
- repet := 1
- i := 0
- opts := options(args,"c+d+l+s:tw+")
- selectors := cset(\opts["s"])
- if \opts["t"] then {
- lsize := 12
- if ldepth > lsize then ldepth := lsize
- }
- llength := nonneg("w")
- if ldepth := nonneg("l") then {
- if lsize < ldepth then lsize := ldepth
- }
- if lsize := nonneg("d") then {
- if ldepth > lsize then ldepth := lsize
- }
- repet := nonneg("c")
-
- while line := Read() do
- line ? {
- if any('#') & upto(selectors) then nextlbl()
- }
-
- end
-
- # Obtain next label
- #
- procedure nextlbl()
- local label, max, line
- label := [Read()]
- max := 0
- while line := Read() do {
- if line[1] == "*" then next
- if line[1] == "#" then {
- PutBack(line)
- break
- }
- put(label,line)
- max <:= *line
- if *label > ldepth then {
- error(label[1],1)
- return
- }
- if max > llength then {
- error(label[1],2)
- return
- }
- }
- every 1 to repet do format(label,max)
- end
-
- # Format a label
- #
- procedure format(label,width)
- local j, indent
- indent := repl(" ",(llength - width) / 2)
- j := lsize - *label
- every 1 to j / 2 do write()
- every write(indent,!label)
- every 1 to (j + 1) / 2 do write()
- end
-
- # Issue label for an error
- #
- procedure error(name,type)
- static badform
- initial badform := list(lsize)
- case type of {
- 1: badform[3] := " **** too many lines"
- 2: badform[3] := " **** line too long"
- }
- badform[1] := name
- every write(&errout,!badform)
- end
-
- procedure nonneg(s)
- s := \opts[s] | fail
- return 0 < integer(s) | stop("-",s," needs postive numeric parameter")
- end
-