return 1;
}
-/* Return the filename, turning any non-printable characters into '?'s.
- * This ensures that outputting it on a line of its own cannot generate an
- * empty line. This function can return only MAX_SAFE_NAMES values at a
- * time! The returned value can be longer than MAXPATHLEN (because we
- * may be trying to output an error about a too-long filename)! */
-const char *safe_fname(const char *fname)
+/* Return the filename, turning any non-printable characters into escaped
+ * characters (e.g. \n -> \012, \ -> \\). This ensures that outputting it
+ * cannot generate an empty line nor corrupt the screen. This function can
+ * return only MAX_SAFE_NAMES values at a time! The returned value can be
+ * longer than MAXPATHLEN (because we may be trying to output an error about
+ * a too-long filename)! */
+char *safe_fname(const char *fname)
{
#define MAX_SAFE_NAMES 4
static char fbuf[MAX_SAFE_NAMES][MAXPATHLEN*2];
ndx = (ndx + 1) % MAX_SAFE_NAMES;
for (t = fbuf[ndx]; *fname; fname++) {
- if (!isprint(*(uchar*)fname))
- *t++ = '?';
- else
+ if (*fname == '\\') {
+ if ((limit -= 2) < 0)
+ break;
+ *t++ = '\\';
+ *t++ = '\\';
+ } else if (!isprint(*(uchar*)fname)) {
+ if ((limit -= 4) < 0)
+ break;
+ sprintf(t, "\\%03o", *(uchar*)fname);
+ t += 4;
+ } else {
+ if (--limit < 0)
+ break;
*t++ = *fname;
- if (--limit == 0)
- break;
+ }
}
*t = '\0';
break;
s_len = fn_len - (s - fn);
fn_len = s - fn;
- if (s_len == 3) {
+ if (s_len == 4) {
if (strcmp(s+1, "bak") == 0
|| strcmp(s+1, "old") == 0)
continue;
- } else if (s_len == 4) {
+ } else if (s_len == 5) {
if (strcmp(s+1, "orig") == 0)
continue;
} else if (s_len > 2 && had_tilde