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))
}
/*