]> granicus.if.org Git - uw-imap/commitdiff
add files for 2006-08-31T02:02:40Z
authorUnknown <>
Thu, 31 Aug 2006 02:02:40 +0000 (02:02 +0000)
committerNathan Wagner <nw@hydaspes.if.org>
Fri, 7 Sep 2018 00:02:34 +0000 (00:02 +0000)
src/osdep/amiga/pmatch.c [new file with mode: 0644]
src/osdep/unix/pmatch.c [new file with mode: 0644]

diff --git a/src/osdep/amiga/pmatch.c b/src/osdep/amiga/pmatch.c
new file mode 100644 (file)
index 0000000..a7539e5
--- /dev/null
@@ -0,0 +1,89 @@
+/* ========================================================================
+ * Copyright 1988-2006 University of Washington
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 
+ * ========================================================================
+ */
+
+/*
+ * Program:    IMAP Wildcard Matching Routines (case-dependent)
+ *
+ * Author:     Mark Crispin
+ *             Networks and Distributed Computing
+ *             Computing & Communications
+ *             University of Washington
+ *             Administration Building, AG-44
+ *             Seattle, WA  98195
+ *             Internet: MRC@CAC.Washington.EDU
+ *
+ * Date:       15 June 2000
+ * Last Edited:        30 August 2006
+ */
+\f
+/* Wildcard pattern match
+ * Accepts: base string
+ *         pattern string
+ *         delimiter character
+ * Returns: T if pattern matches base, else NIL
+ */
+
+long pmatch_full (unsigned char *s,unsigned char *pat,unsigned char delim)
+{
+  switch (*pat) {
+  case '%':                    /* non-recursive */
+                               /* % at end, OK if no inferiors */
+    if (!pat[1]) return (delim && strchr (s,delim)) ? NIL : T;
+                                /* scan remainder of string until delimiter */
+    do if (pmatch_full (s,pat+1,delim)) return T;
+    while ((*s != delim) && *s++);
+    break;
+  case '*':                    /* match 0 or more characters */
+    if (!pat[1]) return T;     /* * at end, unconditional match */
+                               /* scan remainder of string */
+    do if (pmatch_full (s,pat+1,delim)) return T;
+    while (*s++);
+    break;
+  case '\0':                   /* end of pattern */
+    return *s ? NIL : T;       /* success if also end of base */
+  default:                     /* match this character */
+    return (*pat == *s) ? pmatch_full (s+1,pat+1,delim) : NIL;
+  }
+  return NIL;
+}
+\f
+/* Directory pattern match
+ * Accepts: base string
+ *         pattern string
+ *         delimiter character
+ * Returns: T if base is a matching directory of pattern, else NIL
+ */
+
+long dmatch (unsigned char *s,unsigned char *pat,unsigned char delim)
+{
+  switch (*pat) {
+  case '%':                    /* non-recursive */
+    if (!*s) return T;         /* end of base means have a subset match */
+    if (!*++pat) return NIL;   /* % at end, no inferiors permitted */
+                               /* scan remainder of string until delimiter */
+    do if (dmatch (s,pat,delim)) return T;
+    while ((*s != delim) && *s++);
+    if (*s && !s[1]) return T; /* ends with delimiter, must be subset */
+    return dmatch (s,pat,delim);/* do new scan */
+  case '*':                    /* match 0 or more characters */
+    return T;                  /* unconditional match */
+  case '\0':                   /* end of pattern */
+    break;
+  default:                     /* match this character */
+    if (*s) return (*pat == *s) ? dmatch (s+1,pat+1,delim) : NIL;
+                               /* end of base, return if at delimiter */
+    else if (*pat == delim) return T;
+    break;
+  }
+  return NIL;
+}
diff --git a/src/osdep/unix/pmatch.c b/src/osdep/unix/pmatch.c
new file mode 100644 (file)
index 0000000..a7539e5
--- /dev/null
@@ -0,0 +1,89 @@
+/* ========================================================================
+ * Copyright 1988-2006 University of Washington
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 
+ * ========================================================================
+ */
+
+/*
+ * Program:    IMAP Wildcard Matching Routines (case-dependent)
+ *
+ * Author:     Mark Crispin
+ *             Networks and Distributed Computing
+ *             Computing & Communications
+ *             University of Washington
+ *             Administration Building, AG-44
+ *             Seattle, WA  98195
+ *             Internet: MRC@CAC.Washington.EDU
+ *
+ * Date:       15 June 2000
+ * Last Edited:        30 August 2006
+ */
+\f
+/* Wildcard pattern match
+ * Accepts: base string
+ *         pattern string
+ *         delimiter character
+ * Returns: T if pattern matches base, else NIL
+ */
+
+long pmatch_full (unsigned char *s,unsigned char *pat,unsigned char delim)
+{
+  switch (*pat) {
+  case '%':                    /* non-recursive */
+                               /* % at end, OK if no inferiors */
+    if (!pat[1]) return (delim && strchr (s,delim)) ? NIL : T;
+                                /* scan remainder of string until delimiter */
+    do if (pmatch_full (s,pat+1,delim)) return T;
+    while ((*s != delim) && *s++);
+    break;
+  case '*':                    /* match 0 or more characters */
+    if (!pat[1]) return T;     /* * at end, unconditional match */
+                               /* scan remainder of string */
+    do if (pmatch_full (s,pat+1,delim)) return T;
+    while (*s++);
+    break;
+  case '\0':                   /* end of pattern */
+    return *s ? NIL : T;       /* success if also end of base */
+  default:                     /* match this character */
+    return (*pat == *s) ? pmatch_full (s+1,pat+1,delim) : NIL;
+  }
+  return NIL;
+}
+\f
+/* Directory pattern match
+ * Accepts: base string
+ *         pattern string
+ *         delimiter character
+ * Returns: T if base is a matching directory of pattern, else NIL
+ */
+
+long dmatch (unsigned char *s,unsigned char *pat,unsigned char delim)
+{
+  switch (*pat) {
+  case '%':                    /* non-recursive */
+    if (!*s) return T;         /* end of base means have a subset match */
+    if (!*++pat) return NIL;   /* % at end, no inferiors permitted */
+                               /* scan remainder of string until delimiter */
+    do if (dmatch (s,pat,delim)) return T;
+    while ((*s != delim) && *s++);
+    if (*s && !s[1]) return T; /* ends with delimiter, must be subset */
+    return dmatch (s,pat,delim);/* do new scan */
+  case '*':                    /* match 0 or more characters */
+    return T;                  /* unconditional match */
+  case '\0':                   /* end of pattern */
+    break;
+  default:                     /* match this character */
+    if (*s) return (*pat == *s) ? dmatch (s+1,pat+1,delim) : NIL;
+                               /* end of base, return if at delimiter */
+    else if (*pat == delim) return T;
+    break;
+  }
+  return NIL;
+}