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:
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);