#include <stdio.h>
#include <errno.h>
+/*-
+ * For some sections, the BSD license applies, specifically:
+ * ircd_strcmp ircd_strncmp:
+ *
+ * Copyright (c) 1987
+ * The Regents of the University of California. All rights reserved.
+ *
+ * match/collapse
+ *
+ * Copyright (c) 1998
+ * Andrea Cocito (Nemesi).
+ * Copyright (c)
+ * Run (carlo@runaway.xs4all.nl) 1996
+ *
+ * mmatch/match/collapse
+ *
+ * Copyright (c)
+ * Run (carlo@runaway.xs4all.nl) 1996
+ *
+ * License follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University/owner? nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
static unsigned long crc32_tab[] = {
0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
/* COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or */
/* code or tables extracted from it, as desired without restriction. */
/* Modified by Fox: no more length parameter, always does the whole string */
-unsigned long crc32(const char *s) {
+unsigned long irc_crc32(const char *s) {
const char *cp;
unsigned long crc32val;
}
/* Case insensitive version of the above */
-unsigned long crc32i(const char *s) {
+unsigned long irc_crc32i(const char *s) {
const char *cp;
unsigned long crc32val;
return crc32val;
}
-/* @GPL
- * ircd_strcmp - case insensitive comparison of 2 strings
+/* ircd_strcmp/ircd_strncmp
+ *
+ * Copyright (c) 1987
+ * The Regents of the University of California. All rights reserved.
+ *
+ * BSD license.
+ *
+ * Modified from this version for ircd usage.
*/
-int ircd_strcmp(const char *a, const char *b) {
- const char* ra = a;
- const char* rb = b;
- while (ToLower(*ra) == ToLower(*rb)) {
- if (!*ra++)
+
+int ircd_strcmp(const char *s1, const char *s2) {
+ register const char* u1 = s1;
+ register const char* u2 = s2;
+
+ while(ToLower(*u1) == ToLower(*u2)) {
+ if(!*u1++)
return 0;
- else
- ++rb;
+
+ u2++;
}
- return (*ra - *rb);
+ return ToLower(*u1) - ToLower(*u2);
}
-/* @GPL
- * ircd_strncmp - counted case insensitive comparison of 2 strings
- */
-int ircd_strncmp(const char *a, const char *b, size_t n) {
- const char* ra = a;
- const char* rb = b;
- int left = n;
- if (!left--)
+
+int ircd_strncmp(const char *s1, const char *s2, size_t len) {
+ register const char* u1 = s1;
+ register const char* u2 = s2;
+ size_t remaining = len - 1;
+
+ if(!remaining)
return 0;
- while (ToLower(*ra) == ToLower(*rb)) {
- if (!*ra++ || !left--)
+
+ while(ToLower(*u1) == ToLower(*u2)) {
+ if(!*u1++ || !remaining--)
return 0;
- else
- ++rb;
+
+ u2++;
}
- return (*ra - *rb);
+
+ return ToLower(*u1) - ToLower(*u2);
}
/*
* Converts a long into a "p.q.r.s" IP address
*/
-const char *IPtostr(unsigned long IP) {
+const char *IPlongtostr(unsigned long IP) {
static char buf[16];
sprintf(buf,"%lu.%lu.%lu.%lu",(IP>>24),(IP>>16)&255,(IP>>8)&255,IP&255);
/*
* longtoduration:
* Converts a specified number of seconds into a duration string.
- * format: 0 for the "/stats u" compatible output, 1 for more human-friendly output.
+ * format: 0 for the "/stats u" compatible output, 1 for more
+ * human-friendly output (that is sometimes format 0), and
+ * 2 for a different human-friendly output.
*/
const char *longtoduration(unsigned long interval, int format) {
int days,hours,minutes,seconds;
- static char outstring[50];
+ static char outstring[100];
int pos=0;
seconds=interval%60;
hours=(interval%(3600*24))/3600;
days=interval/(3600*24);
- if (days>0 || format==0) {
- sprintf(outstring,"%d day%s, %02d:%02d:%02d",
- days,(days==1)?"":"s",hours,minutes,seconds);
+ if(format<2) {
+ if (format==0 || (days>0 && (hours||minutes||seconds))) {
+ sprintf(outstring,"%d day%s, %02d:%02d:%02d",
+ days,(days==1)?"":"s",hours,minutes,seconds);
+ } else if (days>0) {
+ sprintf(outstring, "%d day%s",days,(days==1)?"":"s");
+ } else {
+ if (hours>0) {
+ pos += sprintf(outstring+pos,"%d hour%s ",hours,hours==1?"":"s");
+ }
+ if (minutes>0 || (hours>0 && seconds>0)) {
+ pos += sprintf(outstring+pos,"%d minute%s ",minutes,minutes==1?"":"s");
+ }
+ if (seconds>0 || !interval) {
+ sprintf(outstring+pos,"%d second%s ",seconds,seconds==1?"":"s");
+ }
+ }
} else {
- if (hours>0) {
- pos += sprintf(outstring+pos,"%d hour%s ",hours,hours==1?"":"s");
+ if (days>0) {
+ pos += sprintf(outstring+pos, "%dd ",days);
}
- if (minutes>0 || (hours>0 && seconds>0)) {
- pos += sprintf(outstring+pos,"%d minute%s ",minutes,minutes==1?"":"s");
+ if (hours>0 || (days>0 && (minutes>0 || seconds>0))) {
+ pos += sprintf(outstring+pos, "%dh ",hours);
}
- if (seconds>0) {
- pos += sprintf(outstring+pos,"%d second%s ",seconds,seconds==1?"":"s");
+ if (minutes>0 || ((days>0 || hours>0) && seconds>0)) {
+ pos += sprintf(outstring+pos, "%dm ",minutes);
+ }
+ if (seconds>0 || !interval) {
+ sprintf(outstring+pos, "%ds ",seconds);
}
}
int durationtolong(const char *string) {
int total=0;
int current=0;
- char *ch=string,*och;
+ char *ch=(char *)string,*och;
while (*ch) {
och=ch;
}
return total;
}
-/* @GPL
+
+/*
* mmatch()
*
* Written by Run (carlo@runaway.xs4all.nl), 25-10-96
* a '?' in `new_mask' does not match a '\?' in `old_mask'.
* And ofcourse... a '*' in `new_mask' does not match a '\*' in `old_mask'...
* And last but not least, '\?' and '\*' in `new_mask' now become one character.
+ *
+ * Kindly BSD licensed by Run for Newserv.
*/
int mmatch(const char *old_mask, const char *new_mask)
* 1, if no match
*/
-/* @GPL
+/*
* match
*
* Rewritten by Andrea Cocito (Nemesi), November 1998.
*
+ * Permission kindly granted by Andrea to be used under the BSD license.
+ *
*/
/****************** Nemesi's match() ***************/
if (!ch)
return 0; /* mask ends with '*', we got it */
ch = ToLower(ch);
- while (ToLower(*s++) != ch)
+ do {
if (!*s)
return 1;
+ } while (ToLower(*s++) != ch);
bs = s; /* Next try start from here */
/* Check the rest of the "chunk" */
return 0;
}
-/* @GPL
+/*
* collapse()
* Collapse a pattern string into minimal components.
* This particular version is "in place", so that it changes the pattern
* (C) Carlo Wood - 6 Oct 1998
* Speedup rewrite by Andrea Cocito, December 1998.
* Note that this new optimized alghoritm can *only* work in place.
+ *
+ * Permission kindly granted by Andrea to be used under the BSD license.
+ *
*/
char *collapse(char *mask)