liblash

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

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:
MMakefile | 8+++++++-
Msrc/Makefile | 34++++++++++++++++++++++------------
Asrc/endian/Makefile | 23+++++++++++++++++++++++
Rsrc/endian.c -> src/endian/endian.c | 0
Rsrc/endian.h -> src/endian/endian.h | 0
Rsrc/strip.c -> src/endian/strip.c | 0
Rsrc/strip.h -> src/endian/strip.h | 0
Asrc/hex/Makefile | 29+++++++++++++++++++++++++++++
Asrc/hex/hex.c | 92+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/hex/hex.h | 10++++++++++
Asrc/hex/test.c | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/llog/Makefile | 28++++++++++++++++++++++++++++
Asrc/llog/hex.c | 21+++++++++++++++++++++
Asrc/llog/llog.c | 236+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/llog/llog.h | 30++++++++++++++++++++++++++++++
Asrc/llog/test.c | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/rerr/Makefile | 27+++++++++++++++++++++++++++
Asrc/rerr/rerr.c | 108+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/rerr/rerr.h | 18++++++++++++++++++
Asrc/rerr/test.c | 39+++++++++++++++++++++++++++++++++++++++
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; +}