diff options
author | Lukas Fleischer <calcurse@cryptocrack.de> | 2012-04-13 18:44:32 +0200 |
---|---|---|
committer | Lukas Fleischer <calcurse@cryptocrack.de> | 2012-04-17 11:10:11 +0200 |
commit | b73ce859dbbd694f5096626a6db224127a16c8a7 (patch) | |
tree | 15e1f7c6684b0c4dd3391f5aa912dac30f4f3409 | |
parent | cd4f8bb68fbdd0983a2375202134c560878de3ac (diff) | |
download | calcurse-b73ce859dbbd694f5096626a6db224127a16c8a7.tar.gz calcurse-b73ce859dbbd694f5096626a6db224127a16c8a7.zip |
Add support for long format specifiers
Adds following long format specifiers for each short format specifier:
* s: (start)
* S: (startstr)
* d: (duration)
* e: (end)
* E: (endstr)
* m: (message)
* n: (noteid)
* N: (note)
* p: (priority)
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
-rw-r--r-- | src/utils.c | 48 |
1 files changed, 43 insertions, 5 deletions
diff --git a/src/utils.c b/src/utils.c index aa52977..c5e2ce6 100644 --- a/src/utils.c +++ b/src/utils.c @@ -49,6 +49,8 @@ #define ISLEAP(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0) +#define FS_EXT_MAXLEN 64 + enum format_specifier { FS_STARTDATE, FS_STARTDATESTR, @@ -1080,9 +1082,12 @@ print_escape (const char *s) /* Parse a format specifier. */ static enum format_specifier -parse_fs (const char *s) +parse_fs (const char **s) { - switch (*s) + char buf[FS_EXT_MAXLEN]; + int i; + + switch (**s) { case 's': return FS_STARTDATE; @@ -1102,6 +1107,39 @@ parse_fs (const char *s) return FS_NOTEFILE; case 'p': return FS_PRIORITY; + case '(': + /* Long format specifier. */ + for ((*s)++, i = 0; **s != ')'; (*s)++, i++) + { + if (**s == '\0') + return FS_EOF; + + if (i < FS_EXT_MAXLEN) + buf[i] = **s; + } + + buf[(i < FS_EXT_MAXLEN) ? i : FS_EXT_MAXLEN - 1] = '\0'; + + if (!strcmp (buf, "start")) + return FS_STARTDATE; + else if (!strcmp (buf, "startstr")) + return FS_STARTDATESTR; + else if (!strcmp (buf, "duration")) + return FS_DURATION; + else if (!strcmp (buf, "end")) + return FS_ENDDATE; + else if (!strcmp (buf, "endstr")) + return FS_ENDDATESTR; + else if (!strcmp (buf, "message")) + return FS_MESSAGE; + else if (!strcmp (buf, "noteid")) + return FS_NOTE; + else if (!strcmp (buf, "note")) + return FS_NOTEFILE; + else if (!strcmp (buf, "priority")) + return FS_PRIORITY; + else + return FS_UNKNOWN; case '%': return FS_PSIGN; case '\0': @@ -1124,7 +1162,7 @@ print_apoint (const char *format, long day, struct apoint *apt) { if (*p == '%') { p++; - switch (parse_fs (p)) + switch (parse_fs (&p)) { case FS_STARTDATE: printf ("%ld", apt->start); @@ -1178,7 +1216,7 @@ print_event (const char *format, long day, struct event *ev) { if (*p == '%') { p++; - switch (parse_fs (p)) + switch (parse_fs (&p)) { case FS_MESSAGE: printf ("%s", ev->mesg); @@ -1244,7 +1282,7 @@ print_todo (const char *format, struct todo *todo) { if (*p == '%') { p++; - switch (parse_fs (p)) + switch (parse_fs (&p)) { case FS_PRIORITY: printf ("%d", abs (todo->id)); |