aboutsummaryrefslogtreecommitdiff
path: root/lobby.c
diff options
context:
space:
mode:
Diffstat (limited to 'lobby.c')
-rw-r--r--lobby.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/lobby.c b/lobby.c
new file mode 100644
index 0000000..62322ad
--- /dev/null
+++ b/lobby.c
@@ -0,0 +1,62 @@
+#include <u.h>
+#include <libc.h>
+#include "dat.h"
+#include "fns.h"
+
+static int
+lobby_takeseat(Lobby *l, int fd)
+{
+ if(l->seats.len >= l->seats.cap){
+ l->seats.cap += 8;
+ l->seats.fds = erealloc(l->seats.fds, l->seats.cap*sizeof(*l->seats.fds));
+ }
+
+ l->seats.fds[l->seats.len] = fd;
+ return l->seats.len++;
+}
+
+static int
+lobby_getcouple(Lobby *l, int *fds)
+{
+ if(l->seats.len >= 2){
+ fds[0] = l->seats.fds[l->seats.len-2];
+ fds[1] = l->seats.fds[l->seats.len-1];
+
+ if(l->seats.len < l->seats.cap-2)
+ memmove(&l->seats.fds[l->seats.len], &l->seats.fds[l->seats.len+2], l->seats.cap*sizeof(int) - (l->seats.len + 2)*sizeof(int));
+
+ l->seats.len -= 2;
+ return 0;
+ }
+ return -1;
+}
+
+static int
+lobby_leaveseat(Lobby *l, ulong idx)
+{
+ if(idx < l->seats.cap-1)
+ memmove(&l->seats.fds[idx], &l->seats.fds[idx+1], l->seats.cap*sizeof(int) - (l->seats.len + 1)*sizeof(int));
+ l->seats.len--;
+ return 0;
+}
+
+Lobby *
+newlobby(void)
+{
+ Lobby *l;
+
+ l = emalloc(sizeof(Lobby));
+ memset(l, 0, sizeof(*l));
+ l->takeseat = lobby_takeseat;
+ l->getcouple = lobby_getcouple;
+ l->leaveseat = lobby_leaveseat;
+
+ return l;
+}
+
+void
+dellobby(Lobby *l)
+{
+ free(l->seats.fds);
+ free(l);
+}