diff --git a/src/print_volume.c b/src/print_volume.c index 89955a8..0331ed5 100644 --- a/src/print_volume.c +++ b/src/print_volume.c @@ -31,6 +31,8 @@ #include "i3status.h" #include "queue.h" +#define STRING_SIZE 10 + #define ALSA_VOLUME(channel) \ err = snd_mixer_selem_get_##channel##_dB_range(elem, &min, &max) || \ snd_mixer_selem_get_##channel##_dB(elem, 0, &val); \ @@ -48,30 +50,20 @@ fmt = fmt_muted; \ } -static char *apply_volume_format(const char *fmt, char *outwalk, int ivolume, const char *devicename) { - const char *walk = fmt; +static char *apply_volume_format(const char *fmt, char *buffer, int ivolume, const char *devicename) { + char string_volume[STRING_SIZE]; - for (; *walk != '\0'; walk++) { - if (*walk != '%') { - *(outwalk++) = *walk; + snprintf(string_volume, STRING_SIZE, "%d%s", ivolume, pct_mark); - } else if (BEGINS_WITH(walk + 1, "%")) { - outwalk += sprintf(outwalk, "%s", pct_mark); - walk += strlen("%"); + placeholder_t placeholders[] = { + {.name = "%%", .value = pct_mark}, + {.name = "%volume", .value = string_volume}, + {.name = "%devicename", .value = devicename}}; - } else if (BEGINS_WITH(walk + 1, "volume")) { - outwalk += sprintf(outwalk, "%d%s", ivolume, pct_mark); - walk += strlen("volume"); + const size_t num = sizeof(placeholders) / sizeof(placeholder_t); + buffer = format_placeholders(fmt, &placeholders[0], num); - } else if (BEGINS_WITH(walk + 1, "devicename")) { - outwalk += sprintf(outwalk, "%s", devicename); - walk += strlen("devicename"); - - } else { - *(outwalk++) = '%'; - } - } - return outwalk; + return buffer; } void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char *fmt_muted, const char *device, const char *mixer, int mixer_idx) { @@ -119,11 +111,11 @@ void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char * /* negative result means error, stick to 0 */ if (ivolume < 0) ivolume = 0; - outwalk = apply_volume_format(muted ? fmt_muted : fmt, - outwalk, - ivolume, - description); - goto out; + buffer = apply_volume_format(muted ? fmt_muted : fmt, + buffer, + ivolume, + description); + goto out_with_format; } else if (!strcasecmp(device, "default") && pulse_initialize()) { /* no device specified or "default" set */ char description[MAX_SINK_DESCRIPTION_LEN]; @@ -136,11 +128,11 @@ void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char * START_COLOR("color_degraded"); pbval = 0; } - outwalk = apply_volume_format(muted ? fmt_muted : fmt, - outwalk, - ivolume, - description); - goto out; + buffer = apply_volume_format(muted ? fmt_muted : fmt, + buffer, + ivolume, + description); + goto out_with_format; } /* negative result or NULL description means error, fail PulseAudio attempt */ } @@ -242,10 +234,11 @@ void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char * ALSA_MUTE_SWITCH(capture) } - outwalk = apply_volume_format(fmt, outwalk, avg, mixer_name); + buffer = apply_volume_format(fmt, buffer, avg, mixer_name); snd_mixer_close(m); snd_mixer_selem_id_free(sid); + goto out_with_format; #endif #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) @@ -356,13 +349,20 @@ void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char * } #endif - outwalk = apply_volume_format(fmt, outwalk, vol & 0x7f, devicename); + buffer = apply_volume_format(fmt, buffer, vol & 0x7f, devicename); close(mixfd); + goto out_with_format; #endif out: - *outwalk = '\0'; if (!pbval) END_COLOR; OUTPUT_FULL_TEXT(buffer); + return; + +out_with_format: + if (!pbval) + END_COLOR; + OUTPUT_FULL_TEXT(buffer); + free(buffer); }