summaryrefslogtreecommitdiff
path: root/src/irc_string.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/irc_string.c')
-rw-r--r--src/irc_string.c263
1 files changed, 263 insertions, 0 deletions
diff --git a/src/irc_string.c b/src/irc_string.c
new file mode 100644
index 0000000..08b4321
--- /dev/null
+++ b/src/irc_string.c
@@ -0,0 +1,263 @@
+/*
+ * ircd-hybrid: an advanced Internet Relay Chat Daemon(ircd).
+ * irc_string.c: IRC string functions.
+ *
+ * Copyright (C) 2002 by the past and present ircd coders, and others.
+ *
+ * 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
+ *
+ * $Id$
+ */
+
+#include "config.h"
+#ifdef HAVE_LIBPCRE
+#include <pcre.h>
+#endif
+
+#include "stdinc.h"
+#include "irc_string.h"
+#include "sprintf_irc.h"
+
+
+int
+has_wildcards(const char *s)
+{
+ char c;
+
+ while ((c = *s++))
+ if (IsMWildChar(c))
+ return 1;
+
+ return 0;
+}
+
+/*
+ * myctime - This is like standard ctime()-function, but it zaps away
+ * the newline from the end of that string. Also, it takes
+ * the time value as parameter, instead of pointer to it.
+ * Note that it is necessary to copy the string to alternate
+ * buffer (who knows how ctime() implements it, maybe it statically
+ * has newline there and never 'refreshes' it -- zapping that
+ * might break things in other places...)
+ *
+ *
+ * Thu Nov 24 18:22:48 1986
+ */
+const char *
+myctime(time_t value)
+{
+ static char buf[32];
+ char *p;
+
+ strcpy(buf, ctime(&value));
+
+ if ((p = strchr(buf, '\n')) != NULL)
+ *p = '\0';
+ return buf;
+}
+
+/*
+ * strip_tabs(dst, src, length)
+ *
+ * Copies src to dst, while converting all \t (tabs) into spaces.
+ */
+void
+strip_tabs(char *dest, const char *src, size_t len)
+{
+ char *d = dest;
+
+ /* Sanity check; we don't want anything nasty... */
+ assert(dest != NULL);
+ assert(src != NULL);
+ assert(len > 0);
+
+ for (; --len && *src; ++src)
+ *d++ = *src == '\t' ? ' ' : *src;
+
+ *d = '\0'; /* NUL terminate, thanks and goodbye */
+}
+
+/*
+ * strtoken - walk through a string of tokens, using a set of separators
+ * argv 9/90
+ *
+ */
+#ifndef HAVE_STRTOK_R
+
+char *
+strtoken(char** save, char* str, const char* fs)
+{
+ char* pos = *save; /* keep last position across calls */
+ char* tmp;
+
+ if (str)
+ pos = str; /* new string scan */
+
+ while (pos && *pos && strchr(fs, *pos) != NULL)
+ ++pos; /* skip leading separators */
+
+ if (!pos || !*pos)
+ return (pos = *save = NULL); /* string contains only sep's */
+
+ tmp = pos; /* now, keep position of the token */
+
+ while (*pos && strchr(fs, *pos) == NULL)
+ ++pos; /* skip content of the token */
+
+ if (*pos)
+ *pos++ = '\0'; /* remove first sep after the token */
+ else
+ pos = NULL; /* end of string */
+
+ *save = pos;
+ return tmp;
+}
+#endif /* !HAVE_STRTOK_R */
+
+/* libio_basename()
+ *
+ * input - i.e. "/usr/local/ircd/modules/m_whois.so"
+ * output - i.e. "m_whois.so"
+ * side effects - this will be overwritten on subsequent calls
+ */
+const char *
+libio_basename(const char *path)
+{
+ const char *s;
+
+ if ((s = strrchr(path, '/')) == NULL)
+ s = path;
+ else
+ s++;
+
+ return s;
+}
+
+/*
+ * strlcat and strlcpy were ripped from openssh 2.5.1p2
+ * They had the following Copyright info:
+ *
+ *
+ * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ * All rights reserved.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED `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 AUTHOR 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.
+ */
+
+#ifndef HAVE_STRLCAT
+size_t
+strlcat(char *dst, const char *src, size_t siz)
+{
+ char *d = dst;
+ const char *s = src;
+ size_t n = siz, dlen;
+
+ while (n-- != 0 && *d != '\0')
+ d++;
+
+ dlen = d - dst;
+ n = siz - dlen;
+
+ if (n == 0)
+ return dlen + strlen(s);
+
+ while (*s != '\0')
+ {
+ if (n != 1)
+ {
+ *d++ = *s;
+ n--;
+ }
+
+ s++;
+ }
+
+ *d = '\0';
+ return dlen + (s - src); /* count does not include NUL */
+}
+#endif
+
+#ifndef HAVE_STRLCPY
+size_t
+strlcpy(char *dst, const char *src, size_t siz)
+{
+ char *d = dst;
+ const char *s = src;
+ size_t n = siz;
+
+ /* Copy as many bytes as will fit */
+ if (n != 0 && --n != 0)
+ {
+ do
+ {
+ if ((*d++ = *s++) == 0)
+ break;
+ } while (--n != 0);
+ }
+
+ /* Not enough room in dst, add NUL and traverse rest of src */
+ if (n == 0)
+ {
+ if (siz != 0)
+ *d = '\0'; /* NUL-terminate dst */
+ while (*s++)
+ ;
+ }
+
+ return s - src - 1; /* count does not include NUL */
+}
+#endif
+
+#ifdef HAVE_LIBPCRE
+void *
+ircd_pcre_compile(const char *pattern, const char **errptr)
+{
+ int erroroffset = 0;
+ int options = PCRE_EXTRA;
+
+ assert(pattern);
+
+ return pcre_compile(pattern, options, errptr, &erroroffset, NULL);
+}
+
+int
+ircd_pcre_exec(const void *code, const char *subject)
+{
+ assert(code && subject);
+
+ return pcre_exec(code, NULL, subject, strlen(subject), 0, 0, NULL, 0) < 0;
+}
+#endif