about summary refs log tree commit diff
path: root/Src/utils.c
diff options
context:
space:
mode:
authorBart Schaefer <schaefer@zsh.org>2024-03-02 09:22:43 -0800
committerBart Schaefer <schaefer@zsh.org>2024-03-02 09:22:43 -0800
commit4fb96cc639f8f04a84dd488e61caacdecf11d65e (patch)
tree27bcd1923b20e94adf064adf428e6fc3deab2cc1 /Src/utils.c
parent13f73d84d3a69085df148e7cfe03ed6448a1238b (diff)
downloadzsh-4fb96cc639f8f04a84dd488e61caacdecf11d65e.tar.gz
zsh-4fb96cc639f8f04a84dd488e61caacdecf11d65e.tar.xz
zsh-4fb96cc639f8f04a84dd488e61caacdecf11d65e.zip
52612: %l replacment of zwarning() does literal string output
Diffstat (limited to 'Src/utils.c')
-rw-r--r--Src/utils.c22
1 files changed, 12 insertions, 10 deletions
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)