Initial commit
authorLukas Krickl <lukas@krickl.dev>
Sat, 21 Feb 2026 15:44:57 +0000 (16:44 +0100)
committerLukas Krickl <lukas@krickl.dev>
Sat, 21 Feb 2026 15:44:57 +0000 (16:44 +0100)
18 files changed:
.gitattributes [new file with mode: 0644]
.gitignore [new file with mode: 0644]
BUGS.md [new file with mode: 0644]
LICENSE [new file with mode: 0644]
README.md [new file with mode: 0644]
STYLE.md [new file with mode: 0644]
TODO.md [new file with mode: 0644]
makefile [new file with mode: 0644]
man/lmud.1 [new file with mode: 0644]
man/lmud.5 [new file with mode: 0644]
src/lmud.c [new file with mode: 0644]
src/lmud.h [new file with mode: 0644]
src/main.c [new file with mode: 0644]
src/test.c [new file with mode: 0644]
src/u_mem.c [new file with mode: 0644]
src/u_mem.h [new file with mode: 0644]
src/u_stdio.c [new file with mode: 0644]
src/u_stdio.h [new file with mode: 0644]

diff --git a/.gitattributes b/.gitattributes
new file mode 100644 (file)
index 0000000..176a458
--- /dev/null
@@ -0,0 +1 @@
+* text=auto
diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..51a31e7
--- /dev/null
@@ -0,0 +1,68 @@
+# Build directory
+bin/
+obj/
+tags
+
+ Prerequisites
+*.d
+
+# Object files
+*.o
+*.ko
+*.obj
+*.elf
+
+# Linker output
+*.ilk
+*.map
+*.exp
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Libraries
+*.lib
+*.a
+*.la
+*.lo
+
+# Shared objects (inc. Windows DLLs)
+*.dll
+*.so
+*.so.*
+*.dylib
+
+# Executables
+*.exe
+*.out
+*.app
+*.i*86
+*.x86_64
+*.hex
+
+# Debug files
+*.dSYM/
+*.su
+*.idb
+*.pdb
+vgcore.*
+
+# Kernel Module Compile Results
+*.mod*
+*.cmd
+.tmp_versions/
+modules.order
+Module.symvers
+Mkfile.old
+dkms.conf
+
+compile_commands.json
+.cache/
+.clang_complete
+# .clangd
+.session
+
+lmud
+testlmud
+*.patch
diff --git a/BUGS.md b/BUGS.md
new file mode 100644 (file)
index 0000000..616168d
--- /dev/null
+++ b/BUGS.md
@@ -0,0 +1,3 @@
+# Known Bugs
+
+
diff --git a/LICENSE b/LICENSE
new file mode 100644 (file)
index 0000000..5e5b158
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,18 @@
+Copyright 2025-2026 Lukas Krickl (lukas@krickl.dev)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy 
+of this software and associated documentation files (the "Software"), 
+to deal in the Software without restriction, 
+including without limitation the rights to 
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, 
+and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS",
+WITHOUT WARRANTY OF ANY KIND, 
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..306b681
--- /dev/null
+++ b/README.md
@@ -0,0 +1,32 @@
+# lmud
+
+lukas' multi user dungeon.
+
+## Table of content
+
+- [Installation](#Installation)
+- [Usage](#Usage)
+- [License](#License)
+- [Contributing](#Contributing)
+- [TODO](#TODO)
+
+## Installation
+
+To build this program you will require a recent C compiler, and make.
+
+```sh
+make # to compile all targets 
+```
+
+## Usage
+
+Usage instructions can be found in the manual.
+
+- man/lmud.1: Command reference
+
+## License
+
+This program is distributed under the terms of the MIT License.
+
+## Contributing
+
diff --git a/STYLE.md b/STYLE.md
new file mode 100644 (file)
index 0000000..28d350d
--- /dev/null
+++ b/STYLE.md
@@ -0,0 +1,20 @@
+# Coding Style
+
+## Modules
+
+The code base is split into modules.
+Files and all functions therein are prefixed with one of the following:
+
+- `lmud_`: public api 
+- `t_`: thinker related
+- `r_`: rendering
+- `n_`: network
+- `m_`: macro command language
+- `c_`: client-side code
+- `s_`: server side code
+- `u_`: system utility code
+
+## Library functions
+
+Third party functions (even the C stdlib) should be wrapped at all times.
+Platform specific code (including the stdlib) should be clearly marked.
diff --git a/TODO.md b/TODO.md
new file mode 100644 (file)
index 0000000..b6dbda7
--- /dev/null
+++ b/TODO.md
@@ -0,0 +1,2 @@
+# TODO
+
diff --git a/makefile b/makefile
new file mode 100644 (file)
index 0000000..f2cfe5b
--- /dev/null
+++ b/makefile
@@ -0,0 +1,48 @@
+NAME=lmud
+TEST_NAME=test$(NAME)
+DBGCFLAGS=-g -fsanitize=address
+DBGLDFLAGS=-fsanitize=address 
+CFLAGS=-Wall -pedantic $(DBGCFLAGS) -std=c89
+LIBS=
+LDFLAGS=$(DBGLDFLAGS) $(LIBS)
+
+INSTALL_DIR=/usr/local
+OBJS:=
+
+CCOBJ=$(CC) -c -o $@ $< $(CFLAGS) $(LDFLAGS)
+
+all: bin test
+
+release: 
+       make DBGCFLAGS="" DBGLDFLAGS=""
+
+.PHONY: FORCE
+FORCE:
+
+main.o: src/main.c FORCE
+       $(CCOBJ)
+test.o: src/test.c FORCE
+       $(CCOBJ)
+       
+
+bin: main.o $(OBJS) 
+       $(CC) -o $(NAME) main.o $(OBJS) $(CFLAGS) $(LDFLAGS)
+
+test: test.o $(OBJS) 
+       $(CC) -o $(TEST_NAME) test.o $(OBJS) $(CFLAGS) $(LDFLAGS)
+
+.PHONY: clean
+clean:
+       rm -f ./*.o
+       rm -f ./$(NAME)
+       rm -f ./$(TEST_NAME)
+
+.PHONY: install 
+install:
+       mkdir -p $(INSTALL_DIR)/bin
+       mkdir -p $(INSTALL_DIR)/man/man1
+       mkdir -p $(INSTALL_DIR)/man/man5
+       cp ./$(NAME) $(INSTALL_DIR)/bin
+       cp ./man/$(NAME).1 $(INSTALL_DIR)/man/man1
+       cp ./man/$(NAME).5 $(INSTALL_DIR)/man/man5
+
diff --git a/man/lmud.1 b/man/lmud.1
new file mode 100644 (file)
index 0000000..ff3e815
--- /dev/null
@@ -0,0 +1,40 @@
+.\" Manpage for lmud.
+.\" Contact lukas@krickl.dev to correct errors or typos.
+
+.TH man 1 "21 Febuary 2026" "0.0.1" "lmud manual"
+
+.SH NAME
+       lmud
+.SH SYNOPSIS
+  lmud [-hvV] [-c=command] 
+.SH DESCRIPTION
+  lmud
+
+  -h   
+    display this help and exit
+       
+  -V   
+    display version info and exit
+       
+  -v   
+    verbose output
+
+       -c
+       execute a command and exit
+.SH EXAMPLES
+
+.SH SEE ALSO
+  lmud(5) for a command syntax reference
+
+  The documentation for make(1) for compilation instructions.
+
+  A compiler documentation such as cc(1) gcc(1) or clang(1).
+
+.SH BUGS
+
+.SH AUTHOR
+  Lukas Krickl (lukas@krickl.dev)
+
+.SH COPYRIGHT
+  Copyright 2026 Lukas Krickl (lukas@krickl.dev)
diff --git a/man/lmud.5 b/man/lmud.5
new file mode 100644 (file)
index 0000000..230a5d7
--- /dev/null
@@ -0,0 +1,14 @@
+.\" Manpage for lmud.
+.\" Contact lukas@krickl.dev to correct errors or typos.
+
+.TH man 5 "21 Febuary 2026" "0.0.1" "lmud command language reference"
+
+.SH SEE ALSO
+
+  lmud(1) for a reference on how to use lmud.
+
+.SH AUTHOR
+  Lukas Krickl (lukas@krickl.dev)
+
+.SH COPYRIGHT
+  Copyright 2026 Lukas Krickl (lukas@krickl.dev)
diff --git a/src/lmud.c b/src/lmud.c
new file mode 100644 (file)
index 0000000..1286643
--- /dev/null
@@ -0,0 +1,57 @@
+#include <string.h>
+#include <getopt.h>
+#include <stdlib.h>
+#include "lmud.h"
+
+struct lmud_config lmud_global_cfg;
+
+struct lmud_config* lmud_cfg() {
+       return &lmud_global_cfg;
+}
+
+void lmud_help(int argc, char **argv) {
+  u_printf(u_stderr, "%s\n", argv[0]);
+  u_printf(u_stderr, "Usage: %s [-%s] [-c=command]\n\n",
+         argv[0], LMUD_OPTS);
+  LMUD_HELP("h", "display this help and exit");
+       LMUD_HELP("V", "display version info and exit");
+       LMUD_HELP("v", "verbose output");
+}
+
+void lmud_version(void) {
+       u_printf(u_stderr, "%s\n", LMUD_VER);
+}
+
+void lmud_getopt(int argc, char **argv, struct lmud_config *cfg) {
+  int c = 0;
+  while ((c = getopt(argc, argv, LMUD_OPTS LMUD_OPTS_ARG)) != -1) {
+    switch (c) {
+    case 'h':
+      lmud_help(argc, argv);
+      exit(0);
+      break;
+    case 'V':
+      lmud_version();
+      exit(0);
+      break;
+    case 'v':
+      cfg->verbose = 1;
+      break;
+    case '?':
+      break;
+    default:
+      u_printf(u_stderr, "%s: invalid option '%c'\nTry '%s -h' for more information.\n",
+             argv[0], c, argv[0]);
+      exit(-1);
+      break;
+    }
+  }
+
+  cfg->argc = argc - optind;
+  cfg->argv = argv + optind;
+}
+
+int lmud_main(int argc, char **argv) {
+  lmud_getopt(argc, argv, lmud_cfg());
+       return 0;
+}
diff --git a/src/lmud.h b/src/lmud.h
new file mode 100644 (file)
index 0000000..481e6b2
--- /dev/null
@@ -0,0 +1,49 @@
+#ifndef LMUD_H__
+#define LMUD_H__
+
+/**
+ * System includes
+ */
+#include "u_stdio.h"
+#include "u_mem.h"
+
+#define LMUD_VER "0.0.1"
+
+/* args without value */
+#define LMUD_OPTS "hvV"
+
+/* args with value */
+#define LMUD_OPTS_ARG "c:"
+#define LMUD_HELP(a, desc) printf("\t-%s\t%s\n", (a), desc);
+
+typedef unsigned char lmud_bool;
+#define LMUD_TRUE 1
+#define LMUD_FALSE 0
+
+struct lmud_config {
+       lmud_bool verbose;
+
+       char **argv;
+       int argc;
+};
+
+struct lmud_config* lmud_cfg();
+void lmud_help(int argc, char **argv);
+void lmud_version(void);
+void lmud_getopt(int argc, char **argv, struct lmud_config *cfg);
+int lmud_main(int argc, char **argv);
+
+
+/**
+ * If this is an implementation
+ * we include all c files for a mono-build
+ */ 
+#ifdef LMUD_IMPL
+
+#include "lmud.c"
+#include "u_stdio.c"
+#include "u_mem.c"
+
+#endif
+
+#endif
diff --git a/src/main.c b/src/main.c
new file mode 100644 (file)
index 0000000..e96a978
--- /dev/null
@@ -0,0 +1,11 @@
+#define LMUD_IMPL
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include "lmud.h"
+
+int main(int argc, char **argv) {
+       return lmud_main(argc, argv);
+}
diff --git a/src/test.c b/src/test.c
new file mode 100644 (file)
index 0000000..8f5411f
--- /dev/null
@@ -0,0 +1,17 @@
+#define LMUD_IMPL
+
+#include <stdio.h>
+#include <assert.h>
+#include "lmud.h"
+
+#define TESTBEGIN(name) { u_printf(u_stderr, "%s\n", name); }
+
+#define TESTEND(name) { u_printf(u_stderr, "%s\n", name); }
+
+int main(int argc, char **argv) {
+  TESTBEGIN("lmud test");
+  lmud_getopt(argc, argv, lmud_cfg());
+
+  TESTEND("lmud test");
+  return 0;
+}
diff --git a/src/u_mem.c b/src/u_mem.c
new file mode 100644 (file)
index 0000000..ec55198
--- /dev/null
@@ -0,0 +1 @@
+#include "u_mem.h"
diff --git a/src/u_mem.h b/src/u_mem.h
new file mode 100644 (file)
index 0000000..6984914
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef U_MEM_H__
+#define U_MEM_H__
+
+
+
+#endif
diff --git a/src/u_stdio.c b/src/u_stdio.c
new file mode 100644 (file)
index 0000000..73968c1
--- /dev/null
@@ -0,0 +1,14 @@
+#include <stdarg.h>
+#include "u_stdio.h"
+
+int u_printf(U_FILE* stream, const char *fmt, ...) {
+               int res = 0;
+               va_list args;
+               
+               va_start(args, fmt);
+               res = vfprintf(stream, fmt, args);
+               va_end(args);
+
+               return res;
+}
+
diff --git a/src/u_stdio.h b/src/u_stdio.h
new file mode 100644 (file)
index 0000000..db8ad36
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef U_STDIO_H__
+#define U_STDIO_H__
+
+
+typedef FILE U_FILE;
+
+#define u_stdin stdin
+#define u_stdout stdout
+#define u_stderr stderr
+
+int u_printf(U_FILE* stream, const char *fmt, ...);
+
+
+#endif