aboutsummaryrefslogtreecommitdiffstats
path: root/FICS/multicol.c
diff options
context:
space:
mode:
authorMarkus Uhlin <markus@nifty-networks.net>2023-12-07 21:31:49 +0100
committerMarkus Uhlin <markus@nifty-networks.net>2023-12-07 21:31:49 +0100
commit79b59f9b30fb6a1fdf8c3efb446271f7cb00d434 (patch)
treef6ade4ccbc3af20d825edacfd12b5da8ded8d240 /FICS/multicol.c
FICS 1.6.2
Diffstat (limited to 'FICS/multicol.c')
-rw-r--r--FICS/multicol.c153
1 files changed, 153 insertions, 0 deletions
diff --git a/FICS/multicol.c b/FICS/multicol.c
new file mode 100644
index 0000000..8d52b04
--- /dev/null
+++ b/FICS/multicol.c
@@ -0,0 +1,153 @@
+/* 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
+*/
+
+#include "stdinclude.h"
+
+#include "common.h"
+#include "multicol.h"
+#include "utils.h"
+#include "rmalloc.h"
+
+/* grimm */
+#if defined(SGI)
+#else
+/* char *strchr( char *s, int c); */
+#endif
+/* added for warning */
+
+PUBLIC multicol *multicol_start(int maxArray)
+{
+ int i;
+ multicol *m;
+
+ m = (multicol *) rmalloc(sizeof(multicol));
+ m->arraySize = maxArray;
+ m->num = 0;
+ m->strArray = (char **) rmalloc(sizeof(char *) * m->arraySize);
+ for (i = 0; i < m->arraySize; i++)
+ m->strArray[i] = NULL;
+ return m;
+}
+
+PUBLIC int multicol_store(multicol * m, char *str)
+{
+ if (m->num >= m->arraySize)
+ return -1;
+ if (!str)
+ return -1;
+ m->strArray[m->num] = strdup(str);
+ m->num++;
+ return 0;
+}
+
+PUBLIC int multicol_store_sorted(multicol * m, char *str)
+/* use this instead of milticol_store to print a list sorted */
+{
+ int i;
+ int found = 0;
+ if (m->num >= m->arraySize)
+ return -1;
+ if (!str)
+ return -1;
+ for (i = m->num; (i > 0) && (!found); i--) {
+ if (strcasecmp(str, m->strArray[i - 1]) >= 0) {
+ found = 1;
+ m->strArray[i] = strdup(str);
+ } else {
+ m->strArray[i] = m->strArray[i - 1];
+ }
+ }
+ if (!found)
+ m->strArray[0] = strdup(str);
+ m->num++;
+ return 0;
+}
+
+PUBLIC int multicol_pprint(multicol * m, int player, int cols, int space)
+{
+ int i;
+ int maxWidth = 0;
+ int numPerLine;
+ int numLines;
+ int on, theone, len;
+ int done;
+ int temp;
+ char *tempptr;
+
+ 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++) {
+ theone = on + numLines * i;
+ if (theone >= 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)
+{
+ int i;
+ for (i = 0; i < m->num; i++)
+ rfree(m->strArray[i]);
+ rfree(m->strArray);
+ rfree(m);
+ return 0;
+}