On Sat, Mar 23, 2013 at 11:18:24AM +0700, Duy Nguyen wrote:
> You can use nwildmatch() from this patch. I tested it lightly with
> t3070-wildmatch.sh, feeding the strings with no terminating NUL. It
> seems to work ok.

And valgrind spotted my faults, especially for using strchr. You would
need this on top:

-- 8< --
diff --git a/wildmatch.c b/wildmatch.c
index f97ae2a..939bac8 100644
--- a/wildmatch.c
+++ b/wildmatch.c
@@ -61,9 +61,13 @@ static int dowild(const uchar *p, const uchar *text,
        for ( ; (p_ch = *p) != '\0'; text++, p++) {
                int matched, match_slash, negated;
                uchar t_ch, prev_ch;
-               if (text >= textend && p_ch != '*')
-                       return WM_ABORT_ALL;
-               t_ch = *text;
+               if (text >= textend) {
+                       if (p_ch != '*')
+                               return WM_ABORT_ALL;
+                       else
+                               t_ch = '\0';
+               } else
+                       t_ch = *text;
                if ((flags & WM_CASEFOLD) && ISUPPER(t_ch))
                        t_ch = tolower(t_ch);
                if ((flags & WM_CASEFOLD) && ISUPPER(p_ch))
@@ -115,8 +119,9 @@ static int dowild(const uchar *p, const uchar *text,
                                /* Trailing "**" matches everything.  Trailing 
"*" matches
                                 * only if there are no more slash characters. 
*/
                                if (!match_slash) {
-                                       if (strchr((char*)text, '/') != NULL)
-                                               return WM_NOMATCH;
+                                       for (;text < textend; text++)
+                                               if (*text == '/')
+                                                       return WM_NOMATCH;
                                }
                                return WM_MATCH;
                        } else if (!match_slash && *p == '/') {
@@ -125,10 +130,11 @@ static int dowild(const uchar *p, const uchar *text,
                                 * with WM_PATHNAME matches the next
                                 * directory
                                 */
-                               const char *slash = strchr((char*)text, '/');
-                               if (!slash)
+                               for (;text < textend; text++)
+                                       if (*text == '/')
+                                               break;
+                               if (text == textend)
                                        return WM_NOMATCH;
-                               text = (const uchar*)slash;
                                /* the slash is consumed by the top-level for 
loop */
                                break;
                        }
@@ -151,7 +157,7 @@ static int dowild(const uchar *p, const uchar *text,
                                                        t_ch = tolower(t_ch);
                                                if (t_ch == p_ch)
                                                        break;
-                                               t_ch = *++text;
+                                               t_ch = ++text < textend ? *text 
: '\0';
                                        }
                                        if (t_ch != p_ch)
                                                return WM_NOMATCH;
-- 8< --
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to