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

Reply via email to