#! /usr/bin/gawk -f # Last edited on 2024-03-28 19:30:53 by stolfi ((NF == 3) && ($2 == "->")) { lk = $1; tg = $3; if (lk !~ /[.]/) { error("link without extension", lk) } if (lk !~ /^[a-zA-Z0-9_]+[.][a-z0-9]+$/) { error("bad link", lk) } ext_lk = lk; gsub(/^.*[.]/, "", ext_lk) root_lk = lk; gsub(/[.].*$/, "", root_lk) if (root_lk == lk) if (tg !~ /[.][.][/]programs(|_big)[/]/) { error("bad target", tg) } rest_tg = tg; gsub(/[.][.][/]programs(|_big)[/]/, "", rest_tg) file_tg = rest_tg; gsub(/^.*[/]/, "", file_tg) dir_tg = rest_tg; gsub(/[/][^/]*$/, "", dir_tg) if (file_tg != lk) { error("link/target mismatch", "") } pkg_tg = dir_tg; gsub(/^.*[/]/, "", pkg_tg) lang_tg = dir_tg; gsub(/[/][^/]*$/, "", lang_tg) if (pkg_tg != root_lk) { note("nontrivial package", pkg_tg); } if (ext_lk == "gawk") { lang_tg_exp = "awk" } else if (ext_lk == "sh") { lang_tg_exp = "bash" } else if (ext_lk == "py") { lang_tg_exp = "python" } else if (ext_lk == "pl") { lang_tg_exp = "perl" } else { lang_tg_exp = ext_lk } if (lang_tg_exp != lang_tg) { note("extension/lang mismatch", (ext_lk ":" lang_tg_exp ":" lang_tg)) } next; } // { error("bad line format", "") exit(1) } function note(msg, arg) { if (arg != "") { msg = (msg " = \"" arg "\"") } printf "%s:%d: !! %s\n", FILENAME, FNR, msg > "/dev/stderr" printf " %s\n\n", $0 > "/dev/stderr" } function error(msg, arg) { if (arg != "") { msg = (msg " = \"" arg "\"") } printf "%s:%d: ** %s\n", FILENAME, FNR, msg > "/dev/stderr" printf " %s\n\n", $0 > "/dev/stderr" next }