commit 193dd4032e8088ada2dc9dcedab8d7486e9305f5
parent 4e704929297371934cb5ace5fb59433f6c664c34
Author: lash <dev@holbrook.no>
Date: Tue, 16 Apr 2024 01:56:29 +0100
Add integer data padding
Diffstat:
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;
+}