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 "plstr.h"
#include "prmem.h"
#include "nsXPCOM.h"
#include "nsCRTGlue.h"
#include "nsCharTraits.h"
/* ----------------------------- _valid_subexp ---------------------------- */
template<class T>
static int
_valid_subexp(char *expr, char stop)
_valid_subexp(const T *expr, T stop)
{
register int x,y,t;
int nsc,np,tld;
@ -124,15 +125,26 @@ _valid_subexp(char *expr, char stop)
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);
}
int
NS_WildCardValid(const char *expr)
{
return NS_WildCardValid_(expr);
}
int
NS_WildCardValid(const PRUnichar *expr)
{
return NS_WildCardValid_(expr);
}
/* ----------------------------- _shexp_match ----------------------------- */
@ -141,12 +153,14 @@ NS_WildCardValid(char *expr)
#define NOMATCH 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
_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;
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) {}
if(_shexp_match(str,e2, case_insensitive) == MATCH) {
PR_Free(e2);
NS_Free(e2);
return MATCH;
}
if(p1 == cp) {
PR_Free(e2);
NS_Free(e2);
return NOMATCH;
}
else ++p1;
@ -173,8 +187,9 @@ _handle_union(char *str, char *expr, PRBool case_insensitive)
}
template<class T>
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;
int ret,neg;
@ -273,15 +288,17 @@ _shexp_match(char *str, char *expr, PRBool case_insensitive)
return (ret ? ret : (str[x] ? NOMATCH : MATCH));
}
template<class T>
int
NS_WildCardMatch(char *str, char *xp, PRBool case_insensitive) {
register int x;
char *expr = PL_strdup(xp);
NS_WildCardMatch_(const T *str, const T *xp, PRBool case_insensitive)
{
T *expr = NS_strdup(xp);
if(!expr)
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] != '\\')) {
expr[x] = '\0';
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) {
PL_strfree(expr);
NS_Free(expr);
return 0;
}
punt:
PL_strfree(expr);
NS_Free(expr);
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__
#include "prtypes.h"
#include <ctype.h> /* isalnum */
#include <string.h> /* strlen */
/* --------------------------- Public routines ---------------------------- */
@ -71,8 +69,9 @@
#define INVALID_SXP -2
#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 */
#define MATCH 0
@ -87,6 +86,10 @@ extern int NS_WildCardValid(char *expr);
* 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__ */

View File

@ -48,15 +48,15 @@
*/
#include "nsWildCard.h"
#include "nsCRT.h"
#include "plstr.h"
#include "prmem.h"
#include "nsXPCOM.h"
#include "nsCRTGlue.h"
#include "nsCharTraits.h"
/* ----------------------------- _valid_subexp ---------------------------- */
template<class T>
static int
_valid_subexp(PRUnichar *expr, PRUnichar stop)
_valid_subexp(const T *expr, T stop)
{
register int x,y,t;
int nsc,np,tld;
@ -125,15 +125,26 @@ _valid_subexp(PRUnichar *expr, PRUnichar stop)
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);
}
int
NS_WildCardValid(const char *expr)
{
return NS_WildCardValid_(expr);
}
int
NS_WildCardValid(const PRUnichar *expr)
{
return NS_WildCardValid_(expr);
}
/* ----------------------------- _shexp_match ----------------------------- */
@ -142,14 +153,14 @@ NS_WildCardValid(PRUnichar *expr)
#define NOMATCH 1
#define ABORTED -1
static int _shexp_match(const PRUnichar *str, const PRUnichar *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
_handle_union(const PRUnichar *str, const PRUnichar *expr,
PRBool case_insensitive)
_handle_union(const T *str, const T *expr, 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;
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) {}
if(_shexp_match(str,e2, case_insensitive) == MATCH) {
PR_Free(e2);
NS_Free(e2);
return MATCH;
}
if(p1 == cp) {
PR_Free(e2);
NS_Free(e2);
return NOMATCH;
}
else ++p1;
@ -176,9 +187,9 @@ _handle_union(const PRUnichar *str, const PRUnichar *expr,
}
template<class T>
static int
_shexp_match(const PRUnichar *str, const PRUnichar *expr,
PRBool case_insensitive)
_shexp_match(const T *str, const T *expr, PRBool case_insensitive)
{
register int x,y;
int ret,neg;
@ -277,16 +288,17 @@ _shexp_match(const PRUnichar *str, const PRUnichar *expr,
return (ret ? ret : (str[x] ? NOMATCH : MATCH));
}
template<class T>
int
NS_WildCardMatch(const PRUnichar *str, const PRUnichar *xp,
PRBool case_insensitive) {
register int x;
PRUnichar *expr = nsCRT::strdup(xp);
NS_WildCardMatch_(const T *str, const T *xp, PRBool case_insensitive)
{
T *expr = NS_strdup(xp);
if(!expr)
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] != '\\')) {
expr[x] = '\0';
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) {
PR_Free(expr);
NS_Free(expr);
return 0;
}
punt:
PR_Free(expr);
NS_Free(expr);
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__
#include "prtypes.h"
#include <ctype.h> /* isalnum */
#include <string.h> /* strlen */
/* --------------------------- Public routines ---------------------------- */
@ -71,8 +69,9 @@
#define INVALID_SXP -2
#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 */
#define MATCH 0
@ -87,6 +86,9 @@ extern int NS_WildCardValid(PRUnichar *expr);
* 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,
PRBool case_insensitive);