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