src/utils.c: Support escape sequences in format strings

We support all simple escape sequences listed in the ANSI C standard,
plus "\0" to allow for printing null characters.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
This commit is contained in:
Lukas Fleischer 2011-11-22 14:51:07 +01:00
parent 1ff6f39c86
commit fc9cd6149b

View File

@ -1006,6 +1006,55 @@ print_notefile (FILE *out, char *filename, int nbtab)
} }
} }
/* Print an escape sequence and return its length. */
static int
print_escape (const char *s)
{
switch (*(s + 1))
{
case 'a':
putchar ('\a');
return 1;
case 'b':
putchar ('\b');
return 1;
case 'f':
putchar ('\f');
return 1;
case 'n':
putchar ('\n');
return 1;
case 'r':
putchar ('\r');
return 1;
case 't':
putchar ('\t');
return 1;
case 'v':
putchar ('\v');
return 1;
case '0':
putchar ('\0');
return 1;
case '\'':
putchar ('\'');
return 1;
case '"':
putchar ('"');
return 1;
case '\?':
putchar ('?');
return 1;
case '\\':
putchar ('\\');
return 1;
case '\0':
return 0;
default:
return 1;
}
}
/* Print a formatted appointment to stdout. */ /* Print a formatted appointment to stdout. */
void void
print_apoint (const char *format, long day, struct apoint *apt) print_apoint (const char *format, long day, struct apoint *apt)
@ -1056,6 +1105,8 @@ print_apoint (const char *format, long day, struct apoint *apt)
break; break;
} }
} }
else if (*p == '\\')
p += print_escape (p);
else else
putchar (*p); putchar (*p);
} }
@ -1093,6 +1144,8 @@ print_event (const char *format, long day, struct event *ev)
break; break;
} }
} }
else if (*p == '\\')
p += print_escape (p);
else else
putchar (*p); putchar (*p);
} }
@ -1160,6 +1213,8 @@ print_todo (const char *format, struct todo *todo)
break; break;
} }
} }
else if (*p == '\\')
p += print_escape (p);
else else
putchar (*p); putchar (*p);
} }