4 Original GPL release version 4.12
5 Copyright 1993-2000 Jonathan Potter
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License
9 as published by the Free Software Foundation; either version 2
10 of the License, or (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 All users of Directory Opus 4 (including versions distributed
22 under the GPL) are entitled to upgrade to the latest version of
23 Directory Opus version 5 at a reduced price. Please see
24 http://www.gpsoft.com.au for more information.
26 The release of Directory Opus 4 under the GPL in NO WAY affects
27 the existing commercial status of Directory Opus 5.
33 //#include <proto/dos.h>
35 /*#define upper(c) ((c>='a' && c<='z')?(c-32):c)
38 unsigned char *str,*pat;
43 int DoMatchPattern(register unsigned char *pat
__asm("a0"), register unsigned char *str
__asm("a1"), register int cas
__asm("d0"));
44 void DoParsePattern(register unsigned char *pat
__asm("a0"), register unsigned char *patbuf
__asm("a1"), register int cas
__asm("d0"));
45 //extern int WildMatch(struct MatchData *),findendor(struct MatchData *,int);
46 //extern struct DOpusBase *DOpusBase;
48 void /*__saveds*/ LParsePattern(register unsigned char *pat
__asm("a0"),register unsigned char *patbuf
__asm("a1"))
50 //D(bug("LParsePattern()\n");Delay(50));
51 DoParsePattern(pat
,patbuf
,0);
54 void /*__saveds*/ LParsePatternI(register unsigned char *pat
__asm("a0"),register unsigned char *patbuf
__asm("a1"))
56 //D(bug("LParsePatternI()\n");Delay(50));
57 DoParsePattern(pat
,patbuf
,1);
60 int /*__saveds*/ LMatchPattern(register unsigned char *pat
__asm("a0"), register unsigned char *str
__asm("a1"))
62 //D(bug("LMatchPattern()\n");Delay(50));
63 return DoMatchPattern(pat
,str
,0);
65 int /*__saveds*/ LMatchPatternI(register unsigned char *pat
__asm("a0"), register unsigned char *str
__asm("a1"))
67 //D(bug("LMatchPatternI()\n");Delay(50));
68 return DoMatchPattern(pat
,str
,1);
71 int __saveds
DoMatchPattern(register unsigned char *pat
__asm("a0"), register unsigned char *str
__asm("a1"), register int cas
__asm("d0"))
73 // if (DOSBase->dl_lib.lib_Version>35) {
76 old
=DOSBase
->dl_Root
->rn_Flags
&RNF_WILDSTAR
;
77 DOSBase
->dl_Root
->rn_Flags
|=RNF_WILDSTAR
;
78 suc
= (cas
? MatchPatternNoCase(pat
,str
) : MatchPattern(pat
,str
));
79 if (!old
) DOSBase
->dl_Root
->rn_Flags
&=~RNF_WILDSTAR
;
84 struct MatchData mdata;
88 mdata.levels=mdata.flags=0;
90 return(WildMatch(&mdata));
95 void __saveds
DoParsePattern(register unsigned char *pat
__asm("a0"), register unsigned char *patbuf
__asm("a1"), register int cas
__asm("d0"))
97 // if (DOSBase->dl_lib.lib_Version>35) {
100 old
=DOSBase
->dl_Root
->rn_Flags
&RNF_WILDSTAR
;
101 DOSBase
->dl_Root
->rn_Flags
|=RNF_WILDSTAR
;
102 len
=(strlen(pat
)*2)+2;
104 (cas
?ParsePatternNoCase(pat
,patbuf
,len
):ParsePattern(pat
,patbuf
,len
));
106 if (cas
) ParsePatternNoCase(pat
,patbuf
,len
);
107 else ParsePattern(pat
,patbuf
,len
);
108 if (!old
) DOSBase
->dl_Root
->rn_Flags
&=~RNF_WILDSTAR
;
112 int or=0,class=0,rep=0;
137 if (or) *patbuf++=P_ORNEXT;
159 if (class) *patbuf++='[';
177 if (*(pat+1)=='?' || *(pat+1)=='*') {
191 *patbuf++=(cas)?upper(*pat):*pat;
206 struct MatchData *mdata;
208 int last,match,not=0,lnot,other=0,wild=0;
209 unsigned char ch,*str,mc,*pat=NULL;
211 if (!(mdata->flags&2)) {
212 for (last=0;;last++) {
213 if (mdata->pat[last]>0x7f) {
214 if (mdata->pat[last]!=P_ANY && mdata->pat[last]!=P_NOT &&
215 mdata->pat[last]!=P_SINGLE) other=1;
218 else if (!mdata->pat[last]) {
220 if (mdata->cas) return((LStrCmpI((char *)mdata->pat,(char *)mdata->str)==0));
221 return((strcmp((char *)mdata->pat,(char *)mdata->str)==0));
227 if (*(mdata->pat)==P_NOT) {
228 if (!(*++mdata->pat)) break;
231 else if (*(mdata->pat)==P_ANY) {
232 if (!(*++mdata->pat)) {
233 if (not) match=1-match;
236 pat=mdata->pat; match=lnot=1;
238 else if (*(mdata->pat)==P_SINGLE) {
241 if (!(*++mdata->pat)) {
242 if (*mdata->str && pat) {
250 mc=mdata->cas?upper(*(mdata->str)):*(mdata->str);
251 if (*mdata->str) ++mdata->str;
252 if (*(mdata->pat)!=mc) {
255 if (pat && *(mdata->str)) {
257 if (*(mdata->str-1)==*pat) --mdata->str;
259 else if (!(*++mdata->pat)) break;
263 if (!(*++mdata->pat)) {
264 if (*mdata->str && pat) {
273 if (match && !(*(mdata->str))) return(1-not);
279 for (;*(mdata->pat);mdata->pat++) {
281 switch (*(mdata->pat)) {
287 mc=mdata->cas?upper(*(mdata->str)):*(mdata->str);
288 if ((ch=*(mdata->pat))==P_CLASS) {
289 for (last=256,match=0;*(++mdata->pat) && *(mdata->pat)!=P_CLASS;last=*(mdata->pat)) {
290 if (((*mdata->pat)=='-')?(mc<=*(++mdata->pat) &&
291 mc>=last):(mc==*(mdata->pat))) {
292 match=1; ch=*(mdata->pat);
295 if (!match) continue;
297 else if (ch>0x7f) goto doswitch;
298 if (mdata->cas) ch=upper(ch);
299 while (mc==ch) ++mdata->str;
303 if (!(*(mdata->str))) return(not);
307 str=mdata->str; match=0;
309 ++mdata->pat; mdata->str=str;
311 if (WildMatch(mdata)) {
318 if (*(mdata->pat)!=P_ORNEXT) break;
321 if (!mdata->levels) return(not);
335 if (*(++mdata->pat)) {
337 while (!WildMatch(mdata)) {
338 if (!(*(++mdata->str))) {
345 if (not) return(1-match);
349 if (*(mdata->pat+1)=='~' || *(mdata->pat+1)=='^') {
354 mc=mdata->cas?upper(*(mdata->str)):*(mdata->str);
355 for (last=256,match=0;*(++mdata->pat) && *(mdata->pat)!=P_CLASS;last=*(mdata->pat))
356 if (((*mdata->pat)=='-')?(mc<=*(++mdata->pat) &&
357 mc>=last):(mc==*(mdata->pat))) match=1-lnot;
365 mc=mdata->cas?upper(*(mdata->str)):*(mdata->str);
366 if (mc!=*(mdata->pat)) return(not);
371 if (!(*(mdata->str))) return(1-not);
376 struct MatchData *mdata;
381 if (*(mdata->pat)==P_OREND) ++mdata->pat;
382 while (*(mdata->pat)) {
383 if (*(mdata->pat)==P_ORNEXT && a && lev==1) return(0);
384 if (*(mdata->pat)==P_ORSTART) ++lev;
385 else if (*(mdata->pat)==P_OREND) {
387 if (lev==0) return(0);