commit 5c93383795fb813a318de494f9b4b7b630b11303
parent f0269812459bd5753d344fc1c170b52d6df276a0
Author: lash <dev@holbrook.no>
Date: Fri, 31 May 2024 20:09:05 +0100
Manual merge previous separate code objects
Diffstat:
20 files changed, 796 insertions(+), 13 deletions(-)
diff --git a/Makefile b/Makefile
@@ -1,4 +1,7 @@
-all: shared
+VERSION=0.0.1
+
+all:
+ make -C src all
shared:
make -C src shared
@@ -11,4 +14,7 @@ test: src
clean:
make -C src clean
+archive:
+ git archive --format=tar.gz HEAD liblash-$(VERSION).tar.gz
+
.PHONY: clean
diff --git a/src/Makefile b/src/Makefile
@@ -1,23 +1,33 @@
OBJS := $(patsubst %.c,%.o,$(wildcard *.c))
CFLAGS += -Wall -Werror
-all: $(OBJS)
-
-%.o: %.c
- $(CC) $(CFLAGS) -c $< -o $@
+all:
+ make -C endian all
+ make -C hex all
+ make -C llog all
+ make -C rerr all
+ #make -C case all
clean:
- make -C tests clean
- rm -vf *.o
+ make -C endian clean
+ make -C hex clean
+ make -C llog clean
+ make -C rerr clean
+ #make -C case clean
test: all
- make -C tests test
+ make -C endian test
+ make -C hex test
+ make -C llog test
+ make -C rerr test
+ #make -C case test
-%.so.o: %.c
- $(CC) $(CFLAGS) -c $< -o $@ -fpic
+shared: endian hex
+ make -C endian shared
+ make -C hex shared
+ make -C llog shared
+ make -C rerr shared
+ $(CC) $(CFLAGS) -shared -o liblash.so endian/strip.so.o endian/endian.so.o hex/hex.so.o llog/llog.so.o rerr/rerr.so.o
-shared: strip.so.o endian.so.o
- $(CC) $(CFLAGS) -shared -o liblash.so $^
- rm -vf *.so.o
.PHONY: clean
diff --git a/src/endian/Makefile b/src/endian/Makefile
@@ -0,0 +1,23 @@
+OBJS := $(patsubst %.c,%.o,$(wildcard *.c))
+SOBJS := $(patsubst %.c,%.so.o,$(wildcard *.c))
+CFLAGS += -Wall -Werror
+VERSION = 0.0.1
+
+
+all: $(OBJS)
+
+%.o: %.c
+ $(CC) $(CFLAGS) -c $< -o $@
+
+clean:
+ rm -vf *.o
+
+%.so.o: %.c
+ $(CC) $(CFLAGS) -c $< -o $@ -fpic
+
+shared: $(SOBJS)
+
+test: all
+
+.PHONY: clean
+
diff --git a/src/endian.c b/src/endian/endian.c
diff --git a/src/endian.h b/src/endian/endian.h
diff --git a/src/strip.c b/src/endian/strip.c
diff --git a/src/strip.h b/src/endian/strip.h
diff --git a/src/hex/Makefile b/src/hex/Makefile
@@ -0,0 +1,29 @@
+OBJS := $(patsubst %.c,%.o,$(filter-out test.c,$(wildcard *.c)))
+SOBJS := $(patsubst %.c,%.so.o,$(filter-out test.c,$(wildcard *.c)))
+INCLUDES := -I.
+CFLAGS += $(INCLUDES)
+VERSION = 0.0.1
+CFLAGS += -Wall -Werror
+
+all: $(OBJS)
+
+test: all
+ $(CC) $(CFLAGS) test.c hex.o -o test.out $(LDFLAGS)
+
+%.o: %.c
+ $(CC) $(CFLAGS) -c $< -o $@ $(LDFLAGS)
+
+clean:
+ rm -vf *.o
+ rm -vf *.out
+ rm -vf *.tar.gz
+
+archive:
+ git archive --format=tar.gz HEAD -o hex-$(VERSION).tar.gz
+
+%.so.o: %.c
+ $(CC) $(CFLAGS) -c $< -o $@ -fpic
+
+shared: $(SOBJS)
+
+
diff --git a/src/hex/hex.c b/src/hex/hex.c
@@ -0,0 +1,92 @@
+char *_x = "0123456789abcdef";
+
+void b2c(char in, char *out) {
+ int v;
+
+ v = (in & 0xf0) >> 4;
+ *out = *(_x+v);
+ v = in & 0x0f;
+ *(out+1) = *(_x+v);
+}
+
+void b2h(const unsigned char *in, int l, unsigned char *out) {
+ int i;
+ char *p;
+
+ p = (char*)out;
+ for (i = 0; i < l; i++) {
+ b2c(*(in+i), p);
+ p += 2;
+ }
+ *p = 0;
+}
+
+char* c2h(char in, char *out) {
+ char i;
+ i = in & 0x0f;
+ *(out+1) = *(_x+i);
+ in >>= 4;
+ i = in & 0x0f;
+ *out = *(_x+i);
+ return out;
+}
+
+int n2b(const char in, char *out) {
+ if (out == 0x0) {
+ return 1;
+ }
+
+ if (in >= '0' && in <= '9') {
+ *out = in - '0';
+ } else if (in >= 'A' && in <= 'F') {
+ *out = in - 'A' + 10;
+ } else if (in >= 'a' && in <= 'f') {
+ *out = in - 'a' + 10;
+ } else {
+ return 1;
+ }
+
+ return 0;
+}
+
+int h2b(const char *in, unsigned char *out) {
+ int r;
+ int i;
+ char b1;
+ char b2;
+ char *po;
+ char *pi;
+
+ if (in == 0x0 || *in == '\0' || out == 0x0) {
+ return 0;
+ }
+
+ i = 0;
+ po = (char*)out;
+ pi = (char*)in;
+ while (1) {
+ if (*pi == 0) {
+ break;
+ }
+ r = n2b(*pi, &b1);
+ if (r) {
+ return 0;
+ }
+ pi++;
+ if (*pi == 0) { // we dont allow cut strings
+ return 0;
+ }
+ r = n2b(*pi, &b2);
+ if (r) {
+ return 0;
+ }
+ pi++;
+
+ //(*out)[i] = (b1 << 4) | b2;
+ *po = (b1 << 4) | b2;
+ po++;
+ i++;
+ }
+ return i;
+
+}
diff --git a/src/hex/hex.h b/src/hex/hex.h
@@ -0,0 +1,10 @@
+#ifndef LASH_HEX_H_
+#define LASH_HEX_H_
+
+void b2c(char in, char *out);
+int c2b(const char in, char *out);
+int h2b(const char *in, unsigned char *out);
+void b2h(const unsigned char *in, int l, unsigned char *out);
+char* c2h(char in, char *out);
+
+#endif
diff --git a/src/hex/test.c b/src/hex/test.c
@@ -0,0 +1,53 @@
+#include <string.h>
+
+#include "hex.h"
+
+char test_bin[] = {0xde, 0xad, 0xbe, 0xef};
+char test_hex[] = "deadbeef";
+char *test_empty = "";
+
+int test_from_string() {
+ int i;
+ char v[4];
+ int r;
+
+ r = h2b(test_hex, v);
+ if (r != 4) {
+ return 1;
+ }
+ for (i = 0; i < 4; i++) {
+ if (test_bin[i] != v[i]) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+int test_from_bin() {
+ int r;
+ char v[9];
+
+ b2h(test_bin, 4, v);
+ if (strcmp(v, test_hex)) {
+ return 1;
+ }
+ return 0;
+}
+
+
+int main() {
+ int r;
+
+ r = test_from_string();
+ if (r) {
+ return 1;
+ }
+
+ r = test_from_bin();
+ if (r) {
+ return 1;
+ }
+
+
+ return 0;
+}
diff --git a/src/llog/Makefile b/src/llog/Makefile
@@ -0,0 +1,28 @@
+OBJS := $(patsubst %.c,%.o,$(filter-out test.c,$(wildcard *.c)))
+SOBJS := $(patsubst %.c,%.so.o,$(filter-out test.c,$(wildcard *.c)))
+INCLUDES := -I.
+CFLAGS += $(INCLUDES)
+VERSION = 0.0.1
+
+all: $(OBJS)
+
+test: all
+ $(CC) $(CFLAGS) test.c llog.o hex.o -o test.out $(LDFLAGS)
+
+%.o: %.c
+ $(CC) $(CFLAGS) -c $< -o $@ $(LDFLAGS)
+
+clean:
+ rm -vf *.o
+ rm -vf *.out
+ rm -vf *.tar.gz
+
+archive:
+ git archive --format=tar.gz HEAD -o llog-$(VERSION).tar.gz
+
+%.so.o: %.c
+ $(CC) $(CFLAGS) -c $< -o $@ -fpic
+
+shared: $(SOBJS)
+
+
diff --git a/src/llog/hex.c b/src/llog/hex.c
@@ -0,0 +1,21 @@
+#include <stdio.h>
+
+char *_x = "0123456789abcdef";
+
+void b2h(const unsigned char *data, int l, unsigned char *zHex) {
+ unsigned int i;
+
+ for (i = 0; i < l; i++) {
+ sprintf((char*)zHex+(i*2), "%02x", *(data+i));
+ }
+}
+
+char* c2h(char in, char *out) {
+ char i;
+ i = in & 0x0f;
+ *(out+1) = *(_x+i);
+ in >>= 4;
+ i = in & 0x0f;
+ *out = *(_x+i);
+ return out;
+}
diff --git a/src/llog/llog.c b/src/llog/llog.c
@@ -0,0 +1,236 @@
+#include "llog.h"
+
+extern void b2h(const unsigned char *b, int l, char *hx);
+extern char* c2h(char in, char *out);
+
+
+char lloglvl_str[][4] = {
+ "???",
+ "crt",
+ "err",
+ "wrn",
+ "inf",
+ "dbg",
+ "gru",
+ "usr",
+};
+
+char _llogbuf_v[LLOG_LENGTH];
+char* _llogbuf = (char*)_llogbuf_v;
+int _llogbuf_crsr;
+
+static int cpy(const char *s) {
+ char *p;
+ int c;
+
+ p = _llogbuf + _llogbuf_crsr;
+ c = 0;
+ while (1) {
+ if (*s == 0) {
+ break;
+ }
+ *p = *s;
+ s++;
+ p++;
+ c++;
+ }
+ return c;
+}
+
+static int pfxfmt(char *v) {
+ int c;
+ char *p;
+
+ p = _llogbuf + _llogbuf_crsr;
+
+ *p = '[';
+ p++;
+ _llogbuf_crsr++;
+
+ c = cpy(v);
+ p += c;
+
+ *p = ']';
+ c++;
+ _llogbuf_crsr += c;
+
+ return c+1;
+}
+
+static int lvlfmt(enum lloglvl_e lvl) {
+ char *v;
+
+ v = lloglvl_str[(int)lvl];
+
+ return pfxfmt(v);
+}
+
+static char* kvstart(char *k) {
+ char *p;
+ int c;
+
+ p = _llogbuf + _llogbuf_crsr;
+ *p = 0x09;
+ p++;
+
+ _llogbuf_crsr++;
+ c = cpy(k);
+ p += c;
+ *p = '=';
+ c++;
+
+ _llogbuf_crsr += c;
+
+ return _llogbuf + _llogbuf_crsr;
+}
+
+char *llog_new(enum lloglvl_e lvl, char *msg) {
+ char *p;
+ int c;
+
+ _llogbuf_crsr = 0;
+ c = lvlfmt(lvl);
+ p = _llogbuf + c;
+ *p = ' ';
+ p++;
+ _llogbuf_crsr++;
+
+ c = cpy(msg);
+ _llogbuf_crsr += c;
+ p += c;
+ *p = 0;
+
+ return _llogbuf;
+}
+
+char *llog_new_ns(enum lloglvl_e lvl, char *msg, char *ns) {
+ char *p;
+ int c;
+
+ _llogbuf_crsr = 0;
+ c = pfxfmt(ns);
+ p = _llogbuf + c;
+ c = lvlfmt(lvl);
+ p += c;
+
+ *p = ' ';
+ p++;
+ _llogbuf_crsr++;
+ c = cpy(msg);
+
+ _llogbuf_crsr += c;
+ p += c;
+ *p = 0;
+
+ return _llogbuf;
+}
+
+char* llog_add_s(const char *k, char *v) {
+ char *p;
+ int c;
+
+ p = kvstart((char*)k);
+ c = 0;
+ while (1) {
+ if (*v == 0) {
+ break;
+ }
+ *p = *v;
+ p++;
+ c++;
+ v++;
+ }
+
+ _llogbuf_crsr += c;
+ *p = 0;
+
+ return _llogbuf;
+}
+
+
+char* llog_add_n(const char *k, long long v) {
+ char *p;
+ int c;
+ char i;
+ long long r;
+ char *b;
+
+ r = 0;
+ p = kvstart((char*)k);
+ c = 0;
+ b = (char*)&r;
+ b += (sizeof(r) - 1);
+ while (v != 0) {
+ i = v % 10;
+ i += 0x30;
+ *b = i;
+ b--;
+ c++;
+ v /= 10;
+ }
+ for (i = 0; i < c; i++) {
+ b++;
+ *p = *b;
+ p++;
+ }
+
+ _llogbuf_crsr += c;
+ *p = 0;
+
+ return _llogbuf;
+}
+
+char* llog_add_x(const char *k, long long v) {
+ char *p;
+ int c;
+ char i;
+ char *b;
+
+ p = kvstart((char*)k);
+ c = 0;
+ b = (char*)&v;
+ b += (sizeof(v) - 1);
+
+ i = 0;
+ while (*b == 0 && i < 8) {
+ b--;
+ i++;
+ }
+
+ if (i == 8) {
+ b++;
+ i--;
+ }
+ *p = '0';
+ p++;
+ *p = 'x';
+ p++;
+ c = 2;
+ for (; i < 8; i++) {
+ c2h(*b, p);
+ p += 2;
+ c += 2;
+ b--;
+ }
+
+ _llogbuf_crsr += c;
+ *p = 0;
+
+ return _llogbuf;
+}
+
+
+char* llog_add_b(const char *k, void *v, int l) {
+ char *p;
+ int c;
+
+ c = 0;
+ p = kvstart((char*)k);
+ b2h(v, l, p);
+ c += (l * 2);
+ _llogbuf_crsr += c;
+ p += c;
+ *p = 0;
+
+ return _llogbuf;
+}
diff --git a/src/llog/llog.h b/src/llog/llog.h
@@ -0,0 +1,30 @@
+#ifndef LLOG_H_
+#define LLOG_H_
+
+#define LLOG_LENGTH 1024
+
+#ifndef LLOG_DEFAULT_NS
+#define LLOG_DEFAULT_NS "llog"
+#endif
+
+enum lloglvl_e {
+ LLOG_NONE = 0,
+ LLOG_CRITICAL,
+ LLOG_ERROR,
+ LLOG_WARNING,
+ LLOG_INFO,
+ LLOG_DEBUG,
+ LLOG_GURU,
+ LLOG_USR,
+ LLOG_N_LEVELS,
+};
+
+char* llog_new(enum lloglvl_e lvl, char *msg);
+char* llog_new_ns(enum lloglvl_e lvl, char *msg, char *ns);
+char* llog_add_s(const char *k, char *v);
+char* llog_add_n(const char *k, long long v);
+char* llog_add_x(const char *k, long long v);
+char* llog_add_b(const char *k, void *v, int l);
+extern void llog_out(const char *v);
+
+#endif
diff --git a/src/llog/test.c b/src/llog/test.c
@@ -0,0 +1,53 @@
+#include <stdio.h>
+#include <string.h>
+
+#include "llog.h"
+
+void llog_out(const char *v) {
+ fprintf(stderr, "%s\n", v);
+}
+
+int main() {
+ char *p;
+ char beef[] = { 0xbe, 0xef };
+
+ p = llog_new(LLOG_CRITICAL, "foo");
+ if (strcmp("[crt] foo", p)) {
+ return 1;
+ }
+ llog_out(p);
+
+ p = llog_add_s("bar", "baz");
+ if (strcmp("[crt] foo\tbar=baz", p)) {
+ return 1;
+ }
+
+ p = llog_add_n("xyzzy", 42);
+ if (strcmp("[crt] foo\tbar=baz\txyzzy=42", p)) {
+ return 1;
+ }
+
+ p = llog_add_b("dead", (void*)beef, 2);
+ if (strcmp("[crt] foo\tbar=baz\txyzzy=42\tdead=beef", p)) {
+ return 1;
+ }
+
+ p = llog_new_ns(LLOG_CRITICAL, "pinky", "inky");
+ if (strcmp("[inky][crt] pinky", p)) {
+ return 1;
+ }
+
+ p = llog_add_s("blinky", "clyde");
+ if (strcmp("[inky][crt] pinky\tblinky=clyde", p)) {
+ return 1;
+ }
+
+ p = llog_new(LLOG_INFO, "foo");
+ p = llog_add_x("bar", 666);
+ if (strcmp("[inf] foo\tbar=0x029a", p)) {
+ return 1;
+ }
+
+
+ return 0;
+}
diff --git a/src/rerr/Makefile b/src/rerr/Makefile
@@ -0,0 +1,27 @@
+OBJS := $(patsubst %.c,%.o,$(filter-out test.c,$(wildcard *.c)))
+SOBJS := $(patsubst %.c,%.so.o,$(filter-out test.c,$(wildcard *.c)))
+INCLUDES := -I.
+CFLAGS += $(INCLUDES) -DRERR -DRERR_N_PFX=2
+VERSION = 0.0.1
+
+all: $(OBJS)
+
+test: all
+ $(CC) $(CFLAGS) test.c rerr.o -o test.out $(LDFLAGS)
+
+%.o: %.c
+ $(CC) $(CFLAGS) -c $< -o $@ $(LDFLAGS)
+
+clean:
+ rm -vf *.o
+ rm -vf *.out
+
+archive:
+ git archive --format=tar.gz HEAD -o rerr-$(VERSION).tar.gz
+
+%.so.o: %.c
+ $(CC) $(CFLAGS) -c $< -o $@ -fpic
+
+shared: $(SOBJS)
+
+
diff --git a/src/rerr/rerr.c b/src/rerr/rerr.c
@@ -0,0 +1,108 @@
+#include "rerr.h"
+
+#ifdef RERR
+static char** rerr[RERR_N_PFX + 1];
+static char* rerr_pfx[RERR_N_PFX + 1];
+char *rerr_base[3] = {
+ "OK",
+ "FAIL",
+ "UNSUPPORTED",
+};
+#endif
+
+void rerr_init() {
+#ifdef RERR
+ int i;
+
+ for (i = 1; i < RERR_N_PFX + 1; i++) {
+ rerr[i] = 0x0;
+ rerr_pfx[i] = 0x0;
+ }
+ rerr[0] = rerr_base;
+ rerr_pfx[0] = 0x0;
+#endif
+}
+
+void rerr_register(int pfx, char *label, void *start) {
+#ifdef RERR
+ pfx >>= 8;
+ rerr_pfx[pfx] = label;
+ rerr[pfx] = start;
+#endif
+}
+
+#ifdef RERR
+static void splitcode(int code, short *k, char *v) {
+ *v = code & 0xff;
+ *k = 0;
+ if (code > 0xff) {
+ *k = ((code >> 8) & 0xffff);
+ }
+}
+
+static char *strv(short k, char v) {
+ return (char*)(*(rerr[k]+v));
+}
+#endif
+
+char *rerrpfx(int code) {
+ short k;
+ char v;
+ splitcode(code, &k, &v);
+ return rerr_pfx[k];
+}
+
+char *rerrstrv(int code) {
+#ifdef RERR
+ short k;
+ char v;
+ splitcode(code, &k, &v);
+ return strv(k, v);
+#endif
+}
+
+char* rerrstr(int code, char *buf) {
+#ifdef RERR
+ short k;
+ char v;
+ char *src;
+ char *dst;
+
+ splitcode(code, &k, &v);
+
+ dst = buf;
+ src = (char*)rerr_pfx[k];
+ if (src) {
+ while (1) {
+ if (*src == 0) {
+ break;
+ }
+ *dst = *src;
+ src++;
+ dst++;
+ }
+ *dst = ':';
+ dst++;
+ *dst = ' ';
+ dst++;
+ }
+
+ src = strv(k, v);
+ //src = (char*)(*(rerr[k]+v));
+ while (1) {
+ if (*src == 0) {
+ break;
+ }
+ *dst = *src;
+ src++;
+ dst++;
+ }
+
+ *dst = 0;
+
+ return buf;
+#else
+ return 0;
+#endif
+}
+
diff --git a/src/rerr/rerr.h b/src/rerr/rerr.h
@@ -0,0 +1,18 @@
+#ifndef RERR_H_
+#define RERR_H_
+
+#define ERR_OK 0x0
+#define ERR_FAIL 0x1
+#define ERR_UNSUPPORTED 0x2
+
+#ifndef RERR_N_PFX
+#define RERR_N_PFX 0
+#endif
+
+void rerr_init();
+void rerr_register(int pfx, char *label, void *start);
+char* rerrstr(int code, char *buf);
+char* rerrstrv(int code);
+char* rerrpfx(int code);
+
+#endif // RERR_H
diff --git a/src/rerr/test.c b/src/rerr/test.c
@@ -0,0 +1,39 @@
+#include <string.h>
+
+#include "rerr.h"
+
+char *bars[3] = {
+ "inky",
+ "pinky",
+ "blinky",
+};
+
+int main() {
+ char *s;
+ char v[1024];
+ rerr_init();
+
+ s = rerrstr(0, v);
+ if (strcmp(s, "OK")) {
+ return 1;
+ }
+
+ rerr_register(0x200, "bar", bars);
+
+ s = rerrstr(0x202, v);
+ if (strcmp(s, "bar: blinky")) {
+ return 1;
+ }
+
+ s = rerrstrv(0x202);
+ if (strcmp(s, "blinky")) {
+ return 1;
+ }
+
+ s = rerrpfx(0x202);
+ if (strcmp(s, "bar")) {
+ return 1;
+ }
+
+ return 0;
+}