From c58f0c13b4c63c5773b483524b30f034d657d8b9 Mon Sep 17 00:00:00 2001 From: scullin Date: Fri, 5 Jun 1998 23:45:30 +0000 Subject: [PATCH] Moved xp_reg to network/utils/mkreg. It was only used in netlib, anyway. --- network/Makefile | 3 +- network/main/jsautocf.c | 1 - network/main/makefile.win | 1 + network/main/mkautocf.c | 6 +- network/main/mkparse.c | 18 +- network/makefile.win | 1 + network/module/makefile.win | 1 + network/module/nsNetStubs.cpp | 23 --- network/module/tests/Makefile | 5 +- network/protocol/nntp/mknews.c | 1 - network/protocol/nntp/mknewsgr.c | 6 +- network/util/MANIFEST | 5 + network/util/Makefile | 36 ++++ network/util/makefile.win | 82 +++++++++ network/util/mkreg.c | 304 +++++++++++++++++++++++++++++++ network/util/mkreg.h | 105 +++++++++++ 16 files changed, 557 insertions(+), 41 deletions(-) create mode 100644 network/util/MANIFEST create mode 100644 network/util/Makefile create mode 100644 network/util/makefile.win create mode 100644 network/util/mkreg.c create mode 100644 network/util/mkreg.h diff --git a/network/Makefile b/network/Makefile index d0e34ca165e8..41e5b92a736d 100644 --- a/network/Makefile +++ b/network/Makefile @@ -26,7 +26,8 @@ DIRS = \ cnvts \ mimetype \ main \ - protocol + protocol \ + util ifdef MODULAR_NETLIB DIRS += module diff --git a/network/main/jsautocf.c b/network/main/jsautocf.c index db125a62aaff..ea305fa9d627 100644 --- a/network/main/jsautocf.c +++ b/network/main/jsautocf.c @@ -38,7 +38,6 @@ #include "gui.h" #include "msgcom.h" -#include "xp_reg.h" #if defined(XP_UNIX) || defined(XP_WIN32) #include "prnetdb.h" #else diff --git a/network/main/makefile.win b/network/main/makefile.win index ff93461c5d43..8f71b307b9b8 100644 --- a/network/main/makefile.win +++ b/network/main/makefile.win @@ -136,6 +136,7 @@ LINCS=-I$(PUBLIC)\jtools \ -I$(PUBLIC)\httpurl \ -I$(PUBLIC)\cnetinit \ -I$(PUBLIC)\mimetype \ + -I$(PUBLIC)\network \ -I$(PUBLIC)\security #!endif diff --git a/network/main/mkautocf.c b/network/main/mkautocf.c index 79ffd67436e0..70b32cfe9fd4 100644 --- a/network/main/mkautocf.c +++ b/network/main/mkautocf.c @@ -45,7 +45,7 @@ #define WANT_ENUM_STRING_IDS #include "allxpstr.h" #undef WANT_ENUM_STRING_IDS -#include "xp_reg.h" +#include "mkreg.h" #ifndef NSPR20 #if defined(XP_UNIX) || defined(XP_WIN32) @@ -1606,8 +1606,8 @@ proxy_regExpMatch(JSContext *mc, JSObject *obj, unsigned int argc, const char *url = JS_GetStringBytes(JSVAL_TO_STRING(argv[0])); const char *pat = JS_GetStringBytes(JSVAL_TO_STRING(argv[1])); - if (url && pat && XP_RegExpValid((char *) pat) && /* XXX */ - !XP_RegExpMatch((char *) url, (char *) pat, TRUE)) {/* XXX */ + if (url && pat && NET_RegExpValid((char *) pat) && /* XXX */ + !NET_RegExpMatch((char *) url, (char *) pat, TRUE)) {/* XXX */ *rval = JSVAL_TRUE; return JS_TRUE; } diff --git a/network/main/mkparse.c b/network/main/mkparse.c index e69e5187331a..a011b5f5ba84 100644 --- a/network/main/mkparse.c +++ b/network/main/mkparse.c @@ -25,6 +25,7 @@ #include "mkparse.h" #include "xp_time.h" #include "mkfsort.h" +#include "prtime.h" extern int MK_OUT_OF_MEMORY; @@ -558,15 +559,14 @@ MODULE_PRIVATE time_t NET_ParseDate(char *date_string) { #ifndef USE_OLD_TIME_FUNC - time_t date; + PRTime date; TRACEMSG(("Parsing date string: %s\n",date_string)); - /* try using XP_ParseTimeString instead + /* try using PR_ParseTimeString instead */ - date = XP_ParseTimeString(date_string, TRUE); - - if(date) + + if(PR_ParseTimeString(date_string, TRUE, &date)) { TRACEMSG(("Parsed date as GMT: %s\n", asctime(gmtime(&date)))); TRACEMSG(("Parsed date as local: %s\n", ctime(&date))); @@ -576,7 +576,7 @@ NET_ParseDate(char *date_string) TRACEMSG(("Could not parse date")); } - return(date); + return((time_t) date); #else struct tm time_info; /* Points to static tm structure */ @@ -1662,7 +1662,11 @@ net_parse_http_index_201_line(HTTPIndexParserData *obj, char *data_line) break; case LAST_MODIFIED_TOKEN: - file_struct->date = XP_ParseTimeString(token, TRUE); + { + PRTime prtime; + PR_ParseTimeString(token, TRUE, &prtime); + file_struct->date = (time_t) prtime; + } break; case CONTENT_TYPE_TOKEN: diff --git a/network/makefile.win b/network/makefile.win index 6ad8f8376dd6..b161eb21a09e 100644 --- a/network/makefile.win +++ b/network/makefile.win @@ -27,6 +27,7 @@ IGNORE_MANIFEST=1 DEPTH=.. DIRS= \ + util \ main \ mimetype \ cache \ diff --git a/network/module/makefile.win b/network/module/makefile.win index 70fa0648be9b..cd53e8af3122 100644 --- a/network/module/makefile.win +++ b/network/module/makefile.win @@ -90,6 +90,7 @@ NETLIBS=\ $(DIST)\lib\netcache.lib \ $(DIST)\lib\netcnvts.lib \ $(DIST)\lib\mimetype.lib \ + $(DIST)\lib\netutil.lib \ $(DIST)\lib\network.lib \ $(NULL) diff --git a/network/module/nsNetStubs.cpp b/network/module/nsNetStubs.cpp index da62fed4a657..ee5f170852fe 100644 --- a/network/module/nsNetStubs.cpp +++ b/network/module/nsNetStubs.cpp @@ -27,7 +27,6 @@ #include "net.h" extern "C" { -#include "xp_reg.h" #include "secnav.h" #include "preenc.h" }; @@ -1208,28 +1207,6 @@ LM_SendOnHelp(MWContext *context) MOZ_FUNCTION_STUB; } -/* - *--------------------------------------------------------------------------- - * From ns/lib/xp/xp_reg.c - *--------------------------------------------------------------------------- - */ - - -PUBLIC int -XP_RegExpMatch(char *str, char *xp, Bool case_insensitive) -{ - MOZ_FUNCTION_STUB; - return 1; -} - - -PUBLIC int -XP_RegExpValid(char *exp) -{ - MOZ_FUNCTION_STUB; - return INVALID_SXP; -} - /* *--------------------------------------------------------------------------- * From ns/lib/xp/xplocale.c diff --git a/network/module/tests/Makefile b/network/module/tests/Makefile index 4647ef5f585e..db324a2eb429 100644 --- a/network/module/tests/Makefile +++ b/network/module/tests/Makefile @@ -35,11 +35,12 @@ EX_LIBS = \ $(DIST)/bin/libftpurl.so \ $(DIST)/bin/libgophurl.so \ $(DIST)/bin/libremoturl.so \ - $(DIST)/bin/libhttpurl.so \ + $(DIST)/bin/libhttpurl.so \ $(DIST)/bin/libnetcache.so \ $(DIST)/bin/libmimetype.so \ $(DIST)/bin/libnetwork.so \ - $(DIST)/bin/libnetlib.so \ + $(DIST)/bin/libnetlib.so \ + $(DIST)/bin/libnetutil.so \ $(DIST)/bin/libreg.so \ $(DIST)/bin/libxpcom.so \ $(DIST)/bin/libpwcac.so \ diff --git a/network/protocol/nntp/mknews.c b/network/protocol/nntp/mknews.c index 6ddfa8202750..66732a4a3f99 100644 --- a/network/protocol/nntp/mknews.c +++ b/network/protocol/nntp/mknews.c @@ -34,7 +34,6 @@ #include "mime.h" #include "shist.h" #include "glhist.h" -#include "xp_reg.h" #include "mknews.h" #include "mktcp.h" #include "mkparse.h" diff --git a/network/protocol/nntp/mknewsgr.c b/network/protocol/nntp/mknewsgr.c index 36e2c8ffbca6..f1f6e0cb04ce 100644 --- a/network/protocol/nntp/mknewsgr.c +++ b/network/protocol/nntp/mknewsgr.c @@ -18,7 +18,7 @@ #include "mkutils.h" #include "mknewsgr.h" #include "msgcom.h" -#include "xp_reg.h" +#include "mkreg.h" #include "xp_qsort.h" #define DYN_ARRAY_INIT_SIZE 2 @@ -579,7 +579,7 @@ int net_NumberOfGroupsInLevel(SubgroupList *SGptr, TRACEMSG(("Comparing %s and %s", large_buffer, search_string)); - if(!XP_RegExpSearch(large_buffer, search_string)) + if(!NET_RegExpSearch(large_buffer, search_string)) num_at_this_level++; } @@ -633,7 +633,7 @@ int net_recursiveDisplayNewsgroups(MWContext *context, PR_snprintf(large_buffer, BUFFER_SIZE, "%.400s", NGptr->name); } - if(!XP_RegExpSearch(large_buffer, search_string)) + if(!NET_RegExpSearch(large_buffer, search_string)) display_this_one = TRUE; else display_this_one=FALSE; diff --git a/network/util/MANIFEST b/network/util/MANIFEST new file mode 100644 index 000000000000..9acc3dd22017 --- /dev/null +++ b/network/util/MANIFEST @@ -0,0 +1,5 @@ +# +# This is a list of local files which get copied to the mozilla:dist directory +# + +mkreg.h diff --git a/network/util/Makefile b/network/util/Makefile new file mode 100644 index 000000000000..9d9dbff9b5f9 --- /dev/null +++ b/network/util/Makefile @@ -0,0 +1,36 @@ +#!gmake +# +# The contents of this file are subject to the Netscape Public License +# Version 1.0 (the "NPL"); you may not use this file except in +# compliance with the NPL. You may obtain a copy of the NPL at +# http://www.mozilla.org/NPL/ +# +# Software distributed under the NPL is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL +# for the specific language governing rights and limitations under the +# NPL. +# +# The Initial Developer of this code under the NPL is Netscape +# Communications Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All Rights +# Reserved. + +DEPTH = ../.. + +MODULE = network +LIBRARY_NAME = netutil + +CSRCS = \ + mkreg.c \ + $(NULL) + +EXPORTS=mkreg.h + +include $(DEPTH)/config/config.mk + +REQUIRES = network + +include $(DEPTH)/config/rules.mk + + + diff --git a/network/util/makefile.win b/network/util/makefile.win new file mode 100644 index 000000000000..528e784ccea5 --- /dev/null +++ b/network/util/makefile.win @@ -0,0 +1,82 @@ +#!gmake +# +# The contents of this file are subject to the Netscape Public License +# Version 1.0 (the "NPL"); you may not use this file except in +# compliance with the NPL. You may obtain a copy of the NPL at +# http://www.mozilla.org/NPL/ +# +# Software distributed under the NPL is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL +# for the specific language governing rights and limitations under the +# NPL. +# +# The Initial Developer of this code under the NPL is Netscape +# Communications Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All Rights +# Reserved. + +IGNORE_MANIFEST=1 +# + +#------------------------------------------------------------------------ +# +# Makefile to build the Network LIB +# +#------------------------------------------------------------------------ + + +# +# Make sure we have MOZILLA_CLIENT defined so we get the +# proper JS includes +# +LCFLAGS = $(LCFLAGS) -DMOZILLA_CLIENT + +!ifdef BUILD_DEBUG_GC +LCFLAGS = $(LCFLAGS) -DDEBUG_GC +!endif + +LLIBS= \ + $(NULL) + +MISCDEP=$(LLIBS) + +OBJS= \ + .\$(OBJDIR)\mkreg.obj \ + $(NULL) + + +CSRCS = \ + mkreg.c \ + $(NULL) + +MODULE=network +DEPTH=..\.. + +LIBRARY_NAME=netutil + +EXTRA_LIBS= + +REQUIRES= network +EXPORTS= \ + mkreg.h \ + $(NULL); + +C_OBJS = \ + $(NULL) + + +# use LINCS on win32 for now since REQUIRES seems to be broken +#!if "$(MOZ_BITS)" != "16" +LINCS= \ + -I$(PUBLIC)\network \ + $(NULL) +#!endif + +include <$(DEPTH)\config\rules.mak> + +libs:: $(LIBRARY) + $(MAKE_INSTALL) $(LIBRARY) $(DIST)\lib + +symbols:: + @echo "LIBRARY_NAME is $(LIBRARY_NAME)" + @echo "LIBRARY is $(LIBRARY)" diff --git a/network/util/mkreg.c b/network/util/mkreg.c new file mode 100644 index 000000000000..3d8864c3d2db --- /dev/null +++ b/network/util/mkreg.c @@ -0,0 +1,304 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +/* * + * + * + * shexp.c: shell-like wildcard match routines + * + * See shexp.h for public documentation. + * + * Rob McCool + * + */ + +#include "mkreg.h" +#include "plstr.h" +#include "prmem.h" + +/* ----------------------------- shexp_valid ------------------------------ */ + + +PRIVATE int +_valid_subexp(char *exp, char stop) +{ + register int x,y,t; + int nsc,np,tld; + + x=0;nsc=0;tld=0; + + while(exp[x] && (exp[x] != stop)) { + switch(exp[x]) { + case '~': + if(tld) return INVALID_SXP; + else ++tld; + case '*': + case '?': + case '^': + case '$': + ++nsc; + break; + case '[': + ++nsc; + if((!exp[++x]) || (exp[x] == ']')) + return INVALID_SXP; + for(++x;exp[x] && (exp[x] != ']');++x) + if(exp[x] == '\\') + if(!exp[++x]) + return INVALID_SXP; + if(!exp[x]) + return INVALID_SXP; + break; + case '(': + ++nsc;np = 0; + while(1) { + if(exp[++x] == ')') + return INVALID_SXP; + for(y=x;(exp[y]) && (exp[y] != '|') && (exp[y] != ')');++y) + if(exp[y] == '\\') + if(!exp[++y]) + return INVALID_SXP; + if(!exp[y]) + return INVALID_SXP; + if(exp[y] == '|') + ++np; + t = _valid_subexp(&exp[x],exp[y]); + if(t == INVALID_SXP) + return INVALID_SXP; + x+=t; + if(exp[x] == ')') { + if(!np) + return INVALID_SXP; + break; + } + } + break; + case ')': + case ']': + return INVALID_SXP; + case '\\': + if(!exp[++x]) + return INVALID_SXP; + default: + break; + } + ++x; + } + if((!stop) && (!nsc)) + return NON_SXP; + return ((exp[x] == stop) ? x : INVALID_SXP); +} + +PUBLIC int +NET_RegExpValid(char *exp) +{ + int x; + + x = _valid_subexp(exp, '\0'); + return (x < 0 ? x : VALID_SXP); +} + + +/* ----------------------------- shexp_match ----------------------------- */ + + +#define MATCH 0 +#define NOMATCH 1 +#define ABORTED -1 + +PRIVATE int _shexp_match(char *str, char *exp, Bool case_insensitive); + +PRIVATE int +_handle_union(char *str, char *exp, Bool case_insensitive) +{ + char *e2 = (char *) PR_Malloc(sizeof(char)*strlen(exp)); + register int t,p2,p1 = 1; + int cp; + + while(1) { + for(cp=1;exp[cp] != ')';cp++) + if(exp[cp] == '\\') + ++cp; + for(p2 = 0;(exp[p1] != '|') && (p1 != cp);p1++,p2++) { + if(exp[p1] == '\\') + e2[p2++] = exp[p1++]; + e2[p2] = exp[p1]; + } + for (t=cp+1; ((e2[p2] = exp[t]) != 0); ++t,++p2) {} + if(_shexp_match(str,e2, case_insensitive) == MATCH) { + PR_Free(e2); + return MATCH; + } + if(p1 == cp) { + PR_Free(e2); + return NOMATCH; + } + else ++p1; + } +} + + +PRIVATE int +_shexp_match(char *str, char *exp, Bool case_insensitive) +{ + register int x,y; + int ret,neg; + + ret = 0; + for(x=0,y=0;exp[y];++y,++x) { + if((!str[x]) && (exp[y] != '(') && (exp[y] != '$') && (exp[y] != '*')) + ret = ABORTED; + else { + switch(exp[y]) { + case '$': + if( (str[x]) ) + ret = NOMATCH; + else + --x; /* we don't want loop to increment x */ + break; + case '*': + while(exp[++y] == '*'){} + if(!exp[y]) + return MATCH; + while(str[x]) { + switch(_shexp_match(&str[x++],&exp[y], case_insensitive)) { + case NOMATCH: + continue; + case ABORTED: + ret = ABORTED; + break; + default: + return MATCH; + } + break; + } + if((exp[y] == '$') && (exp[y+1] == '\0') && (!str[x])) + return MATCH; + else + ret = ABORTED; + break; + case '[': + neg = ((exp[++y] == '^') && (exp[y+1] != ']')); + if (neg) + ++y; + + if ((isalnum(exp[y])) && (exp[y+1] == '-') && + (isalnum(exp[y+2])) && (exp[y+3] == ']')) + { + int start = exp[y], end = exp[y+2]; + + /* Droolproofing for pinheads not included */ + if(neg ^ ((str[x] < start) || (str[x] > end))) { + ret = NOMATCH; + break; + } + y+=3; + } + else { + int matched; + + for (matched=0;exp[y] != ']';y++) + matched |= (str[x] == exp[y]); + if (neg ^ (!matched)) + ret = NOMATCH; + } + break; + case '(': + return _handle_union(&str[x],&exp[y], case_insensitive); + break; + case '?': + break; + case '\\': + ++y; + default: + if(case_insensitive) + { + if(toupper(str[x]) != toupper(exp[y])) + ret = NOMATCH; + } + else + { + if(str[x] != exp[y]) + ret = NOMATCH; + } + break; + } + } + if(ret) + break; + } + return (ret ? ret : (str[x] ? NOMATCH : MATCH)); +} + +PUBLIC int +NET_RegExpMatch(char *str, char *xp, Bool case_insensitive) { + register int x; + char *exp = PL_strdup(xp); + + if(!exp) + return 1; + + for(x=strlen(exp)-1;x;--x) { + if((exp[x] == '~') && (exp[x-1] != '\\')) { + exp[x] = '\0'; + if(_shexp_match(str,&exp[++x], case_insensitive) == MATCH) + goto punt; + break; + } + } + if(_shexp_match(str,exp, FALSE) == MATCH) { + PR_Free(exp); + return 0; + } + + punt: + PR_Free(exp); + return 1; +} + + +/* ------------------------------ shexp_cmp ------------------------------- */ + +PUBLIC int +NET_RegExpSearch(char *str, char *exp) +{ + switch(NET_RegExpValid(exp)) + { + case INVALID_SXP: + return -1; + case NON_SXP: + return (strcmp(exp,str) ? 1 : 0); + default: + return NET_RegExpMatch(str, exp, FALSE); + } +} + +PUBLIC int +NET_RegExpCaseSearch(char *str, char *exp) +{ + switch(NET_RegExpValid(exp)) + { + case INVALID_SXP: + return -1; + case NON_SXP: + return (strcmp(exp,str) ? 1 : 0); + default: + return NET_RegExpMatch(str, exp, TRUE); + } +} + diff --git a/network/util/mkreg.h b/network/util/mkreg.h new file mode 100644 index 000000000000..173979133017 --- /dev/null +++ b/network/util/mkreg.h @@ -0,0 +1,105 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +/* + * shexp.h: Defines and prototypes for shell exp. match routines + * + * + * This routine will match a string with a shell expression. The expressions + * accepted are based loosely on the expressions accepted by zsh. + * + * o * matches anything + * o ? matches one character + * o \ will escape a special character + * o $ matches the end of the string + * o [abc] matches one occurence of a, b, or c. The only character that needs + * to be escaped in this is ], all others are not special. + * o [a-z] matches any character between a and z + * o [^az] matches any character except a or z + * o ~ followed by another shell expression will remove any pattern + * matching the shell expression from the match list + * o (foo|bar) will match either the substring foo, or the substring bar. + * These can be shell expressions as well. + * + * The public interface to these routines is documented below. + * + * Rob McCool + * + */ + +#ifndef SHEXP_H +#define SHEXP_H + +#include "xp_core.h" + +/* + * Requires that the macro MALLOC be set to a "safe" malloc that will + * exit if no memory is available. If not under MCC httpd, define MALLOC + * to be the real malloc and play with fire, or make your own function. + */ + +#if 0 +#ifdef MCC_HTTPD +#include "../mc-httpd.h" +#endif +#endif + +#include /* isalnum */ +#include /* strlen */ + + + +/* --------------------------- Public routines ---------------------------- */ + + +/* + * shexp_valid takes a shell expression exp as input. It returns: + * + * NON_SXP if exp is a standard string + * INVALID_SXP if exp is a shell expression, but invalid + * VALID_SXP if exp is a valid shell expression + */ + +#define NON_SXP -1 +#define INVALID_SXP -2 +#define VALID_SXP 1 + +extern int NET_RegExpValid(char *exp); + +/* + * shexp_match + * + * Takes a prevalidated shell expression exp, and a string str. + * + * Returns 0 on match and 1 on non-match. + */ +extern int NET_RegExpMatch(char *str, char *exp, Bool case_insensitive); + +/* + * + * Same as above, but validates the exp first. 0 on match, 1 on non-match, + * -1 on invalid exp. + */ + +extern int NET_RegExpSearch(char *str, char *exp); + +/* same as above but uses case insensitive search + */ +extern int NET_RegExpCaseSearch(char *str, char *exp); + +#endif