code: plan9front

Download patch

ref: d606d83ed85953a761f7e08ff3f18459d7b29c34
parent: 78953b41e400ecc9854c0d66acc48380f1482d7c
author: umbraticus@prosimetrum.com <umbraticus@prosimetrum.com>
date: Sat Apr 16 02:53:35 EDT 2022

make = command's output plumbable

This patch makes sam's = cmd output what seems to me a more
useful (plumbable) format: /full/path/to/file:addr , where
addr is line(s) under = and rune(s) under =#.

--- a/sys/man/1/sam
+++ b/sys/man/1/sam
@@ -403,10 +403,10 @@
 Set dot.
 .TP
 .B =
-Print the line address and character address of the range.
+Print the file name and line address of the range.
 .TP
 .B =#
-Print just the character address of the range.
+Print the file name and character address of the range.
 .PD
 .SS File commands
 .PD 0
--- a/sys/src/cmd/sam/sam.c
+++ b/sys/src/cmd/sam/sam.c
@@ -688,11 +688,27 @@
 }
 
 void
-printposn(File *f, int charsonly)
+printposn(File *f, int chars)
 {
 	Posn l1, l2;
+	char *s;
 
-	if(!charsonly){
+	if(f->name.s[0]){
+		if(f->name.s[0]!='/'){
+			getcurwd();
+			s = Strtoc(&curwd);
+			dprint("%s", s);
+			free(s);
+		}
+		s = Strtoc(&f->name);
+		dprint("%s:", s);
+		free(s);
+	}
+	if(chars){
+		dprint("#%lud", addr.r.p1);
+		if(addr.r.p2 != addr.r.p1)
+			dprint(",#%lud", addr.r.p2);
+	}else{
 		l1 = 1+nlcount(f, (Posn)0, addr.r.p1);
 		l2 = l1+nlcount(f, addr.r.p1, addr.r.p2);
 		/* check if addr ends with '\n' */
@@ -701,11 +717,7 @@
 		dprint("%lud", l1);
 		if(l2 != l1)
 			dprint(",%lud", l2);
-		dprint("; ");
 	}
-	dprint("#%lud", addr.r.p1);
-	if(addr.r.p2 != addr.r.p1)
-		dprint(",#%lud", addr.r.p2);
 	dprint("\n");
 }