+/* tools.c - NeonServ v5.4
+ * Copyright (C) 2011-2012 Philipp Kreil (pk910)
+ *
+ * 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 3 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
#include "tools.h"
#include "UserNode.h"
#include "ChanNode.h"
#include "lang.h"
#include "ClientSocket.h"
+#include "IPNode.h"
static const struct default_language_entry msgtab[] = {
{"TIME_MASK_2_ITEMS", "%s and %s"}, /* {ARGS: "2 days", "1 hour"} */
table->length = length;
table->width = width;
table->flags = flags;
- table->col_flags = calloc(length, sizeof(int));
+ table->col_flags = calloc(width, sizeof(int));
table->entrys = 0;
- table->maxwidth = calloc(length, sizeof(int));
+ table->maxwidth = calloc(width, sizeof(int));
table->table_lines = NULL;
return table;
}
}
char **table_end(struct Table *table) {
- int row, col, tablewidth = 0, pos,i;
+ int row, col, tablewidth = 0, pos,i,j,k;
if(!table->entrys) return NULL;
for(col = 0; col < table->width; col++) {
tablewidth += table->maxwidth[col]+1;
if(!(table->col_flags[col] & TABLE_FLAG_COL_CONTENTS)) continue;
if(table->col_flags[col] & TABLE_FLAG_COL_BOLD)
table->table_lines[row][pos++] = '\002';
- for(i = 0; i < strlen(table->contents[row][col]); i++) {
- table->table_lines[row][pos++] = table->contents[row][col][i];
+ i = 0;
+ j = 0;
+ if(table->contents[row][col]) {
+ for(; i < strlen(table->contents[row][col]); i++) {
+ table->table_lines[row][pos++] = table->contents[row][col][i];
+ if(table->contents[row][col][i] == '\002') j++;
+ else if(table->contents[row][col][i] == '\003') {
+ j++;
+ for(k = 1; k < 2; k++) {
+ if(isdigit(table->contents[row][col][i+k]))
+ j++;
+ else
+ break;
+ }
+ }
+ }
}
+ i -= j;
if(col < table->width-1) {
for(;i < table->maxwidth[col]; i++) {
table->table_lines[row][pos++] = ' ';
char modeStr[MAXMODES+3];
int modePos = 0;
char paramStr[MAXLEN];
+ *paramStr = '\0';
int paramPos = 0;
int i;
if(modeBuf->addCount) {
modeStr[modePos++] = modeBuf->addModes[i];
if(modeBuf->addModesParams[i]) {
paramPos += sprintf(paramStr + paramPos, " %s", modeBuf->addModesParams[i]);
+ free(modeBuf->addModesParams[i]);
+ modeBuf->addModesParams[i] = NULL;
}
}
modeBuf->addCount = 0;
modeStr[modePos++] = modeBuf->delModes[i];
if(modeBuf->delModesParams[i]) {
paramPos += sprintf(paramStr + paramPos, " %s", modeBuf->delModesParams[i]);
+ free(modeBuf->delModesParams[i]);
+ modeBuf->delModesParams[i] = NULL;
}
}
modeBuf->delCount = 0;
ident = input;
*p = '\0';
host = p+1;
- } else if((p = strstr(input, "."))) {
+ } else if((p = strstr(input, ".")) || (p = strstr(input, ":"))) {
host = input;
} else if(*input == '*' && input[1] != '\0' && !strstr(input+1, "*")) {
//AUTH MASK
return (strlen(p2+1) > 4);
}
+int mask_match(char *mask, struct UserNode *user) {
+ char usermask[NICKLEN+USERLEN+HOSTLEN+3];
+ char matchmask[strlen(mask)+3];
+ strcpy(matchmask, mask);
+ char *host = strchr(mask, '@');
+ if(host) {
+ struct IPNode *ip = createIPNode(host);
+ int bits = (ip->flags & IPNODE_IS_IPV6 ? 128 : 32);
+ if((host = strchr(host, '/'))) {
+ bits = atoi(host+1);
+ }
+ if(ip && user->ip&& !ipmatch(user->ip, ip, bits)) {
+ host[1] = '*';
+ host[2] = '\0';
+ }
+ }
+ sprintf(usermask, "%s!%s@%s", user->nick, user->ident, user->host);
+ return match(matchmask, usermask);
+}
+
+static unsigned long crc_table[256];
+
+static void crc32_init() {
+ unsigned long crc;
+ int i, j;
+ for(i = 0; i < 256; i++) {
+ crc = i;
+ for(j = 8; j > 0; j--) {
+ if(crc & 1)
+ crc = (crc >> 1) ^ 0xEDB88320L;
+ else
+ crc >>= 1;
+ }
+ crc_table[i] = crc;
+ }
+}
+
+unsigned long crc32(const char *text) {
+ register unsigned long crc = 0xFFFFFFFF;
+ unsigned int c, i = 0;
+ while((c = (unsigned int)text[i++]) != 0)
+ crc = ((crc >> 8) & 0x00FFFFFF) ^ crc_table[(crc^c) & 0xFF];
+ return (crc^0xFFFFFFFF);
+}
+
void init_tools() {
register_default_language_table(msgtab);
+ crc32_init();
}