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:
parent
fb61744f33
commit
18b6e360b8
83
src/utils.c
83
src/utils.c
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user