Add %(remaining) style formatting

Adds %(remaining) style formatting, with parameter substitution
for %d, %H, %M, %S with E and - variables.

Signed-off-by: William Pettersson <william.pettersson@gmail.com>
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
This commit is contained in:
William Pettersson 2013-07-17 20:49:59 +10:00 committed by Lukas Fleischer
parent fb61744f33
commit 18b6e360b8

View File

@ -56,6 +56,7 @@ enum format_specifier {
FS_STARTDATE,
FS_DURATION,
FS_ENDDATE,
FS_REMAINING,
FS_MESSAGE,
FS_NOTE,
FS_NOTEFILE,
@ -1189,6 +1190,8 @@ static enum format_specifier parse_fs(const char **s, char *extformat)
return FS_DURATION;
else if (!strcmp(buf, "end"))
return FS_ENDDATE;
else if (!strcmp(buf, "remaining"))
return FS_REMAINING;
else if (!strcmp(buf, "message"))
return FS_MESSAGE;
else if (!strcmp(buf, "noteid"))
@ -1234,12 +1237,89 @@ static void print_date(long date, long day, const char *extformat)
}
}
/* Print a time difference to stdout. */
static void print_datediff(long date, const char *extformat)
{
const char *p;
const char *numfmt;
bool usetotal;
long value;
time_t difference;
difference = difftime(date, now());
if (!strcmp(extformat, "epoch")) {
printf("%ld", difference);
} else {
if (extformat[0] == '\0' || !strcmp(extformat, "default")) {
/* Set a default format if none specified. */
p = "%EH:%M";
} else {
p = extformat;
}
while (*p) {
if (*p == '%') {
p++;
/* Default is to zero-pad, and assume
* the user wants the time unit modulo
* the next biggest time unit. */
numfmt = "%02d";
usetotal = FALSE;
if (*p == '-') {
numfmt = "%d";
p++;
}
if (*p == 'E') {
usetotal = TRUE;
p++;
}
switch (*p) {
case '\0':
return;
case 'd':
value = difference / DAYINSEC;
printf(numfmt, value);
break;
case 'H':
value = difference / HOURINSEC;
if (!usetotal)
value %= DAYINHOURS;
printf(numfmt, value);
break;
case 'M':
value = difference / MININSEC;
if (!usetotal)
value %= HOURINMIN;
printf(numfmt, value);
break;
case 'S':
value = difference;
if (!usetotal)
value %= MININSEC;
printf(numfmt, value);
break;
case '%':
putchar('%');
break;
default:
putchar('?');
break;
}
} else {
putchar(*p);
}
p++;
}
}
}
/* Print a formatted appointment to stdout. */
void print_apoint(const char *format, long day, struct apoint *apt)
{
const char *p;
char extformat[FS_EXT_MAXLEN];
for (p = format; *p; p++) {
if (*p == '%') {
p++;
@ -1254,6 +1334,9 @@ void print_apoint(const char *format, long day, struct apoint *apt)
print_date(apt->start + apt->dur, day,
extformat);
break;
case FS_REMAINING:
print_datediff(apt->start, extformat);
break;
case FS_MESSAGE:
printf("%s", apt->mesg);
break;