2003-10-14 18:16:20 +00:00
|
|
|
/* NeoStats - IRC Statistical Services
|
2004-01-14 11:36:37 +00:00
|
|
|
** Copyright (c) 1999-2004 Adam Rutter, Justin Hammond
|
2003-10-14 18:16:20 +00:00
|
|
|
** http://www.neostats.net/
|
|
|
|
**
|
|
|
|
** Portions Copyright (c) 2000-2001 ^Enigma^
|
|
|
|
**
|
|
|
|
** Portions Copyright (c) 1999 Johnathan George net@lite.net
|
|
|
|
**
|
|
|
|
** 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.
|
|
|
|
**
|
|
|
|
** You should have received a copy of the GNU General Public License
|
|
|
|
** along with this program; if not, write to the Free Software
|
|
|
|
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
|
|
|
** USA
|
|
|
|
**
|
|
|
|
** NeoStats CVS Identification
|
|
|
|
** $Id$
|
|
|
|
*/
|
2003-11-03 13:57:11 +00:00
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "stats.h"
|
|
|
|
#include "log.h"
|
|
|
|
|
|
|
|
static char misc_buf[BUFSIZE];
|
|
|
|
|
|
|
|
|
|
|
|
/** @brief strip newlines carriage returns
|
|
|
|
*
|
|
|
|
* removes newlines and carriage returns from a string
|
|
|
|
*
|
|
|
|
* @param line the line to strip (warning, Modfied!)
|
|
|
|
* @retval line the stripped line
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
|
|
|
strip (char *line)
|
|
|
|
{
|
|
|
|
char *c;
|
|
|
|
if ((c = strchr (line, '\n')))
|
|
|
|
*c = '\0';
|
|
|
|
if ((c = strchr (line, '\r')))
|
|
|
|
*c = '\0';
|
|
|
|
}
|
|
|
|
|
2004-01-25 21:05:36 +00:00
|
|
|
/** @brief NeoStats implementation of malloc.
|
2003-11-03 13:57:11 +00:00
|
|
|
*
|
2004-01-25 21:05:36 +00:00
|
|
|
* Allocates memory for internal variables. Useful for memory debugging
|
2003-11-03 13:57:11 +00:00
|
|
|
* if enough memory can't be malloced, exit the program
|
|
|
|
*
|
|
|
|
* @param size The amount of memory to Malloc
|
|
|
|
*
|
|
|
|
* @returns size bytes of memory or NULL on malloc error
|
|
|
|
*/
|
|
|
|
|
|
|
|
void *
|
|
|
|
smalloc (long size)
|
|
|
|
{
|
|
|
|
void *buf;
|
|
|
|
|
|
|
|
if (!size) {
|
|
|
|
nlog (LOG_WARNING, LOG_CORE, "smalloc(): illegal attempt to allocate 0 bytes!");
|
|
|
|
size = 1;
|
|
|
|
}
|
|
|
|
buf = malloc (size);
|
|
|
|
if (!buf) {
|
|
|
|
nlog (LOG_CRITICAL, LOG_CORE, "smalloc(): out of memory.");
|
|
|
|
do_exit (NS_EXIT_ERROR, "Out of memory");
|
|
|
|
}
|
|
|
|
return buf;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** @brief Duplicate a string
|
|
|
|
*
|
|
|
|
* make a copy of a string, with memory allocated for the new string
|
|
|
|
*
|
|
|
|
* @param s a pointer to the string to duplicate
|
|
|
|
*
|
|
|
|
* @returns a pointer to the new string
|
|
|
|
*
|
|
|
|
* @deprecated Try not to use this function, it will go away one day
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
char *
|
|
|
|
sstrdup (const char *s)
|
|
|
|
{
|
|
|
|
char *t = strdup (s);
|
|
|
|
if (!t) {
|
|
|
|
nlog (LOG_CRITICAL, LOG_CORE, "sstrdup(): out of memory.");
|
|
|
|
do_exit (NS_EXIT_ERROR, "Out of memory");
|
|
|
|
}
|
|
|
|
return t;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** @brief Create a HASH from a string
|
|
|
|
*
|
|
|
|
* Makes a hash of a string for a table
|
|
|
|
*
|
|
|
|
* @param name The string to use as the base for the hash
|
|
|
|
*
|
|
|
|
* @param size_of_table The size of the hash table
|
|
|
|
*
|
|
|
|
* @returns unsigned long of the hash
|
|
|
|
*
|
|
|
|
* @deprecated Try not to use this function, it will go away one day
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
unsigned long
|
|
|
|
HASH (const unsigned char *name, int size_of_table)
|
|
|
|
{
|
|
|
|
unsigned long h = 0, g;
|
|
|
|
|
|
|
|
while (*name) {
|
|
|
|
h = (h << 4) + *name++;
|
|
|
|
if ((g = h & 0xF0000000))
|
|
|
|
h ^= g >> 24;
|
|
|
|
h &= ~g;
|
|
|
|
}
|
|
|
|
return h % size_of_table;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** @brief convert a string to lowercase
|
|
|
|
*
|
|
|
|
* makes a string lowercase
|
|
|
|
*
|
|
|
|
* @param s the string to convert to lowercase. WARNING: the result overwrites this variable
|
|
|
|
*
|
|
|
|
* @returns pointer to the lowercase version of s
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
char *
|
|
|
|
strlwr (char *s)
|
|
|
|
{
|
|
|
|
char *t;
|
|
|
|
t = s;
|
|
|
|
while (*t) {
|
|
|
|
*t = tolower (*t);
|
|
|
|
t++;
|
|
|
|
}
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** @brief Adds a string to an array of strings
|
|
|
|
*
|
|
|
|
* used for the event functions, adds a string to an array of string pointers to pass to modules
|
|
|
|
*
|
|
|
|
* @param List the array you wish to append S to
|
|
|
|
* @param S the string you wish to append
|
|
|
|
* @param C the current size of the array
|
|
|
|
*
|
|
|
|
* @returns Nothing
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
|
|
|
AddStringToList (char ***List, char S[], int *C)
|
|
|
|
{
|
2004-03-12 19:15:37 +00:00
|
|
|
static int numargs = 8;
|
|
|
|
|
2003-11-03 13:57:11 +00:00
|
|
|
if (*C == 0) {
|
2004-03-12 19:15:37 +00:00
|
|
|
numargs = 8;
|
|
|
|
*List = calloc (sizeof (char *) * numargs, 1);
|
|
|
|
} else if (*C == numargs) {
|
|
|
|
numargs += 8;
|
|
|
|
*List = realloc (*List, sizeof (char *) * numargs);
|
2003-11-03 13:57:11 +00:00
|
|
|
}
|
|
|
|
++*C;
|
|
|
|
(*List)[*C - 1] = S;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** @brief
|
|
|
|
*
|
|
|
|
* @param
|
|
|
|
*
|
|
|
|
* @returns
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
/* this came from eggdrop sources */
|
|
|
|
/* Remove the color control codes that mIRC,pIRCh etc use to make
|
|
|
|
* their client seem so fecking cool! (Sorry, Khaled, you are a nice
|
|
|
|
* guy, but when you added this feature you forced people to either
|
|
|
|
* use your *SHAREWARE* client or face screenfulls of crap!)
|
|
|
|
*/
|
|
|
|
void strip_mirc_codes(char *text)
|
|
|
|
{
|
|
|
|
char *dd = text;
|
|
|
|
|
|
|
|
while (*text) {
|
|
|
|
switch (*text) {
|
|
|
|
case 1:
|
|
|
|
text++; /* ctcp stuff */
|
|
|
|
continue;
|
|
|
|
break;
|
|
|
|
case 2: /* Bold text */
|
|
|
|
text++;
|
|
|
|
continue;
|
|
|
|
break;
|
|
|
|
case 3: /* mIRC colors? */
|
|
|
|
if (isdigit(text[1])) { /* Is the first char a number? */
|
|
|
|
text += 2; /* Skip over the ^C and the first digit */
|
|
|
|
if (isdigit(*text))
|
|
|
|
text++; /* Is this a double digit number? */
|
|
|
|
if (*text == ',') { /* Do we have a background color next? */
|
|
|
|
if (isdigit(text[1]))
|
|
|
|
text += 2; /* Skip over the first background digit */
|
|
|
|
if (isdigit(*text))
|
|
|
|
text++; /* Is it a double digit? */
|
|
|
|
}
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 7:
|
|
|
|
text++;
|
|
|
|
continue;
|
|
|
|
break;
|
|
|
|
case 0x16: /* Reverse video */
|
|
|
|
text++;
|
|
|
|
continue;
|
|
|
|
break;
|
|
|
|
case 0x1f: /* Underlined text */
|
|
|
|
text++;
|
|
|
|
continue;
|
|
|
|
break;
|
|
|
|
case 033:
|
|
|
|
text++;
|
|
|
|
if (*text == '[') {
|
|
|
|
text++;
|
|
|
|
while ((*text == ';') || isdigit(*text))
|
|
|
|
text++;
|
|
|
|
if (*text)
|
|
|
|
text++; /* also kill the following char */
|
|
|
|
}
|
|
|
|
continue;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
*dd++ = *text++; /* Move on to the next char */
|
|
|
|
}
|
|
|
|
*dd = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** @brief
|
|
|
|
*
|
|
|
|
* @param
|
|
|
|
*
|
|
|
|
* @returns
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
char *
|
|
|
|
sctime (time_t stuff)
|
|
|
|
{
|
|
|
|
char *s, *c;
|
|
|
|
|
|
|
|
s = ctime (&stuff);
|
|
|
|
if ((c = strchr (s, '\n')))
|
|
|
|
*c = '\0';
|
|
|
|
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** @brief
|
|
|
|
*
|
|
|
|
* @param
|
|
|
|
*
|
|
|
|
* @returns
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
static char fmtime[TIMEBUFSIZE];
|
|
|
|
|
|
|
|
char *
|
|
|
|
sftime (time_t stuff)
|
|
|
|
{
|
|
|
|
struct tm *ltm = localtime (&stuff);
|
|
|
|
|
|
|
|
strftime (fmtime, TIMEBUFSIZE, "[%b (%a %d) %Y %I:%M [%p/%Z]]", ltm);
|
|
|
|
|
|
|
|
return fmtime;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** @brief
|
|
|
|
*
|
|
|
|
* @param
|
|
|
|
*
|
|
|
|
* @returns
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
debugtochannel(char *message, ...)
|
|
|
|
{
|
|
|
|
va_list ap;
|
|
|
|
|
|
|
|
SET_SEGV_LOCATION();
|
|
|
|
#ifndef DEBUG
|
|
|
|
if (!me.debug_mode)
|
|
|
|
return;
|
|
|
|
#endif
|
|
|
|
va_start (ap, message);
|
|
|
|
ircvsnprintf (misc_buf, BUFSIZE, message, ap);
|
|
|
|
va_end (ap);
|
|
|
|
chanalert (s_Services, misc_buf);
|
|
|
|
}
|