dobeep_msgs isn't printf-like: it just prints the two arguments separated by a space in the minibuffer. When it was introduced some call from ewprintf were incorrectly translated and the "%s" remained.
For example, "M-g M-g abc RET" shows "Line number %s invalid". ok? diff bd057c8434699e3a647a884343d442828df4678e /usr/src blob - 251e7e8185b0b897d28f26fa3bf11d4f8eb281f5 file + usr.bin/mg/basic.c --- usr.bin/mg/basic.c +++ usr.bin/mg/basic.c @@ -536,7 +536,7 @@ gotoline(int f, int n) return (ABORT); n = (int)strtonum(buf, INT_MIN, INT_MAX, &err); if (err) - return(dobeep_msgs("Line number %s", err)); + return(dobeep_msgs("Line number", err)); } return(setlineno(n)); } blob - 9ad06e49bc715c81e70573ed000e6f5c321d97a0 file + usr.bin/mg/cscope.c --- usr.bin/mg/cscope.c +++ usr.bin/mg/cscope.c @@ -185,9 +185,9 @@ cscreatelist(int f, int n) return (FALSE); if (stat(dir, &sb) == -1) - return(dobeep_msgs("stat: %s", strerror(errno))); + return(dobeep_msgs("stat:", strerror(errno))); else if (S_ISDIR(sb.st_mode) == 0) - return(dobeep_msgs("%s: Not a directory", dir)); + return(dobeep_msgs(dir, "Not a directory")); if (csexists("cscope-indexer") == FALSE) return(dobeep_msg("no such file or directory, cscope-indexer"));