Files
lbmk/util/sbase/libutil/parseoffset.c
Leah Rowe e9a910b33c config/git: import suckless sbase
i currently use the output of sha512sum in several
places of xbmk, which is a bit unreliable in case
output changes.

other cases where i use util outputs in variables
are probably reliable, because i'm using mostly
posix utilities in those.

to mitigate this, i now import suckless sbase, which
has a reasonable sha512sum implementation.

*every* binary it builds is being placed in build.list,
because i'll probably start using more of them.

for example, i may start modifying the "date"
implementation, adding the GNU-specific options that
i need as mentioned on init.sh

i'm importing it in util/ because the sha512sum
util is needed for verifying project sources, so
if sbase itself is a "project source", that means
we can into a chicken and egg bootstrapping problem.

this is sbase at revision:
055cc1ae1b3a13c3d8f25af0a4a3316590efcd48

Signed-off-by: Leah Rowe <leah@libreboot.org>
2025-10-04 09:20:12 +01:00

62 lines
1.1 KiB
C

/* See LICENSE file for copyright and license details. */
#include <ctype.h>
#include <errno.h>
#include <inttypes.h>
#include <stdlib.h>
#include <string.h>
#include "../util.h"
off_t
parseoffset(const char *str)
{
off_t res, scale = 1;
char *end;
/* strictly check what strtol() usually would let pass */
if (!str || !*str || isspace(*str) || *str == '+' || *str == '-') {
weprintf("parseoffset %s: invalid value\n", str);
return -1;
}
errno = 0;
res = strtol(str, &end, 0);
if (errno) {
weprintf("parseoffset %s: invalid value\n", str);
return -1;
}
if (res < 0) {
weprintf("parseoffset %s: negative value\n", str);
return -1;
}
/* suffix */
if (*end) {
switch (toupper((int)*end)) {
case 'B':
scale = 512L;
break;
case 'K':
scale = 1024L;
break;
case 'M':
scale = 1024L * 1024L;
break;
case 'G':
scale = 1024L * 1024L * 1024L;
break;
default:
weprintf("parseoffset %s: invalid suffix '%s'\n", str, end);
return -1;
}
}
/* prevent overflow */
if (res > (SSIZE_MAX / scale)) {
weprintf("parseoffset %s: out of range\n", str);
return -1;
}
return res * scale;
}