#! /usr/bin/gawk -f # Last edited on 2022-02-12 03:11:02 by stolfi BEGIN{ # Input file must have one file name per line. The filename must be delimited by "//". # Assumes that there are no filenames with embedded "//". # # User must define (with "-v efile={EFILE}") the name of the error file, where # the bad filenames will be written. Each filename will be prefixed by "({ecode})" # where {ecode} is a code of the error. if (efile == "") { arg_error(("must define {efile}")); } } (match($0, /[\/][\/].*[\/][\/]/)) { # Found what looks like a filename: fname = substr($0, RSTART+2, RLENGTH-4) if (fname ~ /[ \011]/) { fname_error("embedded blanks", 0, fname); } if (fname ~ /[\/][\/]/) { fname_error("embedded '//'", 1, fname); } if (fname ~ /[^^_.,+\/=@%#~:a-zA-Z0-9$()-]/) { fname_error("invalid chars", 2, fname); } print; next; } (match($0, /(^|[ ])[\/][\/]/)) { match($0, /[\/][\/]/) fname = substr($0, RSTART+2) fname_error("embedded newline (head)", 5, fname); next; } (match($0, /[\/][\/]($|[ ])/)) { match($0, /[\/][\/]/) fname = substr($0, 1, RSTART-1) fname_error("embedded newline (tail)", 6, fname); next; } // { fname_error("embedded newline (middle)", 7, fname); next; } function arg_error(msg) { printf "** error: %s\n", msg > "/dev/stderr" exit(1); } function fname_error(msg, ecode, fname) { printf "** error: (%d) %s //%s//\n", ecode, msg, fname > "/dev/stderr" printf "(%d) %s\n", ecode, fname > efile; next; }