liblash

Basic tools written and used by lash in c programming.
Log | Files | Refs

commit 193dd4032e8088ada2dc9dcedab8d7486e9305f5
parent 4e704929297371934cb5ace5fb59433f6c664c34
Author: lash <dev@holbrook.no>
Date:   Tue, 16 Apr 2024 01:56:29 +0100

Add integer data padding

Diffstat:
Msrc/Makefile | 1+
Msrc/strip.c | 33+++++++++++++++++++++++++++++++--
Msrc/strip.h | 3++-
Msrc/tests/Makefile | 3+--
Msrc/tests/test_endian.c | 1+
Msrc/tests/test_strip.c | 120+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
6 files changed, 150 insertions(+), 11 deletions(-)

diff --git a/src/Makefile b/src/Makefile @@ -18,5 +18,6 @@ test: all shared: strip.so.o endian.so.o $(CC) $(CFLAGS) -shared -o liblash.so $^ + rm -vf *.so.o .PHONY: clean diff --git a/src/strip.c b/src/strip.c @@ -1,7 +1,6 @@ #include <stddef.h> - -char* zerostrip_be(char *value, size_t *len) { +char* strip_be(char *value, size_t *len) { int i; char *p; @@ -19,3 +18,33 @@ char* zerostrip_be(char *value, size_t *len) { } return p; } + +int strap_be(const char *in, size_t in_len, char *out, size_t out_len) { + int i; + int c; + char *p; + char mask; + + if (in_len > out_len) { + return 1; + } + if (in_len == 0) { + return 1; + } + + mask = 0; + if (*in & 0x80) { + mask = 0xff; + } + for (i = 0; i < 4; i++) { + *(out+i) = mask; + } + + c = out_len - in_len; + p = out + c; + for (i = 0; i < in_len; i++) { + *(p+i) = *(in+i); + } + + return 0; +} diff --git a/src/strip.h b/src/strip.h @@ -1,6 +1,7 @@ #ifndef LASH_BYTES_H_ #define LASH_BYTES_H_ -char* zerostrip_be(char *value, size_t *len); +char* strip_be(char *value, size_t *len); +int strap_be(const char *in, size_t in_len, char *out, size_t out_len); #endif diff --git a/src/tests/Makefile b/src/tests/Makefile @@ -1,7 +1,6 @@ TESTS := $(patsubst %.c,%.testbin,$(wildcard *.c)) LINKOBJS := $(wildcard ../*.o) -INCLUDES := -I.. -CFLAGS += $(INCLUDES) -g3 -Wall +CFLAGS += -I.. -Wall all: $(TESTS) diff --git a/src/tests/test_endian.c b/src/tests/test_endian.c @@ -2,6 +2,7 @@ #include <stdio.h> #include "endian.h" +#include "strip.h" int main() { diff --git a/src/tests/test_strip.c b/src/tests/test_strip.c @@ -1,9 +1,11 @@ +#include <string.h> #include <stddef.h> #include <stdio.h> #include "strip.h" +#include "endian.h" -int main() { +static int test_strip() { size_t l = 4; char be_int_semi[4] = {0x00, 0x00, 0x02, 0x9f}; char be_int_full[4] = {0x40, 0x00, 0x02, 0x9f}; @@ -12,7 +14,7 @@ int main() { char be_int_mini_zero[1] = {0x00}; char *r; - r = zerostrip_be((char*)be_int_semi, &l); + r = strip_be((char*)be_int_semi, &l); if (l != 2) { return 1; } @@ -21,7 +23,7 @@ int main() { } l = 4; - r = zerostrip_be((char*)be_int_full, &l); + r = strip_be((char*)be_int_full, &l); if (l != 4) { return 1; } @@ -30,7 +32,7 @@ int main() { } l = 4; - r = zerostrip_be((char*)be_int_zero, &l); + r = strip_be((char*)be_int_zero, &l); if (l != 1) { return 1; } @@ -39,7 +41,7 @@ int main() { } l = 1; - r = zerostrip_be((char*)be_int_mini, &l); + r = strip_be((char*)be_int_mini, &l); if (l != 1) { return 1; } @@ -48,7 +50,7 @@ int main() { } l = 1; - r = zerostrip_be((char*)be_int_mini_zero, &l); + r = strip_be((char*)be_int_mini_zero, &l); if (l != 1) { return 1; } @@ -58,3 +60,109 @@ int main() { return 0; } + +static int test_strap() { + int r; + char v_neg[] = {0xfe, 0xf2, 0x00, 0x00}; + char v_pos[] = {0x02, 0x9a, 0x00, 0x00}; + char v_full[] = {0x2a, 0x13, 0x24, 0x35}; + char v_full_neg[] = {0xfa, 0x13, 0x24, 0x35}; + char out[4]; + int *p; + + memset(out, 0, 4); + r = strap_be(v_neg, 2, out, 4); + if (r) { + return r; + } + if (is_le()) { + flip_endian(4, out); + } + p = (int*)out; + if (*p != -270) { + return 1; + } + + memset(out, 0, 4); + r = strap_be(v_pos, 2, out, 4); + if (r) { + return r; + } + if (is_le()) { + flip_endian(4, out); + } + p = (int*)out; + if (*p != 666) { + return 1; + } + + memset(out, 0, 4); + r = strap_be(v_full, 1, out, 4); + if (r) { + return r; + } + if (is_le()) { + flip_endian(4, out); + } + p = (int*)out; + if (*p != 42) { + return 1; + } + + memset(out, 0, 4); + r = strap_be(v_full, 3, out, 4); + if (r) { + return r; + } + if (is_le()) { + flip_endian(4, out); + } + p = (int*)out; + if (*p != 2757412) { + return 1; + } + + memset(out, 0, 4); + r = strap_be(v_full, 4, out, 4); + if (r) { + return r; + } + if (is_le()) { + flip_endian(4, out); + } + p = (int*)out; + if (*p != 705897525) { + return 1; + } + + memset(out, 0, 4); + r = strap_be(v_full_neg, 4, out, 4); + if (r) { + return r; + } + if (is_le()) { + flip_endian(4, out); + } + p = (int*)out; + if (*p != -99408843) { + return 1; + } + + return 0; +} + +int main() { + int r; + + r = test_strip(); + if (r) { + return r; + } + + r = test_strap(); + if (r) { + return r; + } + + return 0; +}