aboutsummaryrefslogtreecommitdiffstats
path: root/FICS/multicol.c
diff options
context:
space:
mode:
Diffstat (limited to 'FICS/multicol.c')
-rw-r--r--FICS/multicol.c172
1 files changed, 172 insertions, 0 deletions
diff --git a/FICS/multicol.c b/FICS/multicol.c
new file mode 100644
index 0000000..046ac9e
--- /dev/null
+++ b/FICS/multicol.c
@@ -0,0 +1,172 @@
+/* multicol.c
+ *
+ */
+
+/*
+ fics - An internet chess server.
+ Copyright (C) 1993 Richard V. Nash
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+*/
+
+/* Revision history:
+ name email yy/mm/dd Change
+ Richard Nash 93/10/22 Created
+ Markus Uhlin 23/12/20 Revised
+ Markus Uhlin 24/05/05 Usage of reallocarray()
+*/
+
+#include "stdinclude.h"
+#include "common.h"
+
+#include <err.h>
+
+#include "multicol.h"
+#include "rmalloc.h"
+#include "utils.h"
+
+PUBLIC multicol *
+multicol_start(int maxArray)
+{
+ multicol *m;
+
+ m = rmalloc(sizeof(multicol));
+ m->arraySize = maxArray;
+ m->num = 0;
+ m->strArray = reallocarray(NULL, sizeof(char *), m->arraySize);
+
+ if (m->strArray == NULL)
+ err(1, "%s: reallocarray", __func__);
+ else
+ malloc_count++;
+
+ for (int i = 0; i < m->arraySize; i++)
+ m->strArray[i] = NULL;
+ return m;
+}
+
+PUBLIC int
+multicol_store(multicol *m, char *str)
+{
+ if (m == NULL || str == NULL || m->num >= m->arraySize)
+ return -1;
+ m->strArray[m->num] = xstrdup(str);
+ m->num++;
+ return 0;
+}
+
+PUBLIC int
+multicol_store_sorted(multicol *m, char *str)
+{ // Use this instead of multicol_store() to print a list sorted.
+ int found = 0;
+
+ if (m == NULL || str == NULL || m->num >= m->arraySize)
+ return -1;
+
+ for (int i = m->num; i > 0 && !found; i--) {
+ if (strcasecmp(str, m->strArray[i - 1]) >= 0) {
+ found = 1;
+ m->strArray[i] = xstrdup(str);
+ } else {
+ m->strArray[i] = m->strArray[i - 1];
+ }
+ }
+
+ if (!found)
+ m->strArray[0] = xstrdup(str);
+
+ m->num++;
+ return 0;
+}
+
+PUBLIC int
+multicol_pprint(multicol *m, int player, int cols, int space)
+{
+ char *tempptr;
+ int done;
+ int i;
+ int maxWidth = 0;
+ int numLines;
+ int numPerLine;
+ int on, theone, len;
+ int temp;
+
+ pprintf(player, "\n");
+
+ for (i = 0; i < m->num; i++) {
+ tempptr = m->strArray[i];
+ temp = strlen(tempptr); // loon: yes, this is pathetic
+
+ for (; *tempptr; tempptr++) {
+ if (*tempptr == '\033')
+ temp -= 4;
+ }
+
+ if (temp > maxWidth)
+ maxWidth = temp;
+ }
+
+ maxWidth += space;
+
+ numPerLine = (cols / maxWidth);
+ numLines = (m->num / numPerLine);
+
+ if ((numLines * numPerLine) < m->num)
+ numLines++;
+
+ on = 0;
+ done = 0;
+
+ while (!done) {
+ for (i = 0; i < numPerLine; i++) {
+ if ((theone = on + numLines * i) >= m->num)
+ break;
+
+ tempptr = m->strArray[theone];
+ temp = strlen(tempptr); // loon: yes, still pathetic
+
+ for (; *tempptr; tempptr++) {
+ if (*tempptr == '\033')
+ temp -= 4;
+ }
+
+ len = maxWidth - temp;
+
+ if (i == (numPerLine - 1))
+ len -= space;
+
+ pprintf(player, "%s", m->strArray[theone]);
+
+ while (len) {
+ pprintf(player, " ");
+ len--;
+ }
+ }
+
+ pprintf(player, "\n");
+ on += 1;
+
+ if (on >= numLines)
+ break;
+ }
+
+ return 0;
+}
+
+PUBLIC int
+multicol_end(multicol *m)
+{
+ for (int i = 0; i < m->num; i++)
+ rfree(m->strArray[i]);
+ rfree(m->strArray);
+ rfree(m);
+ return 0;
+}