status

statusbar program for dwm
git clone anongit@rnpnr.xyz:status.git
Log | Files | Refs | Feed | README | LICENSE

Commit: 323074d3c82aac1e3b3cac04122daacd8add02ad
Parent: 72fd6fbe746ec0e764fd9b640618dbc36cca20d4
Author: opask
Date:   Mon, 15 Apr 2019 10:07:06 -0600

remove use of malloc(3) in favor of static allocation

Diffstat:
Mconfig.def.h | 2++
Mlinux.c | 12+++++++-----
Mopenbsd.c | 13++++++-------
Mstatus.c | 57++++++++++++++++++++++++---------------------------------
Mstatus.h | 6+++---
5 files changed, 42 insertions(+), 48 deletions(-)

diff --git a/config.def.h b/config.def.h @@ -1,3 +1,5 @@ +#define STATUSLEN 2048 + /* host for connecting to MPD, set to NULL for the MPD_HOST env variable */ static const char *mpdhost = "localhost"; diff --git a/linux.c b/linux.c @@ -6,7 +6,7 @@ #include "status.h" -int +const char * getvol(const char *card, const char *output) { snd_mixer_t *handle; @@ -36,10 +36,12 @@ getvol(const char *card, const char *output) snd_mixer_close(handle); snd_mixer_selem_id_free(sid); - return notmuted ? (int)vol : -1; + if (notmuted) + return bprintf("%d%%", (int)vol); + return bprintf("(muted)"); } -char * +const char * batinfo(const char *bat) { int perc; @@ -70,8 +72,8 @@ batinfo(const char *bat) h = timeleft; m = (timeleft - (double)h) * 60; - return smprintf("%d%% (%d:%02d)", perc, h, m); + return bprintf("%d%% (%d:%02d)", perc, h, m); } - return smprintf("%d%% (%s)", perc, state); + return bprintf("%d%% (%s)", perc, state); } diff --git a/openbsd.c b/openbsd.c @@ -5,13 +5,13 @@ #include "status.h" -int +const char * getvol(const char *card, const char *output) { - return 0; + return NULL; } -char * +const char * batinfo(const char *bat) { struct apm_power_info pi; @@ -30,11 +30,10 @@ batinfo(const char *bat) case APM_AC_OFF: return smprintf("%d%% (%d:%02d)", pi.battery_life, pi.minutes_left / 60, pi.minutes_left % 60); - case APM_BATT_CHARGING: - return smprintf("%d%% (charging)", pi.battery_life); case APM_AC_ON: - return smprintf("%d%% (external)", pi.battery_life); + case APM_BATT_CHARGING: + return bprintf("%d%% (ac)", pi.battery_life); default: - return smprintf("%d%% (unknown)", pi.battery_life); + return bprintf("%d%% (unknown)", pi.battery_life); } } diff --git a/status.c b/status.c @@ -33,25 +33,17 @@ terminate(int signo) done = 1; } -char * -smprintf(const char *fmt, ...) +const char * +bprintf(const char *fmt, ...) { + int ret; va_list ap; - char *ret; - int len; - - va_start(ap, fmt); - len = vsnprintf(NULL, 0, fmt, ap); - va_end(ap); - - if (!(ret = malloc(++len))) - die("malloc\n"); va_start(ap, fmt); - vsnprintf(ret, len, fmt, ap); + ret = vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); - return ret; + return (ret < 0)? NULL : buf; } int @@ -84,9 +76,9 @@ gettime(const char *fmt) { time_t t = time(NULL); if (!(strftime(buf, sizeof(buf), fmt, localtime(&t)))) - return smprintf(""); + return NULL; - return smprintf("%s", buf); + return buf; } static char * @@ -98,7 +90,7 @@ mpd(enum mpd_tag_type type) conn = mpd_connection_new(mpdhost, 0, 600); if (!conn || mpd_connection_get_error(conn)) - return smprintf(""); + return NULL; mpd_command_list_begin(conn, true); mpd_send_status(conn); @@ -122,17 +114,16 @@ mpd(enum mpd_tag_type type) mpd_response_finish(conn); mpd_connection_free(conn); - return smprintf("%s", buf); + return buf; } int main(void) { struct sigaction sa; - char *status; - char *time; - char *artist, *song; - int vol; + const char *s; + char status[STATUSLEN]; + size_t len; memset(&sa, 0, sizeof(sa)); sa.sa_handler = terminate; @@ -142,20 +133,20 @@ main(void) if (!(dpy = XOpenDisplay(NULL))) die("XOpenDisplay: can't open display\n"); - for (; !done; sleep(1)) { - time = gettime(timefmt); - song = mpd(MPD_TAG_TITLE); - artist = mpd(MPD_TAG_ARTIST); - vol = getvol(alsacard, alsaoutput); + for (len = 0; !done; sleep(1), len = 0) { + s = mpd(MPD_TAG_ARTIST); + len += snprintf(status + len, sizeof(status) - len, "[ %s -", s); - status = smprintf("[ %s - %s ][ %d%% ][ %s ]", artist, song, - vol, time); - setstatus(status); + s = mpd(MPD_TAG_TITLE); + len += snprintf(status + len, sizeof(status) - len, " %s ]", s); + + s = getvol(alsacard, alsaoutput); + len += snprintf(status + len, sizeof(status) - len, "[ %s ]", s); - free(time); - free(song); - free(artist); - free(status); + s = gettime(timefmt); + len += snprintf(status + len, sizeof(status) - len, "[ %s ]", s); + + setstatus(status); } XStoreName(dpy, DefaultRootWindow(dpy), NULL); diff --git a/status.h b/status.h @@ -1,6 +1,6 @@ void die(const char *errstr, ...); -char *smprintf(const char *fmt, ...); int pscanf(const char *path, const char *fmt, ...); +const char *bprintf(const char *fmt, ...); -int getvol(const char *card, const char *output); -char *batinfo(const char *bat); +const char *getvol(const char *card, const char *output); +const char *batinfo(const char *bat);