Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: x86 console size



On Thu, 9 Jun 2022, Valery Ushakov wrote:

Uhm, you cite "setvar" in your example, but the patch affects handling
of the "font" command, it seems.


You're right--my mistake. Both `setvar' and `font' need quoting.

Can't we just fix the font name in wsfont/bold16x32.h to be
Boldface-16x32? :) Avoids confusion in wsfontload -l output too.


Yes! I would prefer that.

So I'd rather we avoid it altogether and rewrite the loop to consume
all the arguments first, then use the

   set -- "$@" ...

idiom to construct the command line, something along the lines of:

   set -- "$@" ${enc:+ "-e" "$enc"}
   set -- "$@" ${name:+ "-N" "$name"}
   set -- "$@" ${file:+ "-f" "$file"}
   $DOIT "$cmd" "$@"


Yes, cleaner this way.

PS: would be nice to have a version of echo that shqoute(3) its
arguments to use for DOIT too.


This, below, do? (I did the same with printf(1)--"%q", but I was just
chucking away fieldwidth and precesion there, so echo it is.):

---START---
diff -urN bin/echo.orig/echo.c bin/echo/echo.c
--- bin/echo.orig/echo.c	2021-11-16 22:47:05.474277074 +0000
+++ bin/echo/echo.c	2022-06-09 20:36:13.806784976 +0000
@@ -47,29 +47,56 @@
 #include <stdlib.h>
 #include <string.h>

+static char *
+qstr(char *s)
+{
+	char* qs;
+	size_t n;
+
+	if ((n = shquote(s, NULL, 0)) == (size_t)-1)
+		return NULL;
+	n += 1;
+	if ((qs = malloc(n)) == NULL)
+		return NULL;
+	(void)shquote(s, qs, n);
+	return qs;
+}
+
 /* ARGSUSED */
 int
 main(int argc, char *argv[])
 {
-	bool nflag;
+	bool nflag, qflag;
+	int rc = EXIT_FAILURE;

 	setprogname(argv[0]);
 	(void)setlocale(LC_ALL, "");

+	nflag = qflag = false;
 	/* This utility may NOT do getopt(3) option parsing. */
-	nflag = *++argv != NULL && strcmp(*argv, "-n") == 0;
+	if (*++argv != NULL) {
+		nflag = strcmp(*argv, "-n") == 0;
+		qflag = strcmp(*argv, "-q") == 0;
+		if (qflag) nflag = true;	/* -q implies -n */
+	}
 	if (nflag)
 		++argv;

 	while (*argv != NULL) {
-		(void)printf("%s", *argv);
+		if (qflag) {
+			char *qs = qstr(*argv);
+			if (qs == NULL)
+				err(rc, "quote error");
+			(void)printf("%s", qs);
+			free(qs);
+		} else
+			(void)printf("%s", *argv);
 		if (*++argv != NULL)
 			(void)putchar(' ');
 	}
 	if (!nflag)
 		(void)putchar('\n');
-	(void)fflush(stdout);
-	if (ferror(stdout) != 0)
-		err(1, "write error");
-	return 0;
+	if (fflush(stdout))
+		err(rc, "write error");
+	return EXIT_SUCCESS;
 }
---END---

Man pages, tests to come if OK.

-RVP


Home | Main Index | Thread Index | Old Index