Bug 487192: Move both copies of nsWildCard into xpcom. r/sr=bsmedberg

- Clean up memory usage.
 - Turn the helper functions into template functions.
 - Make both copies be exactly the same.
This commit is contained in:
Peter Annema 2009-05-13 20:22:54 -07:00
parent ed77e28f6c
commit 02e7d4d2a5
4 changed files with 116 additions and 54 deletions

View File

@ -48,14 +48,15 @@
*/ */
#include "nsWildCard.h" #include "nsWildCard.h"
#include "plstr.h" #include "nsXPCOM.h"
#include "prmem.h" #include "nsCRTGlue.h"
#include "nsCharTraits.h"
/* ----------------------------- _valid_subexp ---------------------------- */ /* ----------------------------- _valid_subexp ---------------------------- */
template<class T>
static int static int
_valid_subexp(char *expr, char stop) _valid_subexp(const T *expr, T stop)
{ {
register int x,y,t; register int x,y,t;
int nsc,np,tld; int nsc,np,tld;
@ -124,15 +125,26 @@ _valid_subexp(char *expr, char stop)
return ((expr[x] == stop) ? x : INVALID_SXP); return ((expr[x] == stop) ? x : INVALID_SXP);
} }
int
NS_WildCardValid(char *expr)
{
int x;
x = _valid_subexp(expr, '\0'); template<class T>
int
NS_WildCardValid_(const T *expr)
{
int x = _valid_subexp(expr, T('\0'));
return (x < 0 ? x : VALID_SXP); return (x < 0 ? x : VALID_SXP);
} }
int
NS_WildCardValid(const char *expr)
{
return NS_WildCardValid_(expr);
}
int
NS_WildCardValid(const PRUnichar *expr)
{
return NS_WildCardValid_(expr);
}
/* ----------------------------- _shexp_match ----------------------------- */ /* ----------------------------- _shexp_match ----------------------------- */
@ -141,12 +153,14 @@ NS_WildCardValid(char *expr)
#define NOMATCH 1 #define NOMATCH 1
#define ABORTED -1 #define ABORTED -1
static int _shexp_match(char *str, char *expr, PRBool case_insensitive); template<class T>
static int _shexp_match(const T *str, const T *expr, PRBool case_insensitive);
template<class T>
static int static int
_handle_union(char *str, char *expr, PRBool case_insensitive) _handle_union(const T *str, const T *expr, PRBool case_insensitive)
{ {
char *e2 = (char *) PR_Malloc(sizeof(char)*strlen(expr)); T *e2 = (T *) NS_Alloc(sizeof(T)*nsCharTraits<T>::length(expr));
register int t,p2,p1 = 1; register int t,p2,p1 = 1;
int cp; int cp;
@ -161,11 +175,11 @@ _handle_union(char *str, char *expr, PRBool case_insensitive)
} }
for (t=cp+1; ((e2[p2] = expr[t]) != 0); ++t,++p2) {} for (t=cp+1; ((e2[p2] = expr[t]) != 0); ++t,++p2) {}
if(_shexp_match(str,e2, case_insensitive) == MATCH) { if(_shexp_match(str,e2, case_insensitive) == MATCH) {
PR_Free(e2); NS_Free(e2);
return MATCH; return MATCH;
} }
if(p1 == cp) { if(p1 == cp) {
PR_Free(e2); NS_Free(e2);
return NOMATCH; return NOMATCH;
} }
else ++p1; else ++p1;
@ -173,8 +187,9 @@ _handle_union(char *str, char *expr, PRBool case_insensitive)
} }
template<class T>
static int static int
_shexp_match(char *str, char *expr, PRBool case_insensitive) _shexp_match(const T *str, const T *expr, PRBool case_insensitive)
{ {
register int x,y; register int x,y;
int ret,neg; int ret,neg;
@ -273,15 +288,17 @@ _shexp_match(char *str, char *expr, PRBool case_insensitive)
return (ret ? ret : (str[x] ? NOMATCH : MATCH)); return (ret ? ret : (str[x] ? NOMATCH : MATCH));
} }
template<class T>
int int
NS_WildCardMatch(char *str, char *xp, PRBool case_insensitive) { NS_WildCardMatch_(const T *str, const T *xp, PRBool case_insensitive)
register int x; {
char *expr = PL_strdup(xp); T *expr = NS_strdup(xp);
if(!expr) if(!expr)
return 1; return 1;
for(x=strlen(expr)-1;x;--x) { for(int x=nsCharTraits<T>::length(expr)-1;x;--x) {
if((expr[x] == '~') && (expr[x-1] != '\\')) { if((expr[x] == '~') && (expr[x-1] != '\\')) {
expr[x] = '\0'; expr[x] = '\0';
if(_shexp_match(str,&expr[++x], case_insensitive) == MATCH) if(_shexp_match(str,&expr[++x], case_insensitive) == MATCH)
@ -290,11 +307,25 @@ NS_WildCardMatch(char *str, char *xp, PRBool case_insensitive) {
} }
} }
if(_shexp_match(str,expr, case_insensitive) == MATCH) { if(_shexp_match(str,expr, case_insensitive) == MATCH) {
PL_strfree(expr); NS_Free(expr);
return 0; return 0;
} }
punt: punt:
PL_strfree(expr); NS_Free(expr);
return 1; return 1;
} }
int
NS_WildCardMatch(const char *str, const char *xp,
PRBool case_insensitive)
{
return NS_WildCardMatch_(str, xp, case_insensitive);
}
int
NS_WildCardMatch(const PRUnichar *str, const PRUnichar *xp,
PRBool case_insensitive)
{
return NS_WildCardMatch_(str, xp, case_insensitive);
}

View File

@ -53,8 +53,6 @@
#define nsWildCard_h__ #define nsWildCard_h__
#include "prtypes.h" #include "prtypes.h"
#include <ctype.h> /* isalnum */
#include <string.h> /* strlen */
/* --------------------------- Public routines ---------------------------- */ /* --------------------------- Public routines ---------------------------- */
@ -71,8 +69,9 @@
#define INVALID_SXP -2 #define INVALID_SXP -2
#define VALID_SXP 1 #define VALID_SXP 1
extern int NS_WildCardValid(char *expr); extern int NS_WildCardValid(const char *expr);
extern int NS_WildCardValid(const PRUnichar *expr);
/* return values for the search routines */ /* return values for the search routines */
#define MATCH 0 #define MATCH 0
@ -87,6 +86,10 @@ extern int NS_WildCardValid(char *expr);
* Returns 0 on match and 1 on non-match. * Returns 0 on match and 1 on non-match.
*/ */
extern int NS_WildCardMatch(char *str, char *expr, PRBool case_insensitive); extern int NS_WildCardMatch(const char *str, const char *expr,
PRBool case_insensitive);
extern int NS_WildCardMatch(const PRUnichar *str, const PRUnichar *expr,
PRBool case_insensitive);
#endif /* nsWildCard_h__ */ #endif /* nsWildCard_h__ */

View File

@ -48,15 +48,15 @@
*/ */
#include "nsWildCard.h" #include "nsWildCard.h"
#include "nsCRT.h" #include "nsXPCOM.h"
#include "plstr.h" #include "nsCRTGlue.h"
#include "prmem.h" #include "nsCharTraits.h"
/* ----------------------------- _valid_subexp ---------------------------- */ /* ----------------------------- _valid_subexp ---------------------------- */
template<class T>
static int static int
_valid_subexp(PRUnichar *expr, PRUnichar stop) _valid_subexp(const T *expr, T stop)
{ {
register int x,y,t; register int x,y,t;
int nsc,np,tld; int nsc,np,tld;
@ -125,15 +125,26 @@ _valid_subexp(PRUnichar *expr, PRUnichar stop)
return ((expr[x] == stop) ? x : INVALID_SXP); return ((expr[x] == stop) ? x : INVALID_SXP);
} }
int
NS_WildCardValid(PRUnichar *expr)
{
int x;
x = _valid_subexp(expr, '\0'); template<class T>
int
NS_WildCardValid_(const T *expr)
{
int x = _valid_subexp(expr, T('\0'));
return (x < 0 ? x : VALID_SXP); return (x < 0 ? x : VALID_SXP);
} }
int
NS_WildCardValid(const char *expr)
{
return NS_WildCardValid_(expr);
}
int
NS_WildCardValid(const PRUnichar *expr)
{
return NS_WildCardValid_(expr);
}
/* ----------------------------- _shexp_match ----------------------------- */ /* ----------------------------- _shexp_match ----------------------------- */
@ -142,14 +153,14 @@ NS_WildCardValid(PRUnichar *expr)
#define NOMATCH 1 #define NOMATCH 1
#define ABORTED -1 #define ABORTED -1
static int _shexp_match(const PRUnichar *str, const PRUnichar *expr, template<class T>
PRBool case_insensitive); static int _shexp_match(const T *str, const T *expr, PRBool case_insensitive);
template<class T>
static int static int
_handle_union(const PRUnichar *str, const PRUnichar *expr, _handle_union(const T *str, const T *expr, PRBool case_insensitive)
PRBool case_insensitive)
{ {
PRUnichar *e2 = (PRUnichar *) PR_Malloc(sizeof(PRUnichar)*nsCRT::strlen(expr)); T *e2 = (T *) NS_Alloc(sizeof(T)*nsCharTraits<T>::length(expr));
register int t,p2,p1 = 1; register int t,p2,p1 = 1;
int cp; int cp;
@ -164,11 +175,11 @@ _handle_union(const PRUnichar *str, const PRUnichar *expr,
} }
for (t=cp+1; ((e2[p2] = expr[t]) != 0); ++t,++p2) {} for (t=cp+1; ((e2[p2] = expr[t]) != 0); ++t,++p2) {}
if(_shexp_match(str,e2, case_insensitive) == MATCH) { if(_shexp_match(str,e2, case_insensitive) == MATCH) {
PR_Free(e2); NS_Free(e2);
return MATCH; return MATCH;
} }
if(p1 == cp) { if(p1 == cp) {
PR_Free(e2); NS_Free(e2);
return NOMATCH; return NOMATCH;
} }
else ++p1; else ++p1;
@ -176,9 +187,9 @@ _handle_union(const PRUnichar *str, const PRUnichar *expr,
} }
template<class T>
static int static int
_shexp_match(const PRUnichar *str, const PRUnichar *expr, _shexp_match(const T *str, const T *expr, PRBool case_insensitive)
PRBool case_insensitive)
{ {
register int x,y; register int x,y;
int ret,neg; int ret,neg;
@ -277,16 +288,17 @@ _shexp_match(const PRUnichar *str, const PRUnichar *expr,
return (ret ? ret : (str[x] ? NOMATCH : MATCH)); return (ret ? ret : (str[x] ? NOMATCH : MATCH));
} }
template<class T>
int int
NS_WildCardMatch(const PRUnichar *str, const PRUnichar *xp, NS_WildCardMatch_(const T *str, const T *xp, PRBool case_insensitive)
PRBool case_insensitive) { {
register int x; T *expr = NS_strdup(xp);
PRUnichar *expr = nsCRT::strdup(xp);
if(!expr) if(!expr)
return 1; return 1;
for(x=nsCRT::strlen(expr)-1;x;--x) { for(int x=nsCharTraits<T>::length(expr)-1;x;--x) {
if((expr[x] == '~') && (expr[x-1] != '\\')) { if((expr[x] == '~') && (expr[x-1] != '\\')) {
expr[x] = '\0'; expr[x] = '\0';
if(_shexp_match(str,&expr[++x], case_insensitive) == MATCH) if(_shexp_match(str,&expr[++x], case_insensitive) == MATCH)
@ -295,11 +307,25 @@ NS_WildCardMatch(const PRUnichar *str, const PRUnichar *xp,
} }
} }
if(_shexp_match(str,expr, case_insensitive) == MATCH) { if(_shexp_match(str,expr, case_insensitive) == MATCH) {
PR_Free(expr); NS_Free(expr);
return 0; return 0;
} }
punt: punt:
PR_Free(expr); NS_Free(expr);
return 1; return 1;
} }
int
NS_WildCardMatch(const char *str, const char *xp,
PRBool case_insensitive)
{
return NS_WildCardMatch_(str, xp, case_insensitive);
}
int
NS_WildCardMatch(const PRUnichar *str, const PRUnichar *xp,
PRBool case_insensitive)
{
return NS_WildCardMatch_(str, xp, case_insensitive);
}

View File

@ -53,8 +53,6 @@
#define nsWildCard_h__ #define nsWildCard_h__
#include "prtypes.h" #include "prtypes.h"
#include <ctype.h> /* isalnum */
#include <string.h> /* strlen */
/* --------------------------- Public routines ---------------------------- */ /* --------------------------- Public routines ---------------------------- */
@ -71,8 +69,9 @@
#define INVALID_SXP -2 #define INVALID_SXP -2
#define VALID_SXP 1 #define VALID_SXP 1
extern int NS_WildCardValid(PRUnichar *expr); extern int NS_WildCardValid(const char *expr);
extern int NS_WildCardValid(const PRUnichar *expr);
/* return values for the search routines */ /* return values for the search routines */
#define MATCH 0 #define MATCH 0
@ -87,6 +86,9 @@ extern int NS_WildCardValid(PRUnichar *expr);
* Returns 0 on match and 1 on non-match. * Returns 0 on match and 1 on non-match.
*/ */
extern int NS_WildCardMatch(const char *str, const char *expr,
PRBool case_insensitive);
extern int NS_WildCardMatch(const PRUnichar *str, const PRUnichar *expr, extern int NS_WildCardMatch(const PRUnichar *str, const PRUnichar *expr,
PRBool case_insensitive); PRBool case_insensitive);