diff options
Diffstat (limited to 'ipl/progs/labels.icn')
-rw-r--r-- | ipl/progs/labels.icn | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/ipl/progs/labels.icn b/ipl/progs/labels.icn new file mode 100644 index 0000000..26fdfa7 --- /dev/null +++ b/ipl/progs/labels.icn @@ -0,0 +1,160 @@ +############################################################################ +# +# File: labels.icn +# +# Subject: Program to format mailing labels +# +# Author: Ralph E. Griswold +# +# Date: December 30, 1991 +# +############################################################################ +# +# This file is in the public domain. +# +############################################################################ +# +# 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, io +# +############################################################################ +# +# See also: address.doc, adllist.icn, adlfiltr.icn, adlcount.icn, +# adlcheck.icn, zipsort.icn +# +############################################################################ + +link options, io + +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 |