summaryrefslogtreecommitdiff
path: root/src/print_ddate.c
diff options
context:
space:
mode:
authorMichael Stapelberg <michael@stapelberg.de>2012-03-25 20:55:55 +0200
committerMichael Stapelberg <michael@stapelberg.de>2012-03-25 22:05:00 +0200
commit12b1bfa9b8485de88b0bda82821c021aee197673 (patch)
treeb6d87f7ed5876109863a6599992e351509a30d58 /src/print_ddate.c
parentafb0525235c57fc4896633003a45bfb013af38d2 (diff)
Properly output JSON with libyajl
Diffstat (limited to 'src/print_ddate.c')
-rw-r--r--src/print_ddate.c56
1 files changed, 28 insertions, 28 deletions
diff --git a/src/print_ddate.c b/src/print_ddate.c
index 0401a3f..ca3ab0e 100644
--- a/src/print_ddate.c
+++ b/src/print_ddate.c
@@ -3,6 +3,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <yajl/yajl_gen.h>
#include "i3status.h"
@@ -62,76 +63,77 @@ struct disc_time {
};
/* Print the date *dt in format *format */
-int format_output(char *format, struct disc_time *dt) {
+static int format_output(char *outwalk, char *format, struct disc_time *dt) {
+ char *orig_outwalk = outwalk;
char *i;
char *tibs_end = 0;
for (i = format; *i != '\0'; i++) {
if (*i != '%') {
- putchar(*i);
+ *(outwalk++) = *i;
continue;
}
switch (*(i+1)) {
/* Weekday in long and abbreviation */
case 'A':
- printf("%s", day_long[dt->week_day]);
+ outwalk += sprintf(outwalk, "%s", day_long[dt->week_day]);
break;
case 'a':
- printf("%s", day_short[dt->week_day]);
+ outwalk += sprintf(outwalk, "%s", day_short[dt->week_day]);
break;
/* Season in long and abbreviation */
case 'B':
- printf("%s", season_long[dt->season]);
+ outwalk += sprintf(outwalk, "%s", season_long[dt->season]);
break;
case 'b':
- printf("%s", season_short[dt->season]);
+ outwalk += sprintf(outwalk, "%s", season_short[dt->season]);
break;
/* Day of the season (ordinal and cardinal) */
case 'd':
- printf("%d", dt->season_day + 1);
+ outwalk += sprintf(outwalk, "%d", dt->season_day + 1);
break;
case 'e':
- printf("%d", dt->season_day + 1);
+ outwalk += sprintf(outwalk, "%d", dt->season_day + 1);
switch (dt->season_day) {
case 0:
- printf("st");
+ outwalk += sprintf(outwalk, "st");
break;
case 1:
- printf("nd");
+ outwalk += sprintf(outwalk, "nd");
break;
case 2:
- printf("rd");
+ outwalk += sprintf(outwalk, "rd");
break;
default:
- printf("th");
+ outwalk += sprintf(outwalk, "th");
break;
}
break;
/* YOLD */
case 'Y':
- printf("%d", dt->year);
+ outwalk += sprintf(outwalk, "%d", dt->year);
break;
/* Holidays */
case 'H':
if (dt->season_day == 4) {
- printf(holidays[dt->season]);
+ outwalk += sprintf(outwalk, holidays[dt->season]);
}
if (dt->season_day == 49) {
- printf(holidays[dt->season + 5]);
+ outwalk += sprintf(outwalk, holidays[dt->season + 5]);
}
break;
/* Stop parsing the format string, except on Holidays */
case 'N':
if (dt->season_day != 4 && dt->season_day != 49) {
- return 0;
+ return (outwalk - orig_outwalk);
}
break;
/* Newline- and Tabbing-characters */
case 'n':
- printf("\n");
+ outwalk += sprintf(outwalk, "\n");
break;
case 't':
- printf("\t");
+ outwalk += sprintf(outwalk, "\t");
break;
/* The St. Tib's Day replacement */
case '{':
@@ -142,11 +144,11 @@ int format_output(char *format, struct disc_time *dt) {
}
if (dt->st_tibs_day) {
/* We outpt "St. Tib's Day... */
- printf("St. Tib's Day");
+ outwalk += sprintf(outwalk, "St. Tib's Day");
} else {
/* ...or parse the substring between %{ and %} ... */
*tibs_end = '\0';
- if (!format_output(i + 2, dt)) return 0;
+ outwalk += format_output(outwalk, i + 2, dt);
*tibs_end = '%';
}
/* ...and continue with the rest */
@@ -157,12 +159,12 @@ int format_output(char *format, struct disc_time *dt) {
break;
default:
/* No escape-sequence, so we just skip */
- printf("%%%c",*(i+1));
+ outwalk += sprintf(outwalk, "%%%c", *(i+1));
break;
}
i++;
}
- return 1;
+ return (outwalk - orig_outwalk);
}
/* Get the current date and convert it to discordian */
@@ -194,7 +196,8 @@ struct disc_time *get_ddate(struct tm *current_tm) {
return &dt;
}
-void print_ddate(const char *format, struct tm *current_tm) {
+void print_ddate(yajl_gen json_gen, char *buffer, const char *format, struct tm *current_tm) {
+ char *outwalk = buffer;
static char *form = NULL;
struct disc_time *dt;
if ((dt = get_ddate(current_tm)) == NULL)
@@ -202,10 +205,7 @@ void print_ddate(const char *format, struct tm *current_tm) {
if (form == NULL)
if ((form = malloc(strlen(format) + 1)) == NULL)
return;
- if (output_format == O_I3BAR)
- printf("{\"name\":\"ddate\", \"full_text\":\"");
strcpy(form, format);
- format_output(form, dt);
- if (output_format == O_I3BAR)
- printf("\"}");
+ outwalk += format_output(outwalk, form, dt);
+ OUTPUT_FULL_TEXT(buffer);
}