]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/match.c
New function MatchCaseInsensitiveList() to check list of patterns
[ngircd-alex.git] / src / ngircd / match.c
index 6c28938ef9bb4fc0dc19b3e8d82ed8dd7c3ffef7..75bf4358395d27fa21b8a9c213c307a82a2196d6 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
+ * Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
  *
  * 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
@@ -9,7 +9,6 @@
  * Please read the file COPYING, README and AUTHORS for more information.
  */
 
-
 #include "portab.h"
 
 /**
 
 
 /*
- * Die Pattern-Matching-Funkionen [Matche(), Matche_After_Star()] basieren
- * auf Versionen von J. Kercheval. Die Version 1.1 wurde am 12.03.1991 als
- * "public domain" freigegeben:
- * <http://www.snippets.org/snippets/portable/MATCH+C.php3>
+ * The pattern matching functions [Matche(), Matche_After_Star()] are based
+ * on code of J. Kercheval. Version 1.1 has been released on 1991-03-12 as
+ * "public domain": <http://c.snippets.org/snip_lister.php?fname=match.c>
  */
 
 
@@ -39,14 +37,21 @@ static int Matche PARAMS(( const char *p, const char *t ));
 static int Matche_After_Star PARAMS(( const char *p, const char *t ));
 
 
-#define MATCH_PATTERN  6       /* bad pattern */
-#define MATCH_LITERAL  5       /* match failure on literal match */
-#define MATCH_RANGE    4       /* match failure on [..] construct */
-#define MATCH_ABORT    3       /* premature end of text string */
-#define MATCH_END      2       /* premature end of pattern string */
-#define MATCH_VALID    1       /* valid match */
+#define MATCH_PATTERN  6       /**< bad pattern */
+#define MATCH_LITERAL  5       /**< match failure on literal match */
+#define MATCH_RANGE    4       /**< match failure on [..] construct */
+#define MATCH_ABORT    3       /**< premature end of text string */
+#define MATCH_END      2       /**< premature end of pattern string */
+#define MATCH_VALID    1       /**< valid match */
 
 
+/**
+ * Match string with pattern.
+ *
+ * @param Pattern Pattern to match with
+ * @param String Input string
+ * @return true if pattern matches
+ */
 GLOBAL bool
 Match( const char *Pattern, const char *String )
 {
@@ -56,13 +61,49 @@ Match( const char *Pattern, const char *String )
 } /* Match */
 
 
+/**
+ * Match string with pattern case-insensitive.
+ *
+ * @param Pattern Pattern to match with
+ * @param String Input string, at most COMMAND_LEN-1 characters long
+ * @return true if pattern matches
+ */
 GLOBAL bool
-MatchCaseInsensitive(const char *pattern, const char *searchme)
+MatchCaseInsensitive(const char *Pattern, const char *String)
 {
        char haystack[COMMAND_LEN];
 
-       strlcpy(haystack, searchme, sizeof(haystack));
-       return Match(pattern, ngt_LowerStr(haystack));
+       strlcpy(haystack, String, sizeof(haystack));
+       return Match(Pattern, ngt_LowerStr(haystack));
+} /* MatchCaseInsensitive */
+
+
+/**
+ * Match string with pattern case-insensitive.
+ *
+ * @param pattern Pattern to match with
+ * @param String Input string, at most COMMAND_LEN-1 characters long
+ * @param Separator Character separating the individual patterns in the list
+ * @return true if pattern matches
+ */
+GLOBAL bool
+MatchCaseInsensitiveList(const char *Pattern, const char *String,
+                    const char *Separator)
+{
+       char tmp_pattern[COMMAND_LEN], haystack[COMMAND_LEN], *ptr;
+
+       strlcpy(tmp_pattern, Pattern, sizeof(tmp_pattern));
+       strlcpy(haystack, String, sizeof(haystack));
+       ngt_LowerStr(haystack);
+
+       ptr = strtok(tmp_pattern, Separator);
+       while (ptr) {
+               ngt_TrimStr(ptr);
+               if (Match(ptr, haystack))
+                       return true;
+               ptr = strtok(NULL, Separator);
+       }
+       return false;
 } /* MatchCaseInsensitive */