qemacs-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemacs-commit] qemacs util.c


From: Charlie Gordon
Subject: [Qemacs-commit] qemacs util.c
Date: Mon, 23 Dec 2013 23:39:02 +0000

CVSROOT:        /sources/qemacs
Module name:    qemacs
Changes by:     Charlie Gordon <chqrlie>        13/12/23 23:39:02

Modified files:
        .              : util.c 

Log message:
        changed match_extension utility function
        
        * allow multiple extensions eg: |tar.gz|

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/qemacs/util.c?cvsroot=qemacs&r1=1.55&r2=1.56

Patches:
Index: util.c
===================================================================
RCS file: /sources/qemacs/qemacs/util.c,v
retrieving revision 1.55
retrieving revision 1.56
diff -u -b -r1.55 -r1.56
--- util.c      3 Dec 2013 17:35:06 -0000       1.55
+++ util.c      23 Dec 2013 23:39:02 -0000      1.56
@@ -344,16 +344,41 @@
     return dest;
 }
 
+/* Return 1 iff filename extension appears in | separated list extlist.
+ * Initial and final | do not match an empty extension, but || does.
+ * Multiple tacked extensions may appear un extlist eg. |tar.gz|
+ * Initial dots do not account as extension delimiters.
+ * . and .. do not have an empty extension, nor do they match ||
+ */
 int match_extension(const char *filename, const char *extlist)
 {
-    const char *r;
+    const char *base = get_basename(filename);
+    int len;
+    const char *p, *q;
 
-    r = get_extension(filename);
-    if (*r == '.') {
-        return strfind(extlist, r + 1);
-    } else {
+    while (*base == '.')
+        base++;
+    len = strlen(base);
+    if (len == 0)
         return 0;
+
+    for (p = q = extlist;; p++) {
+        int c = *p;
+        if (c == '|' || c == '\0') {
+            int len1 = p - q;
+            if (len1 != 0 || (q != extlist && c != '\0')) {
+                if (len > len1 && base[len - len1 - 1] == '.'
+                &&  !memcmp(base + (len - len1), q, len1)) {
+                    return 1;
     }
+            }
+            if (c == '|')
+                q = p + 1;
+            else
+                break;
+        }
+    }
+    return 0;
 }
 
 /* Remove trailing slash from path, except for / directory */



reply via email to

[Prev in Thread] Current Thread [Next in Thread]