1 1.3 jmcneill # $NetBSD: nanpa.awk,v 1.3 2023/01/28 13:12:16 jmcneill Exp $ 2 1.2 jhawk # 3 1.2 jhawk # todo: 4 1.3 jmcneill # parse "https://nationalnanpa.com/nanp1/npa_report.csv" 5 1.3 jmcneill # instead of scraping HTML. 6 1.2 jhawk # 7 1.3 jmcneill function trim(s) 8 1.3 jmcneill { 9 1.3 jmcneill gsub(/^[ \t]+|[ \t]+$/, "", s); 10 1.3 jmcneill return s; 11 1.3 jmcneill } 12 1.3 jmcneill function mapinit(postdb) 13 1.3 jmcneill { 14 1.3 jmcneill while ((getline < postdb) > 0) { 15 1.3 jmcneill sub(/#.*/, ""); 16 1.3 jmcneill if (length($0)==0) continue; 17 1.3 jmcneill NF=split($0, f); 18 1.3 jmcneill location[f[1]] = f[2]; 19 1.3 jmcneill flocation[tolower(f[2])] = f[2]; 20 1.3 jmcneill country[f[1]] = f[4]; 21 1.3 jmcneill fcountry[tolower(f[2])] = f[4]; 22 1.3 jmcneill } 23 1.3 jmcneill } 24 1.3 jmcneill function countrymap(s) 25 1.3 jmcneill { 26 1.3 jmcneill if (s == "CA") return "Canada"; 27 1.3 jmcneill if (s == "US") return "USA"; 28 1.3 jmcneill return s; 29 1.3 jmcneill } 30 1.3 jmcneill function locationmap(s, t) 31 1.3 jmcneill { 32 1.3 jmcneill if (s in location) { 33 1.3 jmcneill t = location[s]; 34 1.3 jmcneill if (s in country) { 35 1.3 jmcneill t = t " (" countrymap(country[s]) ")"; 36 1.3 jmcneill } 37 1.3 jmcneill } else if (tolower(s) in flocation) { 38 1.3 jmcneill t = flocation[tolower(s)]; 39 1.3 jmcneill if (tolower(s) in fcountry) { 40 1.3 jmcneill t = t " (" countrymap(fcountry[tolower(s)]) ")"; 41 1.3 jmcneill } 42 1.3 jmcneill } else { 43 1.3 jmcneill t = s; 44 1.3 jmcneill } 45 1.3 jmcneill return t; 46 1.3 jmcneill } 47 1.1 jhawk function parse(file, ispipe, isplanning, i, planinit, t) 48 1.1 jhawk { 49 1.1 jhawk planinit = 0; 50 1.1 jhawk while((ispipe?(file | getline):(getline < file)) > 0) { 51 1.1 jhawk sub(/#.*/, ""); 52 1.1 jhawk if (length($0)==0) continue; 53 1.1 jhawk if (isplanning) { 54 1.3 jmcneill NF=split($0, f); 55 1.3 jmcneill if (!planinit && f[2]=="New NPA") { 56 1.1 jhawk planinit=1; 57 1.1 jhawk for (i=1; i<=NF; i++) 58 1.3 jmcneill fnames[f[i]]=i-1; 59 1.3 jmcneill } else if (planinit && length(f[fnames["New NPA"]])>1) { 60 1.3 jmcneill t = locationmap(trim(f[fnames["Location"]])) FS; 61 1.3 jmcneill if (trim(f[fnames["Overlay?"]])=="Yes") 62 1.3 jmcneill t = t "Overlay of " trim(f[fnames["Old NPA"]]); 63 1.3 jmcneill else if (f[fnames["Old NPA"]]) 64 1.3 jmcneill t = t "Split of " trim(f[fnames["Old NPA"]]); 65 1.3 jmcneill if (f[fnames["Status"]]) 66 1.3 jmcneill t = t " (" trim(f[fnames["Status"]]) ")"; 67 1.3 jmcneill if (length(f[fnames["In Service Date"]]) > 1) 68 1.1 jhawk t = t " effective " \ 69 1.3 jmcneill trim(f[fnames["In Service Date"]]); 70 1.3 jmcneill data[trim(f[fnames["New NPA"]]) "*"] = t; 71 1.1 jhawk } 72 1.1 jhawk } else { 73 1.1 jhawk # digits only 74 1.1 jhawk match($0, /^[0-9]/); 75 1.1 jhawk if (RSTART==0) continue; 76 1.1 jhawk i=index($0, FS); 77 1.3 jmcneill data[substr($0, 1, i-1)]=locationmap(trim(substr($0,i+1))); 78 1.1 jhawk } 79 1.1 jhawk } 80 1.1 jhawk close(file); 81 1.1 jhawk } 82 1.1 jhawk 83 1.1 jhawk BEGIN{ 84 1.1 jhawk FS=":" 85 1.3 jmcneill mapinit("na.postal"); 86 1.1 jhawk print "# $""NetBSD: $"; 87 1.3 jmcneill print "# Generated from https://nationalnanpa.com/area_codes/index.html"; 88 1.1 jhawk print "# (with local exceptions)"; 89 1.1 jhawk print "# "; 90 1.1 jhawk print "# format:"; 91 1.1 jhawk print "# Area Code : Description : Detail : State/Province Abbrev."; 92 1.1 jhawk print "# (3rd and 4th fields optional)"; 93 1.1 jhawk print "# A * in the Area Code field indicates a future area code." 94 1.1 jhawk print "# "; 95 1.1 jhawk parse("ftp -o - " \ 96 1.3 jmcneill "https://nationalnanpa.com/enas/geoAreaCodeNumberReport.do" \ 97 1.3 jmcneill " | sed -f nanpa.sed", 1, 0); 98 1.1 jhawk parse("ftp -o - " \ 99 1.3 jmcneill "https://nationalnanpa.com/enas/nonGeoNpaServiceReport.do" \ 100 1.3 jmcneill " | sed -f nanpa.sed", 1, 0); 101 1.1 jhawk parse("ftp -o - " \ 102 1.3 jmcneill "https://nationalnanpa.com/enas/plannedNpasNotInServiceReport.do" \ 103 1.3 jmcneill " | sed -f nanpa.sed", 1, 1); 104 1.1 jhawk parse("na.phone.add", 0, 0); 105 1.1 jhawk sort="sort -n"; 106 1.1 jhawk for (i in data) 107 1.1 jhawk print i FS data[i] | sort 108 1.1 jhawk close(sort); 109 1.1 jhawk } 110