############################################################################
#
#	File:     adlcheck.icn
#
#	Subject:  Program to check for bad address list data
#
#	Author:   Ralph E. Griswold
#
#	Date:     November 19, 1997
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#    This program checks address lists for correctness.
#
#    There are five options:
#
#	-s	Check state (U.S. labels only)
#	-z	Check ZIP code (U.S. labels only)
#	-c	Check country name (a very heuristic check)
#	-a	Check all of the above
#	-d	Report addresses that exceed "standard dimensions" for labels:
#		   40 character line length, 8 lines per entry
#
############################################################################
#
#  See also: address.doc, adlcount.icn, adlfiltr.icn, adllist.icn,
#     adlsort,icn, labels.icn
#
#  Links: adlutils, options
#
############################################################################

link adlutils, options

procedure main(args)
   local opts, choice, item, badchar, print, states, i, line, dim, add

   states := set(["AK", "AL", "AR", "AS", "AZ", "CA", "CO", "CT", "DC",
      "DE", "FL", "FM", "GA", "GU", "HI", "IA", "ID", "IL", "IN", "KS",
      "KY", "LA", "MA", "MD", "ME", "MH", "MI", "MN", "MO", "MP", "MS",
      "MT", "NC", "ND", "NE", "NH", "NJ", "NM", "NV", "NY", "OH", "OK",
      "ON", "OR", "PA", "PR", "PW", "RI", "SC", "SD", "TN", "TX", "UT",
      "VA", "VT", "WA", "WI", "WV", "WY"])

   print := ""

   badchar := ~&ucase -- ' .'		# very heuristic country name check

   opts := options(args,"acszd")
   if \opts["a"] then {			# if -a, do all
      opts["a"] := &null
      every opts[!"csz"] := 1
      }
   if \opts["d"] then dim := write(1)		# dimension check

   while add := nextadd() do {
      add.text ? {
         i := 0
         while line := tab(upto('\n') | 0) do {
            i +:= 1
            if *line > 40 then print ||:= "o"
            move(1) | break
            }
         if i > 8 then print ||:= "o"
         }

      every \opts[choice := !"csz"] do
         case choice of {
         "c":  {			# check country name
            get_country(add) ? {
               if upto(badchar) then {
                  print ||:= choice
                  }
               }
            }
         "s":  {			# check state
            if not member(states,get_state(add)) then {
               print ||:= choice
               }
            }
         "z":  {
            if get_zipcode(add) == "9999999999" then {
               print ||:= choice
               }
            }
         }
      if *print > 0 then {
         every choice := !print do
            write("*** ",case choice of {
               "c":  "bad country name"
               "s":  "bad state abbreviation"
               "z":  "bad ZIP code"
               "o":  \dim & "size exceeds label dimensions"
               })
         write()
         writeadd(add)
         print := ""
         }
   }

end
