xref: /freebsd/contrib/tzdata/zishrink.awk (revision 2723c7ff)
18d7edd17SPhilip Paeps# Convert tzdata source into a smaller version of itself.
28d7edd17SPhilip Paeps
38d7edd17SPhilip Paeps# Contributed by Paul Eggert.  This file is in the public domain.
48d7edd17SPhilip Paeps
58d7edd17SPhilip Paeps# This is not a general-purpose converter; it is designed for current tzdata.
68d7edd17SPhilip Paeps# 'zic' should treat this script's output as if it were identical to
78d7edd17SPhilip Paeps# this script's input.
88d7edd17SPhilip Paeps
989abb9f8SPhilip Paeps# Record a hash N for the new name NAME, checking for collisions.
108d7edd17SPhilip Paeps
1189abb9f8SPhilip Paepsfunction record_hash(n, name)
128d7edd17SPhilip Paeps{
1389abb9f8SPhilip Paeps  if (used_hashes[n]) {
1489abb9f8SPhilip Paeps    printf "# ! collision: %s %s\n", used_hashes[n], name
1589abb9f8SPhilip Paeps    exit 1
1689abb9f8SPhilip Paeps  }
1789abb9f8SPhilip Paeps  used_hashes[n] = name
1889abb9f8SPhilip Paeps}
198d7edd17SPhilip Paeps
2089abb9f8SPhilip Paeps# Return a shortened rule name representing NAME,
2189abb9f8SPhilip Paeps# and record this relationship to the hash table.
228d7edd17SPhilip Paeps
232865ab3fSPhilip Paepsfunction gen_rule_name(name, \
242865ab3fSPhilip Paeps		       n)
2589abb9f8SPhilip Paeps{
269f9fc6bbSPhilip Paeps  # Use a simple mnemonic: the first two letters.
2789abb9f8SPhilip Paeps  n = substr(name, 1, 2)
2889abb9f8SPhilip Paeps  record_hash(n, name)
2989abb9f8SPhilip Paeps  # printf "# %s = %s\n", n, name
3089abb9f8SPhilip Paeps  return n
3189abb9f8SPhilip Paeps}
3289abb9f8SPhilip Paeps
332865ab3fSPhilip Paepsfunction prehash_rule_names( \
342865ab3fSPhilip Paeps			    name)
3589abb9f8SPhilip Paeps{
3689abb9f8SPhilip Paeps  # Rule names are not part of the tzdb API, so substitute shorter
3789abb9f8SPhilip Paeps  # ones.  Shortening them consistently from one release to the next
3889abb9f8SPhilip Paeps  # simplifies comparison of the output.  That being said, the
3989abb9f8SPhilip Paeps  # 1-letter names below are not standardized in any way, and can
4089abb9f8SPhilip Paeps  # change arbitrarily from one release to the next, as the main goal
4189abb9f8SPhilip Paeps  # here is compression not comparison.
4289abb9f8SPhilip Paeps
4389abb9f8SPhilip Paeps  # Abbreviating these rules names to one letter saved the most space
4489abb9f8SPhilip Paeps  # circa 2018e.
4589abb9f8SPhilip Paeps  rule["Arg"] = "A"
4689abb9f8SPhilip Paeps  rule["Brazil"] = "B"
4789abb9f8SPhilip Paeps  rule["Canada"] = "C"
4889abb9f8SPhilip Paeps  rule["Denmark"] = "D"
4989abb9f8SPhilip Paeps  rule["EU"] = "E"
5089abb9f8SPhilip Paeps  rule["France"] = "F"
5189abb9f8SPhilip Paeps  rule["GB-Eire"] = "G"
5289abb9f8SPhilip Paeps  rule["Halifax"] = "H"
5389abb9f8SPhilip Paeps  rule["Italy"] = "I"
5489abb9f8SPhilip Paeps  rule["Jordan"] = "J"
5589abb9f8SPhilip Paeps  rule["Egypt"] = "K" # "Kemet" in ancient Egyptian
5689abb9f8SPhilip Paeps  rule["Libya"] = "L"
5789abb9f8SPhilip Paeps  rule["Morocco"] = "M"
5889abb9f8SPhilip Paeps  rule["Neth"] = "N"
5989abb9f8SPhilip Paeps  rule["Poland"] = "O" # arbitrary
6089abb9f8SPhilip Paeps  rule["Palestine"] = "P"
6189abb9f8SPhilip Paeps  rule["Cuba"] = "Q" # Its start sounds like "Q".
6289abb9f8SPhilip Paeps  rule["Russia"] = "R"
6389abb9f8SPhilip Paeps  rule["Syria"] = "S"
6489abb9f8SPhilip Paeps  rule["Turkey"] = "T"
6589abb9f8SPhilip Paeps  rule["Uruguay"] = "U"
6689abb9f8SPhilip Paeps  rule["Vincennes"] = "V"
6789abb9f8SPhilip Paeps  rule["Winn"] = "W"
6889abb9f8SPhilip Paeps  rule["Mongol"] = "X" # arbitrary
6989abb9f8SPhilip Paeps  rule["NT_YK"] = "Y"
7089abb9f8SPhilip Paeps  rule["Zion"] = "Z"
7189abb9f8SPhilip Paeps  rule["Austria"] = "a"
7289abb9f8SPhilip Paeps  rule["Belgium"] = "b"
7389abb9f8SPhilip Paeps  rule["C-Eur"] = "c"
7489abb9f8SPhilip Paeps  rule["Algeria"] = "d" # country code DZ
7589abb9f8SPhilip Paeps  rule["E-Eur"] = "e"
7689abb9f8SPhilip Paeps  rule["Taiwan"] = "f" # Formosa
7789abb9f8SPhilip Paeps  rule["Greece"] = "g"
7889abb9f8SPhilip Paeps  rule["Hungary"] = "h"
7989abb9f8SPhilip Paeps  rule["Iran"] = "i"
8089abb9f8SPhilip Paeps  rule["StJohns"] = "j"
8189abb9f8SPhilip Paeps  rule["Chatham"] = "k" # arbitrary
8289abb9f8SPhilip Paeps  rule["Lebanon"] = "l"
8389abb9f8SPhilip Paeps  rule["Mexico"] = "m"
8489abb9f8SPhilip Paeps  rule["Tunisia"] = "n" # country code TN
8589abb9f8SPhilip Paeps  rule["Moncton"] = "o" # arbitrary
8689abb9f8SPhilip Paeps  rule["Port"] = "p"
8789abb9f8SPhilip Paeps  rule["Albania"] = "q" # arbitrary
8889abb9f8SPhilip Paeps  rule["Regina"] = "r"
8989abb9f8SPhilip Paeps  rule["Spain"] = "s"
9089abb9f8SPhilip Paeps  rule["Toronto"] = "t"
9189abb9f8SPhilip Paeps  rule["US"] = "u"
9289abb9f8SPhilip Paeps  rule["Louisville"] = "v" # ville
9389abb9f8SPhilip Paeps  rule["Iceland"] = "w" # arbitrary
9489abb9f8SPhilip Paeps  rule["Chile"] = "x" # arbitrary
9589abb9f8SPhilip Paeps  rule["Para"] = "y" # country code PY
9689abb9f8SPhilip Paeps  rule["Romania"] = "z" # arbitrary
9789abb9f8SPhilip Paeps  rule["Macau"] = "_" # arbitrary
9889abb9f8SPhilip Paeps
9989abb9f8SPhilip Paeps  # Use ISO 3166 alpha-2 country codes for remaining names that are countries.
10089abb9f8SPhilip Paeps  # This is more systematic, and avoids collisions (e.g., Malta and Moldova).
10189abb9f8SPhilip Paeps  rule["Armenia"] = "AM"
10289abb9f8SPhilip Paeps  rule["Aus"] = "AU"
10389abb9f8SPhilip Paeps  rule["Azer"] = "AZ"
10489abb9f8SPhilip Paeps  rule["Barb"] = "BB"
10589abb9f8SPhilip Paeps  rule["Dhaka"] = "BD"
10689abb9f8SPhilip Paeps  rule["Bulg"] = "BG"
10789abb9f8SPhilip Paeps  rule["Bahamas"] = "BS"
10889abb9f8SPhilip Paeps  rule["Belize"] = "BZ"
10989abb9f8SPhilip Paeps  rule["Swiss"] = "CH"
11089abb9f8SPhilip Paeps  rule["Cook"] = "CK"
11189abb9f8SPhilip Paeps  rule["PRC"] = "CN"
11289abb9f8SPhilip Paeps  rule["Cyprus"] = "CY"
11389abb9f8SPhilip Paeps  rule["Czech"] = "CZ"
11489abb9f8SPhilip Paeps  rule["Germany"] = "DE"
11589abb9f8SPhilip Paeps  rule["DR"] = "DO"
11689abb9f8SPhilip Paeps  rule["Ecuador"] = "EC"
11789abb9f8SPhilip Paeps  rule["Finland"] = "FI"
11889abb9f8SPhilip Paeps  rule["Fiji"] = "FJ"
11989abb9f8SPhilip Paeps  rule["Falk"] = "FK"
12089abb9f8SPhilip Paeps  rule["Ghana"] = "GH"
12189abb9f8SPhilip Paeps  rule["Guat"] = "GT"
12289abb9f8SPhilip Paeps  rule["Hond"] = "HN"
12389abb9f8SPhilip Paeps  rule["Haiti"] = "HT"
12489abb9f8SPhilip Paeps  rule["Eire"] = "IE"
12589abb9f8SPhilip Paeps  rule["Iraq"] = "IQ"
12689abb9f8SPhilip Paeps  rule["Japan"] = "JP"
12789abb9f8SPhilip Paeps  rule["Kyrgyz"] = "KG"
12889abb9f8SPhilip Paeps  rule["ROK"] = "KR"
12989abb9f8SPhilip Paeps  rule["Latvia"] = "LV"
13089abb9f8SPhilip Paeps  rule["Lux"] = "LX"
13189abb9f8SPhilip Paeps  rule["Moldova"] = "MD"
13289abb9f8SPhilip Paeps  rule["Malta"] = "MT"
13389abb9f8SPhilip Paeps  rule["Mauritius"] = "MU"
13489abb9f8SPhilip Paeps  rule["Namibia"] = "NA"
13589abb9f8SPhilip Paeps  rule["Nic"] = "NI"
13689abb9f8SPhilip Paeps  rule["Norway"] = "NO"
13789abb9f8SPhilip Paeps  rule["Peru"] = "PE"
13889abb9f8SPhilip Paeps  rule["Phil"] = "PH"
13989abb9f8SPhilip Paeps  rule["Pakistan"] = "PK"
14089abb9f8SPhilip Paeps  rule["Sudan"] = "SD"
14189abb9f8SPhilip Paeps  rule["Salv"] = "SV"
14289abb9f8SPhilip Paeps  rule["Tonga"] = "TO"
14389abb9f8SPhilip Paeps  rule["Vanuatu"] = "VU"
14489abb9f8SPhilip Paeps
14589abb9f8SPhilip Paeps  # Avoid collisions.
14689abb9f8SPhilip Paeps  rule["Detroit"] = "Dt" # De = Denver
14789abb9f8SPhilip Paeps
14889abb9f8SPhilip Paeps  for (name in rule) {
14989abb9f8SPhilip Paeps    record_hash(rule[name], name)
15089abb9f8SPhilip Paeps  }
1518d7edd17SPhilip Paeps}
1528d7edd17SPhilip Paeps
1539f9fc6bbSPhilip Paepsfunction make_line(n, field, \
1549f9fc6bbSPhilip Paeps		   f, r)
1559f9fc6bbSPhilip Paeps{
1569f9fc6bbSPhilip Paeps  r = field[1]
1579f9fc6bbSPhilip Paeps  for (f = 2; f <= n; f++)
1589f9fc6bbSPhilip Paeps    r = r " " field[f]
1599f9fc6bbSPhilip Paeps  return r
1609f9fc6bbSPhilip Paeps}
1619f9fc6bbSPhilip Paeps
1622865ab3fSPhilip Paeps# Process the input line LINE and save it for later output.
1638d7edd17SPhilip Paeps
1642865ab3fSPhilip Paepsfunction process_input_line(line, \
1652723c7ffSPhilip Paeps			    f, field, end, n, outline, r, \
1662865ab3fSPhilip Paeps			    linkline, ruleline, zoneline)
1678d7edd17SPhilip Paeps{
1688d7edd17SPhilip Paeps  # Remove comments, normalize spaces, and append a space to each line.
1698d7edd17SPhilip Paeps  sub(/#.*/, "", line)
1708d7edd17SPhilip Paeps  line = line " "
17146bee4edSPhilip Paeps  gsub(/[\t ]+/, " ", line)
1728d7edd17SPhilip Paeps
1732865ab3fSPhilip Paeps  # Abbreviate keywords and determine line type.
1742865ab3fSPhilip Paeps  linkline = sub(/^Link /, "L ", line)
1752865ab3fSPhilip Paeps  ruleline = sub(/^Rule /, "R ", line)
1762865ab3fSPhilip Paeps  zoneline = sub(/^Zone /, "Z ", line)
1778d7edd17SPhilip Paeps
1788d7edd17SPhilip Paeps  # Replace FooAsia rules with the same rules without "Asia", as they
1798d7edd17SPhilip Paeps  # are duplicates.
1808d7edd17SPhilip Paeps  if (match(line, /[^ ]Asia /)) {
1812865ab3fSPhilip Paeps    if (ruleline) return
1828d7edd17SPhilip Paeps    line = substr(line, 1, RSTART) substr(line, RSTART + 5)
1838d7edd17SPhilip Paeps  }
1848d7edd17SPhilip Paeps
1858d7edd17SPhilip Paeps  # Abbreviate times.
1868d7edd17SPhilip Paeps  while (match(line, /[: ]0+[0-9]/))
1878d7edd17SPhilip Paeps    line = substr(line, 1, RSTART) substr(line, RSTART + RLENGTH - 1)
1888d7edd17SPhilip Paeps  while (match(line, /:0[^:]/))
1898d7edd17SPhilip Paeps    line = substr(line, 1, RSTART - 1) substr(line, RSTART + 2)
1908d7edd17SPhilip Paeps
1912865ab3fSPhilip Paeps  # Abbreviate weekday names.
1928d7edd17SPhilip Paeps  while (match(line, / (last)?(Mon|Wed|Fri)[ <>]/)) {
1938d7edd17SPhilip Paeps    end = RSTART + RLENGTH
1948d7edd17SPhilip Paeps    line = substr(line, 1, end - 4) substr(line, end - 1)
1958d7edd17SPhilip Paeps  }
1962865ab3fSPhilip Paeps  while (match(line, / (last)?(Sun|Tue|Thu|Sat)[ <>]/)) {
1978d7edd17SPhilip Paeps    end = RSTART + RLENGTH
1988d7edd17SPhilip Paeps    line = substr(line, 1, end - 3) substr(line, end - 1)
1998d7edd17SPhilip Paeps  }
2008d7edd17SPhilip Paeps
2012865ab3fSPhilip Paeps  # Abbreviate "max", "min", "only" and month names.
2022723c7ffSPhilip Paeps  # Although "max" and "min" can both be abbreviated to just "m",
2032723c7ffSPhilip Paeps  # the longer forms "ma" and "mi" are needed with zic 2023d and earlier.
2042723c7ffSPhilip Paeps  gsub(/ max /, dataform == "vanguard" ? " m " : " ma ", line)
2052723c7ffSPhilip Paeps  gsub(/ min /, dataform == "vanguard" ? " m " : " mi ", line)
2068d7edd17SPhilip Paeps  gsub(/ only /, " o ", line)
2078d7edd17SPhilip Paeps  gsub(/ Jan /, " Ja ", line)
2088d7edd17SPhilip Paeps  gsub(/ Feb /, " F ", line)
2098d7edd17SPhilip Paeps  gsub(/ Apr /, " Ap ", line)
2108d7edd17SPhilip Paeps  gsub(/ Aug /, " Au ", line)
2118d7edd17SPhilip Paeps  gsub(/ Sep /, " S ", line)
2128d7edd17SPhilip Paeps  gsub(/ Oct /, " O ", line)
2138d7edd17SPhilip Paeps  gsub(/ Nov /, " N ", line)
2148d7edd17SPhilip Paeps  gsub(/ Dec /, " D ", line)
2158d7edd17SPhilip Paeps
2168d7edd17SPhilip Paeps  # Strip leading and trailing space.
2178d7edd17SPhilip Paeps  sub(/^ /, "", line)
2188d7edd17SPhilip Paeps  sub(/ $/, "", line)
2198d7edd17SPhilip Paeps
2208d7edd17SPhilip Paeps  # Remove unnecessary trailing zero fields.
2218d7edd17SPhilip Paeps  sub(/ 0+$/, "", line)
2228d7edd17SPhilip Paeps
2238d7edd17SPhilip Paeps  # Remove unnecessary trailing days-of-month "1".
224afb91be3SPhilip Paeps  if (match(line, /[A-Za-z] 1$/))
2258d7edd17SPhilip Paeps    line = substr(line, 1, RSTART)
2268d7edd17SPhilip Paeps
2278d7edd17SPhilip Paeps  # Remove unnecessary trailing " Ja" (for January).
2288d7edd17SPhilip Paeps  sub(/ Ja$/, "", line)
2298d7edd17SPhilip Paeps
2308d7edd17SPhilip Paeps  n = split(line, field)
2318d7edd17SPhilip Paeps
2329f9fc6bbSPhilip Paeps  # Record which rule names are used, and generate their abbreviations.
2339f9fc6bbSPhilip Paeps  f = zoneline ? 4 : linkline || ruleline ? 0 : 2
2349f9fc6bbSPhilip Paeps  r = field[f]
2359f9fc6bbSPhilip Paeps  if (r ~ /^[^-+0-9]/) {
2369f9fc6bbSPhilip Paeps    rule_used[r] = 1
2378d7edd17SPhilip Paeps  }
2388d7edd17SPhilip Paeps
2392865ab3fSPhilip Paeps  if (zoneline)
2408d7edd17SPhilip Paeps    zonename = startdef = field[2]
2412865ab3fSPhilip Paeps  else if (linkline)
2428d7edd17SPhilip Paeps    zonename = startdef = field[3]
2432865ab3fSPhilip Paeps  else if (ruleline)
2448d7edd17SPhilip Paeps    zonename = ""
2458d7edd17SPhilip Paeps
2462723c7ffSPhilip Paeps  # Save the information for later output.
2472723c7ffSPhilip Paeps  outline = make_line(n, field)
2482723c7ffSPhilip Paeps  if (ruleline)
2492723c7ffSPhilip Paeps    rule_output_line[nrule_out++] = outline
2502723c7ffSPhilip Paeps  else if (linkline) {
2512723c7ffSPhilip Paeps    # In vanguard format with Gawk, links are output sorted by destination.
2522723c7ffSPhilip Paeps    if (dataform == "vanguard" && PROCINFO["version"])
2532723c7ffSPhilip Paeps      linkdef[zonename] = field[2]
2542723c7ffSPhilip Paeps    else
2552723c7ffSPhilip Paeps      link_output_line[nlink_out++] = outline
2562723c7ffSPhilip Paeps  }else
2572723c7ffSPhilip Paeps    zonedef[zonename] = (zoneline ? "" : zonedef[zonename] "\n") outline
2589f9fc6bbSPhilip Paeps}
2599f9fc6bbSPhilip Paeps
2609f9fc6bbSPhilip Paepsfunction omit_unused_rules( \
2619f9fc6bbSPhilip Paeps			   i, field)
2629f9fc6bbSPhilip Paeps{
2632723c7ffSPhilip Paeps  for (i = 0; i < nrule_out; i++) {
2642723c7ffSPhilip Paeps    split(rule_output_line[i], field)
2652723c7ffSPhilip Paeps    if (!rule_used[field[2]])
2662723c7ffSPhilip Paeps      rule_output_line[i] = ""
2679f9fc6bbSPhilip Paeps  }
2689f9fc6bbSPhilip Paeps}
2699f9fc6bbSPhilip Paeps
2709f9fc6bbSPhilip Paepsfunction abbreviate_rule_names( \
2712723c7ffSPhilip Paeps			       abbr, f, field, i, n, newdef, newline, r, \
2722723c7ffSPhilip Paeps			       zoneline, zonelines, zonename)
2739f9fc6bbSPhilip Paeps{
2742723c7ffSPhilip Paeps  for (i = 0; i < nrule_out; i++) {
2752723c7ffSPhilip Paeps    n = split(rule_output_line[i], field)
2769f9fc6bbSPhilip Paeps    if (n) {
2772723c7ffSPhilip Paeps      r = field[2]
2789f9fc6bbSPhilip Paeps      if (r ~ /^[^-+0-9]/) {
2799f9fc6bbSPhilip Paeps	abbr = rule[r]
2809f9fc6bbSPhilip Paeps	if (!abbr) {
2819f9fc6bbSPhilip Paeps	  rule[r] = abbr = gen_rule_name(r)
2829f9fc6bbSPhilip Paeps	}
2832723c7ffSPhilip Paeps	field[2] = abbr
2842723c7ffSPhilip Paeps	rule_output_line[i] = make_line(n, field)
2859f9fc6bbSPhilip Paeps      }
2869f9fc6bbSPhilip Paeps    }
2879f9fc6bbSPhilip Paeps  }
2882723c7ffSPhilip Paeps  for (zonename in zonedef) {
2892723c7ffSPhilip Paeps    zonelines = split(zonedef[zonename], zoneline, /\n/)
2902723c7ffSPhilip Paeps    newdef = ""
2912723c7ffSPhilip Paeps    for (i = 1; i <= zonelines; i++) {
2922723c7ffSPhilip Paeps      newline = zoneline[i]
2932723c7ffSPhilip Paeps      n = split(newline, field)
2942723c7ffSPhilip Paeps      f = i == 1 ? 4 : 2
2952723c7ffSPhilip Paeps      r = rule[field[f]]
2962723c7ffSPhilip Paeps      if (r) {
2972723c7ffSPhilip Paeps	field[f] = r
2982723c7ffSPhilip Paeps	newline = make_line(n, field)
2992723c7ffSPhilip Paeps      }
3002723c7ffSPhilip Paeps      newdef = (newdef ? newdef "\n" : "") newline
3012723c7ffSPhilip Paeps    }
3022723c7ffSPhilip Paeps    zonedef[zonename] = newdef
3032723c7ffSPhilip Paeps  }
3048d7edd17SPhilip Paeps}
3058d7edd17SPhilip Paeps
3062865ab3fSPhilip Paepsfunction output_saved_lines( \
3072723c7ffSPhilip Paeps			    i, zonename)
3088d7edd17SPhilip Paeps{
3092723c7ffSPhilip Paeps  for (i = 0; i < nrule_out; i++)
3102723c7ffSPhilip Paeps    if (rule_output_line[i])
3112723c7ffSPhilip Paeps      print rule_output_line[i]
3122723c7ffSPhilip Paeps
3132723c7ffSPhilip Paeps  # When using gawk, output zones sorted by name.
3142723c7ffSPhilip Paeps  # This makes the output a bit more compressible.
3152723c7ffSPhilip Paeps  PROCINFO["sorted_in"] = "@ind_str_asc"
3162723c7ffSPhilip Paeps  for (zonename in zonedef)
3172723c7ffSPhilip Paeps    print zonedef[zonename]
3182723c7ffSPhilip Paeps
3192723c7ffSPhilip Paeps  if (nlink_out)
3202723c7ffSPhilip Paeps    for (i = 0; i < nlink_out; i++)
3212723c7ffSPhilip Paeps      print link_output_line[i]
3222723c7ffSPhilip Paeps  else {
3232723c7ffSPhilip Paeps    # When using gawk, output links sorted by destination.
3242723c7ffSPhilip Paeps    # This also helps compressibility a bit.
3252723c7ffSPhilip Paeps    PROCINFO["sorted_in"] = "@val_type_asc"
3262723c7ffSPhilip Paeps    for (zonename in linkdef)
3272723c7ffSPhilip Paeps      printf "L %s %s\n", linkdef[zonename], zonename
3282723c7ffSPhilip Paeps  }
3298d7edd17SPhilip Paeps}
3308d7edd17SPhilip Paeps
3318d7edd17SPhilip PaepsBEGIN {
33289abb9f8SPhilip Paeps  # Files that the output normally depends on.
33389abb9f8SPhilip Paeps  default_dep["africa"] = 1
33489abb9f8SPhilip Paeps  default_dep["antarctica"] = 1
33589abb9f8SPhilip Paeps  default_dep["asia"] = 1
33689abb9f8SPhilip Paeps  default_dep["australasia"] = 1
33789abb9f8SPhilip Paeps  default_dep["backward"] = 1
33889abb9f8SPhilip Paeps  default_dep["etcetera"] = 1
33989abb9f8SPhilip Paeps  default_dep["europe"] = 1
34089abb9f8SPhilip Paeps  default_dep["factory"] = 1
34189abb9f8SPhilip Paeps  default_dep["northamerica"] = 1
34289abb9f8SPhilip Paeps  default_dep["southamerica"] = 1
34389abb9f8SPhilip Paeps  default_dep["ziguard.awk"] = 1
34489abb9f8SPhilip Paeps  default_dep["zishrink.awk"] = 1
34589abb9f8SPhilip Paeps
34689abb9f8SPhilip Paeps  # Output a version string from 'version' and related configuration variables
34789abb9f8SPhilip Paeps  # supported by tzdb's Makefile.  If you change the makefile or any other files
34889abb9f8SPhilip Paeps  # that affect the output of this script, you should append '-SOMETHING'
34989abb9f8SPhilip Paeps  # to the contents of 'version', where SOMETHING identifies what was changed.
35089abb9f8SPhilip Paeps
35189abb9f8SPhilip Paeps  ndeps = split(deps, dep)
35289abb9f8SPhilip Paeps  ddeps = ""
35389abb9f8SPhilip Paeps  for (i = 1; i <= ndeps; i++) {
35489abb9f8SPhilip Paeps    if (default_dep[dep[i]]) {
35589abb9f8SPhilip Paeps      default_dep[dep[i]]++
35689abb9f8SPhilip Paeps    } else {
35789abb9f8SPhilip Paeps      ddeps = ddeps " " dep[i]
35889abb9f8SPhilip Paeps    }
35989abb9f8SPhilip Paeps  }
36089abb9f8SPhilip Paeps  for (d in default_dep) {
36189abb9f8SPhilip Paeps    if (default_dep[d] == 1) {
36289abb9f8SPhilip Paeps      ddeps = ddeps " !" d
36389abb9f8SPhilip Paeps    }
36489abb9f8SPhilip Paeps  }
365f2fcff28SPhilip Paeps  print "# version", version
36689abb9f8SPhilip Paeps  if (dataform != "main") {
36789abb9f8SPhilip Paeps    print "# dataform", dataform
36889abb9f8SPhilip Paeps  }
36989abb9f8SPhilip Paeps  if (redo != "posix_right") {
37089abb9f8SPhilip Paeps    print "# redo " redo
37189abb9f8SPhilip Paeps  }
37289abb9f8SPhilip Paeps  if (ddeps) {
37389abb9f8SPhilip Paeps    print "# ddeps" ddeps
37489abb9f8SPhilip Paeps  }
3758d7edd17SPhilip Paeps  print "# This zic input file is in the public domain."
37689abb9f8SPhilip Paeps
37789abb9f8SPhilip Paeps  prehash_rule_names()
3788d7edd17SPhilip Paeps}
3798d7edd17SPhilip Paeps
38046bee4edSPhilip Paeps/^[\t ]*[^#\t ]/ {
3818d7edd17SPhilip Paeps  process_input_line($0)
3828d7edd17SPhilip Paeps}
3838d7edd17SPhilip Paeps
3848d7edd17SPhilip PaepsEND {
3859f9fc6bbSPhilip Paeps  omit_unused_rules()
3869f9fc6bbSPhilip Paeps  abbreviate_rule_names()
3878d7edd17SPhilip Paeps  output_saved_lines()
3888d7edd17SPhilip Paeps}
389