Allow passing extended formats

Extended formats can be specified by adding custom format strings to the
end of a long format specifier, separated by a colon (":"). This feature
is currently unused. Extended format support for several format
specifiers will be added in following patches.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
This commit is contained in:
Lukas Fleischer 2012-04-13 18:55:29 +02:00
parent b73ce859db
commit 68b26ff854

View File

@ -1082,11 +1082,13 @@ print_escape (const char *s)
/* Parse a format specifier. */ /* Parse a format specifier. */
static enum format_specifier static enum format_specifier
parse_fs (const char **s) parse_fs (const char **s, char *extformat)
{ {
char buf[FS_EXT_MAXLEN]; char buf[FS_EXT_MAXLEN];
int i; int i;
extformat[0] = '\0';
switch (**s) switch (**s)
{ {
case 's': case 's':
@ -1109,7 +1111,7 @@ parse_fs (const char **s)
return FS_PRIORITY; return FS_PRIORITY;
case '(': case '(':
/* Long format specifier. */ /* Long format specifier. */
for ((*s)++, i = 0; **s != ')'; (*s)++, i++) for ((*s)++, i = 0; **s != ':' && **s != ')'; (*s)++, i++)
{ {
if (**s == '\0') if (**s == '\0')
return FS_EOF; return FS_EOF;
@ -1120,6 +1122,20 @@ parse_fs (const char **s)
buf[(i < FS_EXT_MAXLEN) ? i : FS_EXT_MAXLEN - 1] = '\0'; buf[(i < FS_EXT_MAXLEN) ? i : FS_EXT_MAXLEN - 1] = '\0';
if (**s == ':')
{
for ((*s)++, i = 0; **s != ')'; (*s)++, i++)
{
if (**s == '\0')
return FS_EOF;
if (i < FS_EXT_MAXLEN)
extformat[i] = **s;
}
extformat[(i < FS_EXT_MAXLEN) ? i : FS_EXT_MAXLEN - 1] = '\0';
}
if (!strcmp (buf, "start")) if (!strcmp (buf, "start"))
return FS_STARTDATE; return FS_STARTDATE;
else if (!strcmp (buf, "startstr")) else if (!strcmp (buf, "startstr"))
@ -1155,6 +1171,7 @@ print_apoint (const char *format, long day, struct apoint *apt)
{ {
const char *p; const char *p;
char str_start[HRMIN_SIZE], str_end[HRMIN_SIZE]; char str_start[HRMIN_SIZE], str_end[HRMIN_SIZE];
char extformat[FS_EXT_MAXLEN];
apoint_sec2str (apt, day, str_start, str_end); apoint_sec2str (apt, day, str_start, str_end);
@ -1162,7 +1179,7 @@ print_apoint (const char *format, long day, struct apoint *apt)
{ {
if (*p == '%') { if (*p == '%') {
p++; p++;
switch (parse_fs (&p)) switch (parse_fs (&p, extformat))
{ {
case FS_STARTDATE: case FS_STARTDATE:
printf ("%ld", apt->start); printf ("%ld", apt->start);
@ -1211,12 +1228,13 @@ void
print_event (const char *format, long day, struct event *ev) print_event (const char *format, long day, struct event *ev)
{ {
const char *p; const char *p;
char extformat[FS_EXT_MAXLEN];
for (p = format; *p; p++) for (p = format; *p; p++)
{ {
if (*p == '%') { if (*p == '%') {
p++; p++;
switch (parse_fs (&p)) switch (parse_fs (&p, extformat))
{ {
case FS_MESSAGE: case FS_MESSAGE:
printf ("%s", ev->mesg); printf ("%s", ev->mesg);
@ -1277,12 +1295,13 @@ void
print_todo (const char *format, struct todo *todo) print_todo (const char *format, struct todo *todo)
{ {
const char *p; const char *p;
char extformat[FS_EXT_MAXLEN];
for (p = format; *p; p++) for (p = format; *p; p++)
{ {
if (*p == '%') { if (*p == '%') {
p++; p++;
switch (parse_fs (&p)) switch (parse_fs (&p, extformat))
{ {
case FS_PRIORITY: case FS_PRIORITY:
printf ("%d", abs (todo->id)); printf ("%d", abs (todo->id));