This repository has been archived on 2025-02-12. You can view files and clone it, but cannot push or open issues or pull requests.
NeoStats/misc.c

310 lines
6.1 KiB
C

/* NeoStats - IRC Statistical Services
** Copyright (c) 1999-2004 Adam Rutter, Justin Hammond
** 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$
*/
#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';
}
/** @brief NeoStats implementation of malloc.
*
* Allocates memory for internal variables. Useful for memory debugging
* 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)
{
static int numargs = 8;
if (*C == 0) {
numargs = 8;
*List = calloc (sizeof (char *) * numargs, 1);
} else if (*C == numargs) {
numargs += 8;
*List = realloc (*List, sizeof (char *) * numargs);
}
++*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);
}