shithub: mc

Download patch

ref: 284e7bb9bee1f03a7792347dd0da3a0c5dd2fbb4
parent: 1644f38d35a004689b4e1d66e6c1e4320a294c01
author: Ori Bernstein <[email protected]>
date: Fri Jan 29 08:49:26 EST 2016

Add 'e' modifier to fmt.

--- a/lib/std/fmt.myr
+++ b/lib/std/fmt.myr
@@ -453,15 +453,17 @@
 
 const strfmt = {sb, str, params
 	var opts
-	var w, p, i, raw
+	var w, p, i, raw, esc
 
 	p = ' '
 	w = 0
 	raw = false
+	esc = false
 	opts = parseparams(params, [
 		("w", true),
 		("p", true),
-		("r", false)
+		("r", false),
+		("e", false),
 	][:])
 
 	for o in opts
@@ -469,9 +471,11 @@
 		| ("w", wid):	w = getint(wid, "fmt: width must be integer")
 		| ("p", pad):	p = decode(pad)
 		| ("r", ""):	raw = true
+		| ("e", ""):	esc = true
 		| _:	std.die("unreachable")
 		;;
 	;;
+	iassert(!raw || !esc == false, "raw and excaped strings conflict\n")
 	iassert(p >= 0, "pad must be >= 0")
 	std.slfree(opts)
 	if raw
@@ -479,6 +483,15 @@
 			sbputs(sb, "\\x")
 			intfmt(sb, [.padto=2, .padfill='0', .base=16], false, b)
 		;;
+	elif esc
+		for b in str
+			if isprint(b)
+				sbputb(sb, b)
+			else
+				sbputs(sb, "\\x")
+				intfmt(sb, [.padto=2, .padfill='0', .base=16], false, b)
+			;;
+		;;
 	else
 		for i = 0; i < w - graphemewidth(str); i++
 			sbputc(sb, p)
@@ -485,6 +498,10 @@
 		;;
 		sbputs(sb, str)
 	;;
+}
+
+const isprint = {b
+	-> (b >= ' ' castto(byte)) && (b < '~' castto(byte))
 }
 
 /*