Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
[PATCH] "Raw" error messages with zwarning %l
- X-seq: zsh-workers 52612
- From: Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>
- To: Zsh hackers list <zsh-workers@xxxxxxx>
- Subject: [PATCH] "Raw" error messages with zwarning %l
- Date: Sun, 25 Feb 2024 13:10:26 -0800
- Archived-at: <https://zsh.org/workers/52612>
- List-id: <zsh-workers.zsh.org>
Here's the end result of the discussion (plus a small coding
convention fix in utils.c).
I included a comment about caller responsibility for %l but given that
the only usage has to do with user-supplied strings, in practice
there's nothing the caller can do about it anyway.
I'm also not sure the metafy()+%s change is needed in parse.c, but I
put it there to keep the end behavior the same.
diff --git a/Src/parse.c b/Src/parse.c
index 821812c78..40eb0ee0b 100644
--- a/Src/parse.c
+++ b/Src/parse.c
@@ -2730,11 +2730,10 @@ yyerror(int noerr)
if (!t || !t[t0] || t[t0] == '\n')
break;
if (!(histdone & HISTFLAG_NOEXEC) && !(errflag & ERRFLAG_INT)) {
- if (t0 == 20)
- zwarn("parse error near `%l...'", t, 20);
- else if (t0)
- zwarn("parse error near `%l'", t, t0);
- else
+ if (t0) {
+ t = metafy(t, t0, META_STATIC);
+ zwarn("parse error near `%s%s'", t, t0 == 20 ? "..." : "");
+ } else
zwarn("parse error");
}
if (!noerr && noerrs != 2)
diff --git a/Src/subst.c b/Src/subst.c
index 650c09de2..49f7336bb 100644
--- a/Src/subst.c
+++ b/Src/subst.c
@@ -3271,8 +3271,10 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags,
if (isset(EXECOPT)) {
*idend = '\0';
if (*s){
+ int l;
singsub(&s);
- zerr("%s: %s", idbeg, s);
+ s = unmetafy(s, &l);
+ zerr("%s: %l", idbeg, s, l);
} else
zerr("%s: %s", idbeg, "parameter not set");
/*
diff --git a/Src/utils.c b/Src/utils.c
index 0fda92709..c8831c85e 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -122,14 +122,20 @@ set_widearray(char *mb_array, Widechar_array wca)
(implemented by zerrmsg()):
Code Argument types Prints
- %s const char * C string (null terminated)
- %l const char *, int C string of given length (null not required)
+ %s const char * C string (metafied, null terminated)
+ (output "nice")
+ %l const char *, int C string of given length (not metafied)
+ (output raw)
%L long decimal value
%d int decimal value
%z zlong decimal value
%% (none) literal '%'
%c int character at that codepoint
- %e int strerror() message (argument is typically 'errno')
+ %e int strerror() message (argument usually 'errno')
+ (output raw)
+
+ For %s and %l, the caller is responsible for assuring end-of-string
+ is not in the middle of a metafy pair (%s) or a multibyte character.
*/
static void
@@ -310,14 +316,9 @@ zerrmsg(FILE *file, const char *fmt, va_list ap)
nicezputs(str, file);
break;
case 'l': {
- char *s;
str = va_arg(ap, const char *);
num = va_arg(ap, int);
- num = metalen(str, num);
- s = zhalloc(num + 1);
- memcpy(s, str, num);
- s[num] = '\0';
- nicezputs(s, file);
+ fwrite(str, num, 1, file);
break;
}
case 'L':
@@ -715,7 +716,8 @@ wcs_nicechar(wchar_t c, size_t *widthp, char **swidep)
*/
/**/
-mod_export int is_wcs_nicechar(wchar_t c)
+mod_export int
+is_wcs_nicechar(wchar_t c)
{
if (!WC_ISPRINT(c) && (c < 0x80 || !isset(PRINTEIGHTBIT))) {
if (c == 0x7f || c == L'\n' || c == L'\t' || c < 0x20)
Messages sorted by:
Reverse Date,
Date,
Thread,
Author