diff options
author | Michael Stapelberg <michael@stapelberg.de> | 2012-03-25 20:55:55 +0200 |
---|---|---|
committer | Michael Stapelberg <michael@stapelberg.de> | 2012-03-25 22:05:00 +0200 |
commit | 12b1bfa9b8485de88b0bda82821c021aee197673 (patch) | |
tree | b6d87f7ed5876109863a6599992e351509a30d58 /src/print_ddate.c | |
parent | afb0525235c57fc4896633003a45bfb013af38d2 (diff) |
Properly output JSON with libyajl
Diffstat (limited to 'src/print_ddate.c')
-rw-r--r-- | src/print_ddate.c | 56 |
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); } |