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