From 257f494b0c8177bf5ff4f24ac8d34073372e87a9 Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Sat, 11 Oct 2025 21:55:04 +0200 Subject: [PATCH] rc Rand/crypto utility --- user/rc/.gitignore | 2 ++ user/rc/Makefile | 24 ++++++++++++++++++++++ user/rc/main.c | 24 ++++++++++++++++++++++ user/rc/rr.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 user/rc/.gitignore create mode 100644 user/rc/Makefile create mode 100644 user/rc/main.c create mode 100644 user/rc/rr.c diff --git a/user/rc/.gitignore b/user/rc/.gitignore new file mode 100644 index 0000000..8286d11 --- /dev/null +++ b/user/rc/.gitignore @@ -0,0 +1,2 @@ +*.o +rc diff --git a/user/rc/Makefile b/user/rc/Makefile new file mode 100644 index 0000000..72da5ad --- /dev/null +++ b/user/rc/Makefile @@ -0,0 +1,24 @@ +include $(ROOT)/mk/grabsrc.mk +include ../Makefile.inc + +.PHONY: all clean + +TARGET := rc + +LDFLAGS += -L$(ROOT)/ulib -l:libulib.a + +SRCFILES := $(call GRABSRC, .) +CFILES := $(call GET_CFILES, $(SRCFILES)) +OBJ := $(call GET_OBJ, $(SRCFILES)) + +%.o: %.c + $(CC) $(CFLAGS) -c $< -o $@ + +all: $(TARGET) + +$(TARGET): $(OBJ) + $(LD) $^ $(LDFLAGS) -o $@ + echo $$(realpath $(TARGET)) >> $(FILES) + +clean: + rm -f $(OBJ) $(TARGET) diff --git a/user/rc/main.c b/user/rc/main.c new file mode 100644 index 0000000..fbbed2c --- /dev/null +++ b/user/rc/main.c @@ -0,0 +1,24 @@ +#include +#include +#include + +#define CMDS(X) \ + X(rr) \ + +void main(void) { + if (argslen() == 0) { + return; + } + + char *cmd = args()[0]; + + #define X(name) if (string_strcmp(cmd, #name) == 0) { \ + extern void rc_ ## name(void); \ + rc_ ## name(); \ + return; \ + } + CMDS(X) + #undef X + + uprintf("rc: unknown command %s\n", cmd); +} diff --git a/user/rc/rr.c b/user/rc/rr.c new file mode 100644 index 0000000..91436e5 --- /dev/null +++ b/user/rc/rr.c @@ -0,0 +1,50 @@ +#include +#include +#include + +int32_t rr(int32_t min, int32_t max) { + if (max <= min) + return min; + + uint32_t range = (uint32_t)(max - min + 1); + uint32_t val; + int32_t rnd; + + for (size_t i = 0; i < 10; i++) { + rnd = rand(); + if (rnd == -1) + continue; + + val = (uint32_t)rnd; + + uint32_t limit = (uint32_t)(-range) % range; + if (val >= limit) { + return min + (val % range); + } + } + + return -1; +} + +void rc_rr(void) { + if (argslen() < 3) { + uprintf("rc: Not enough arguments\n"); + return; + } + + char *beginstr = *(args()+1); + char *endstr = *(args()+2); + + char *endb; + long begin = string_conv_strtol(beginstr, &endb, 10); + char *ende; + long end = string_conv_strtol(endstr, &ende, 10); + + int32_t r = rr(begin, end); + if (rr == -1) { + uprintf("rc: failed to generate random number in range\n"); + return; + } + + uprintf("%d\n", r); +}