diff options
| author | 2022-08-14 11:16:03 +0200 | |
|---|---|---|
| committer | 2022-08-14 11:16:03 +0200 | |
| commit | 0d1e125832d0fd8ca31c5f782e7c3db774ae5a02 (patch) | |
| tree | e4622f75a8307d8ee1970f8bd6cc92766582f0ba /src/fmt.cff | |
| parent | c129f77ad724aa940b53a125de0e1e4de0ca7240 (diff) | |
woa
Diffstat (limited to 'src/fmt.cff')
| -rw-r--r-- | src/fmt.cff | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/src/fmt.cff b/src/fmt.cff index 8212593..90fcd47 100644 --- a/src/fmt.cff +++ b/src/fmt.cff @@ -1,4 +1,5 @@ -import "all.hff"; +import "cffc.hff"; +import "common.hff"; extern fn vpfmt(proc *fn(u8, *void) void, parg *void, fmt *const u8, ap va_list) void { defmacro p(x) [ proc(x, parg) ] @@ -10,14 +11,22 @@ extern fn vpfmt(proc *fn(u8, *void) void, parg *void, fmt *const u8, ap va_list) defmacro pch(ch) [ { extern fn isprint(int) int; - let $ch = ch; - if isprint($ch) != 0 { + let $ch u8 = ch; + switch { + case $ch == '\''; + ps("\\'"); + case $ch == '\"'; + ps("\\\""); + case $ch == '\\'; + ps("\\\\"); + case isprint($ch) != 0; p($ch); - } else { - p('\\'); - p('0' + ($ch % 8)); - p('0' + (($ch / 8) % 8)); - p('0' + (($ch / 8 / 8) % 8)); + case $ch == '\n'; + ps("\\n"); + case else; + ps("\\x"); + p("0123456789ABCDEF"[($ch >> 4) & 15]); + p("0123456789ABCDEF"[$ch & 15]); } } ] |