about summary refs log tree commit diff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--chat.c7
-rw-r--r--chat.h22
2 files changed, 29 insertions, 0 deletions
diff --git a/chat.c b/chat.c
index 5796085..462faa0 100644
--- a/chat.c
+++ b/chat.c
@@ -23,6 +23,13 @@
 
 #include "chat.h"
 
+char *idNames[IDCap] = {
+	[None] = "<none>",
+	[Debug] = "<debug>",
+	[Network] = "<network>",
+};
+size_t idNext = Network + 1;
+
 struct Self self;
 
 int main(int argc, char *argv[]) {
diff --git a/chat.h b/chat.h
index 4dd4732..8c13d49 100644
--- a/chat.h
+++ b/chat.h
@@ -14,13 +14,35 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
+#include <err.h>
 #include <stdbool.h>
+#include <string.h>
+#include <sysexits.h>
+#include <time.h>
 
 #define ARRAY_LEN(a) (sizeof(a) / sizeof(a[0]))
 #define BIT(x) x##Bit, x = 1 << x##Bit, x##Bit_ = x##Bit
 
 typedef unsigned char byte;
 
+enum { None, Debug, Network, IDCap = 256 };
+extern char *idNames[IDCap];
+extern size_t idNext;
+
+static inline size_t idFind(const char *name) {
+	for (size_t id = 0; id < idNext; ++id) {
+		if (!strcmp(idNames[id], name)) return id;
+	}
+	return None;
+}
+static inline size_t idFor(const char *name) {
+	size_t id = idFind(name);
+	if (id) return id;
+	idNames[idNext] = strdup(name);
+	if (!idNames[idNext]) err(EX_OSERR, "strdup");
+	return idNext++;
+}
+
 #define ENUM_CAP \
 	X("sasl", CapSASL) \
 	X("server-time", CapServerTime) \