status

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

Commit: 753429c84ef37eed2a792e43c5110f0d356365fb
Parent: f7dc79f0d995d0652b4e5d512d98b30d2cb64e7f
Author: Randy Palamar
Date:   Sun,  9 Mar 2025 07:04:00 -0600

drop strtol usage

Diffstat:
Mstatus.c | 32+++++++++++++++++++++-----------
1 file changed, 21 insertions(+), 11 deletions(-)

diff --git a/status.c b/status.c @@ -12,9 +12,12 @@ #include <unistd.h> #include <X11/Xlib.h> -#define ABS(a) ((a) < 0 ? -(a) : (a)) -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#define ARRAY_COUNT(a) (sizeof(a) / sizeof(*a)) +#define ABS(a) ((a) < 0 ? -(a) : (a)) +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define BETWEEN(x, a, b) ((x) >= (a) && (x) <= (b)) +#define ARRAY_COUNT(a) (sizeof(a) / sizeof(*a)) + +#define I64_MAX INT64_MAX #define BLOCKLEN 128 #define ISSPACE(c) ((c) == ' ' || (c) == '\n' || (c) == '\t') @@ -106,8 +109,6 @@ static FileWatch file_watches; static i32 dflag; -i64 strtol(const char *, char **, i32); - static void die(const char *errstr, ...) { @@ -141,14 +142,23 @@ read_s8(char *path, s8 buffer) static i64 read_i64(char *path) { - i64 result = 0; char buffer[64]; - s8 str = read_s8(path, (s8){.len = sizeof(buffer), .data = (u8 *)buffer}); - if (str.len > 0) { - buffer[MIN(str.len, sizeof(buffer) - 1)] = 0; - result = strtol(buffer, 0, 10); + s8 s = read_s8(path, (s8){.len = sizeof(buffer), .data = (u8 *)buffer}); + + i64 result = 0; + i64 i = s.len && (s.data[0] == '-' || s.data[0] == '+'); + i64 sign = (s.len && s.data[0] == '-') ? -1 : 1; + + for (; i < s.len && BETWEEN(s.data[i], '0', '9'); i++) { + i32 digit = (i32)s.data[i] - '0'; + if (result > (I64_MAX - digit) / 10) { + result = I64_MAX; + } else { + result = 10 * result + digit; + } } - return result; + + return sign * result; } static void *