checklinks.awk revision 1.1.1.4 1 # Check links in tz tables.
2
3 # Contributed by Paul Eggert. This file is in the public domain.
4
5 BEGIN {
6 # Special marker indicating that the name is defined as a Zone.
7 # It is a newline so that it cannot match a valid name.
8 # It is not null so that its slot does not appear unset.
9 Zone = "\n"
10 }
11
12 /^Z/ {
13 if (defined[$2]) {
14 if (defined[$2] == Zone) {
15 printf "%s: Zone has duplicate definition\n", $2
16 } else {
17 printf "%s: Link with same name as Zone\n", $2
18 }
19 status = 1
20 }
21 defined[$2] = Zone
22 }
23
24 /^L/ {
25 if (defined[$3]) {
26 if (defined[$3] == Zone) {
27 printf "%s: Link with same name as Zone\n", $3
28 } else if (defined[$3] == $2) {
29 printf "%s: Link has duplicate definition\n", $3
30 } else {
31 printf "%s: Link to both %s and %s\n", $3, defined[$3], $2
32 }
33 status = 1
34 }
35 if (backcheck && FILENAME != backcheck && $3 != "GMT") {
36 printf "%s: Link should be in '%s'\n", $3, backcheck
37 status = 1
38 }
39 if ($4 == "#=") {
40 shortcut[$5] = $3
41 }
42 used[$2] = 1
43 defined[$3] = $2
44 }
45
46 END {
47 for (tz in used) {
48 if (defined[tz] != Zone) {
49 if (!defined[tz]) {
50 printf "%s: Link to nowhere\n", tz
51 status = 1
52 } else if (DATAFORM != "vanguard") {
53 printf "%s: Link to link\n", tz
54 status = 1
55 }
56 }
57 }
58 for (tz in shortcut) {
59 if (defined[shortcut[tz]] != defined[tz]) {
60 target = (!defined[tz] ? "absence" \
61 : defined[tz] == "\n" ? "zone" \
62 : defined[tz])
63 printf "%s: target %s disagrees with %s's target %s\n", \
64 tz, target, shortcut[tz], defined[shortcut[tz]]
65 status = 1
66 }
67 }
68
69 exit status
70 }
71