nanpa.awk revision 1.3 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