Module Name: src Committed By: apb Date: Tue Oct 21 23:15:38 UTC 2014
Modified Files: src/distrib/sets: join.awk Log Message: Add an unvis function and use it on file names in mtree specs. This should correct the problem that ./bin/[ was missing from the base.tgz set, despite being listed in src/distrib/sets/base/mi and being present in METALOG. The corresponding entry in METALOG.sanitised has ./bin/\133 instead of ./bin/[, and that made join.awk omit it. XXX: The unvis() implementation in join.awk handles only a subset of the syntax, but it's probably good enough for now. XXX: The file names should probably be canonicalised by vis(unvis(name)), but at present none of the file names in the set lists really need it. XXX: It may be a bug that entries in the set lists without corresponding entries in METALOG are silently ignored by join.awk. To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/distrib/sets/join.awk Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/distrib/sets/join.awk diff -u src/distrib/sets/join.awk:1.3 src/distrib/sets/join.awk:1.4 --- src/distrib/sets/join.awk:1.3 Wed Apr 30 13:10:49 2008 +++ src/distrib/sets/join.awk Tue Oct 21 23:15:38 2014 @@ -1,4 +1,4 @@ -# $NetBSD: join.awk,v 1.3 2008/04/30 13:10:49 martin Exp $ +# $NetBSD: join.awk,v 1.4 2014/10/21 23:15:38 apb Exp $ # # Copyright (c) 2002 The NetBSD Foundation, Inc. # All rights reserved. @@ -32,17 +32,61 @@ # and outputs lines in F2 with a first word that is in F1. # Neither file needs to be sorted +function unvis(s) \ +{ + # XXX: We don't handle the complete range of vis encodings + unvis_result = "" + while (length(s) > 0) { + unvis_pos = match(s, "\\\\.") + if (unvis_pos == 0) { + unvis_result = unvis_result "" s + s = "" + break + } + # copy the part before the next backslash + unvis_result = unvis_result "" substr(s, 1, unvis_pos - 1) + s = substr(s, unvis_pos) + # process the backslash and next few chars + if (substr(s, 1, 2) == "\\\\") { + # double backslash -> single backslash + unvis_result = unvis_result "\\" + s = substr(s, 3) + } else if (match(s, "\\\\[0-7][0-7][0-7]") == 1) { + # \ooo with three octal digits. + # XXX: use strnum() is that is available + unvis_result = unvis_result "" sprintf("%c", \ + 0+substr(s, 2, 1) * 64 + \ + 0+substr(s, 3, 1) * 8 + \ + 0+substr(s, 4, 1)) + s = substr(s, 5) + } else { + # unrecognised escape: keep the literal backslash + printf "%s: %s:%s: unrecognised escape %s\n", \ + ARGV[0], (FILENAME ? FILENAME : "stdin"), FNR, \ + substr(s, 1, 2) \ + >"/dev/stderr" + unvis_result = unvis_result "" substr(s, 1, 1) + s = substr(s, 2) + } + } + return unvis_result +} + BEGIN \ { if (ARGC != 3) { printf("Usage: join file1 file2\n") >"/dev/stderr" exit 1 } - while ( (getline < ARGV[1]) > 0) + while ( (getline < ARGV[1]) > 0) { + $1 = unvis($1) words[$1] = $0 + } delete ARGV[1] } +// { $1 = unvis($1) } + $1 in words \ { f1=$1