diff options
Diffstat (limited to 'FICS/multicol.c')
-rw-r--r-- | FICS/multicol.c | 153 |
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; +} |