From 683f205402a99cfc8cea46c83ce9b46a42616d42 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Sat, 16 Dec 2023 12:40:10 +0100 Subject: All kinds of stuff MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- testutil/parse-signed.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 testutil/parse-signed.c (limited to 'testutil/parse-signed.c') diff --git a/testutil/parse-signed.c b/testutil/parse-signed.c new file mode 100644 index 0000000..0fea405 --- /dev/null +++ b/testutil/parse-signed.c @@ -0,0 +1,56 @@ +/* See LICENSE file for copyright and license details. */ +#include "../libsyscalls.h" + +#include +#include +#include +#include + +#if defined(__clang__) +# pragma clang diagnostic ignored "-Wunsafe-buffer-usage" /* clang is just being silly */ +#endif + + +int +main(int argc, char **argv) +{ + int sign, neg = -1; + size_t bits; + const char *xval; + enum libsyscalls_error err; + unsigned long long int value; + char *end; + + if (argc != 4) { + usage: + fprintf(stderr, "usage error\n"); + return 1; + } + + sign = atoi(argv[1]); + bits = (unsigned long long int)atoll(argv[2]); + xval = argv[3]; + errno = 0; + value = strtoull(xval, &end, 16); + if (errno || *end) + goto usage; + + err = libsyscalls_parse_signed_integer(value, (enum libsyscalls_datatype_sign_representation)sign, bits, &value, &neg); + if (err == LIBSYSCALLS_E_INVAL) { + printf("inval\n"); + goto out; + } else if (err) { + libsyscalls_perror(NULL, err); + return 1; + } + if (neg != 0 && neg != 1) + abort(); + printf("%.*s%0*llX\n", neg, "-", (int)strlen(xval), value); + +out: + if (fflush(stdout) || fclose(stdout)) { + perror(NULL); + return 1; + } + return 0; +} -- cgit v1.2.3-70-g09d2