Home | History | Annotate | Line # | Download | only in misc
      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