Mercurial > noffle
comparison src/wildmat.c @ 43:2842f50feb55 noffle
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
control.c, control.h, database.c, database.h, dynamicstring.c,
dynamicstring.h, fetch.c, fetch.h, fetchlist.c, fetchlist.h, group.c,
group.h, itemlist.c, itemlist.h, lock.c, lock.h, log.c, log.h, noffle.c,
online.c, online.h, outgoing.c, outgoing.h, over.c, over.h, post.c, post.h,
protocol.c, protocol.h, pseudo.c, pseudo.h, request.c, request.h, server.c,
server.h, util.c, util.h, wildmat.c, wildmat.h: Moved files to the
subdirectory src/
* Makefile.am, acconfig.h, configure.in, docs/Makefile.am, src/Makefile.am,
Makefile.in, aclocal.m4, config.h.in, configure, install-sh, missing,
mkinstalldirs, stamp-h.in, docs/Makefile.in, src/Makefile.in: Added files.
They are used by aclocal, autoheader, autoconf and automake.
* src/config.c, src/config.h: Renamed to configfile.c and configfile.h,
because configure will generate a config.h file itself.
* src/client.c, src/content.c, src/database.c, src/fetch.c, src/fetchlist.c,
src/group.c, src/lock.c, src/noffle.c, src/online.c, src/outgoing.c,
src/over.c, src/pseudo.c, src/request.c, src/server.c, src/util.c:
Changed '#include "config.h"' to '#include "configfile.h"'.
* src/client.c, src/content.c, src/database.c, src/fetch.c, src/fetchlist.c,
src/group.c, src/lock.c, src/online.c, src/outgoing.c, src/post.c,
src/protocol.c, src/request.c, src/server.c: Files now #include <config.h>.
Added missing <stdio.h>. This removes the warnings about snprintf() not
being declared.
* Makefile: Removed. This is now generated by configure.
| author | uh1763 |
|---|---|
| date | Fri, 05 May 2000 22:45:56 +0100 |
| parents | |
| children | 62b9392bceca |
comparison
equal
deleted
inserted
replaced
| 42:2467ff423c15 | 43:2842f50feb55 |
|---|---|
| 1 /* | |
| 2 wildmat.c | |
| 3 | |
| 4 Taken from the INN 2.2 distribution and slightly altered to fit the | |
| 5 Noffle environment. Changes are: | |
| 6 o Rename wildmat() to Wld_match(). | |
| 7 o Adjust includes. | |
| 8 | |
| 9 $Id: wildmat.c 49 2000-05-05 21:45:56Z uh1763 $ | |
| 10 | |
| 11 The entire INN distribution is covered by the following copyright | |
| 12 notice. As this file originated in the INN distribution is it | |
| 13 subject to the conditions of this notice. | |
| 14 | |
| 15 Copyright 1991 Rich Salz. | |
| 16 All rights reserved. | |
| 17 $Revision: 49 $ | |
| 18 | |
| 19 Redistribution and use in any form are permitted provided that the | |
| 20 following restrictions are are met: | |
| 21 1. Source distributions must retain this entire copyright notice | |
| 22 and comment. | |
| 23 2. Binary distributions must include the acknowledgement ``This | |
| 24 product includes software developed by Rich Salz'' in the | |
| 25 documentation or other materials provided with the | |
| 26 distribution. This must not be represented as an endorsement | |
| 27 or promotion without specific prior written permission. | |
| 28 3. The origin of this software must not be misrepresented, either | |
| 29 by explicit claim or by omission. Credits must appear in the | |
| 30 source and documentation. | |
| 31 4. Altered versions must be plainly marked as such in the source | |
| 32 and documentation and must not be misrepresented as being the | |
| 33 original software. | |
| 34 THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED | |
| 35 WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF | |
| 36 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | |
| 37 | |
| 38 */ | |
| 39 | |
| 40 /* $Revision: 49 $ | |
| 41 ** | |
| 42 ** Do shell-style pattern matching for ?, \, [], and * characters. | |
| 43 ** Might not be robust in face of malformed patterns; e.g., "foo[a-" | |
| 44 ** could cause a segmentation violation. It is 8bit clean. | |
| 45 ** | |
| 46 ** Written by Rich $alz, mirror!rs, Wed Nov 26 19:03:17 EST 1986. | |
| 47 ** Rich $alz is now <rsalz@osf.org>. | |
| 48 ** April, 1991: Replaced mutually-recursive calls with in-line code | |
| 49 ** for the star character. | |
| 50 ** | |
| 51 ** Special thanks to Lars Mathiesen <thorinn@diku.dk> for the ABORT code. | |
| 52 ** This can greatly speed up failing wildcard patterns. For example: | |
| 53 ** pattern: -*-*-*-*-*-*-12-*-*-*-m-*-*-* | |
| 54 ** text 1: -adobe-courier-bold-o-normal--12-120-75-75-m-70-iso8859-1 | |
| 55 ** text 2: -adobe-courier-bold-o-normal--12-120-75-75-X-70-iso8859-1 | |
| 56 ** Text 1 matches with 51 calls, while text 2 fails with 54 calls. Without | |
| 57 ** the ABORT code, it takes 22310 calls to fail. Ugh. The following | |
| 58 ** explanation is from Lars: | |
| 59 ** The precondition that must be fulfilled is that DoMatch will consume | |
| 60 ** at least one character in text. This is true if *p is neither '*' nor | |
| 61 ** '\0'.) The last return has ABORT instead of FALSE to avoid quadratic | |
| 62 ** behaviour in cases like pattern "*a*b*c*d" with text "abcxxxxx". With | |
| 63 ** FALSE, each star-loop has to run to the end of the text; with ABORT | |
| 64 ** only the last one does. | |
| 65 ** | |
| 66 ** Once the control of one instance of DoMatch enters the star-loop, that | |
| 67 ** instance will return either TRUE or ABORT, and any calling instance | |
| 68 ** will therefore return immediately after (without calling recursively | |
| 69 ** again). In effect, only one star-loop is ever active. It would be | |
| 70 ** possible to modify the code to maintain this context explicitly, | |
| 71 ** eliminating all recursive calls at the cost of some complication and | |
| 72 ** loss of clarity (and the ABORT stuff seems to be unclear enough by | |
| 73 ** itself). I think it would be unwise to try to get this into a | |
| 74 ** released version unless you have a good test data base to try it out | |
| 75 ** on. | |
| 76 */ | |
| 77 #include <stdio.h> | |
| 78 #include <sys/types.h> | |
| 79 #include "common.h" | |
| 80 #include "log.h" | |
| 81 | |
| 82 #define ABORT (-1) | |
| 83 | |
| 84 /* What character marks an inverted character class? */ | |
| 85 #define NEGATE_CLASS '^' | |
| 86 /* Is "*" a common pattern? */ | |
| 87 #define OPTIMIZE_JUST_STAR | |
| 88 /* Do tar(1) matching rules, which ignore a trailing slash? */ | |
| 89 #undef MATCH_TAR_PATTERN | |
| 90 | |
| 91 | |
| 92 /* | |
| 93 ** Match text and p, return TRUE, FALSE, or ABORT. | |
| 94 */ | |
| 95 static int DoMatch(const char *text, const char *p) | |
| 96 { | |
| 97 int last; | |
| 98 int matched; | |
| 99 int reverse; | |
| 100 | |
| 101 for ( ; *p; text++, p++) { | |
| 102 if (*text == '\0' && *p != '*') | |
| 103 return ABORT; | |
| 104 switch (*p) { | |
| 105 case '\\': | |
| 106 /* Literal match with following character. */ | |
| 107 p++; | |
| 108 /* FALLTHROUGH */ | |
| 109 default: | |
| 110 if (*text != *p) | |
| 111 return FALSE; | |
| 112 continue; | |
| 113 case '?': | |
| 114 /* Match anything. */ | |
| 115 continue; | |
| 116 case '*': | |
| 117 while (*++p == '*') | |
| 118 /* Consecutive stars act just like one. */ | |
| 119 continue; | |
| 120 if (*p == '\0') | |
| 121 /* Trailing star matches everything. */ | |
| 122 return TRUE; | |
| 123 while (*text) | |
| 124 if ((matched = DoMatch(text++, p)) != FALSE) | |
| 125 return matched; | |
| 126 return ABORT; | |
| 127 case '[': | |
| 128 reverse = p[1] == NEGATE_CLASS ? TRUE : FALSE; | |
| 129 if (reverse) | |
| 130 /* Inverted character class. */ | |
| 131 p++; | |
| 132 matched = FALSE; | |
| 133 if (p[1] == ']' || p[1] == '-') | |
| 134 if (*++p == *text) | |
| 135 matched = TRUE; | |
| 136 for (last = *p; *++p && *p != ']'; last = *p) | |
| 137 /* This next line requires a good C compiler. */ | |
| 138 if (*p == '-' && p[1] != ']' | |
| 139 ? *text <= *++p && *text >= last : *text == *p) | |
| 140 matched = TRUE; | |
| 141 if (matched == reverse) | |
| 142 return FALSE; | |
| 143 continue; | |
| 144 } | |
| 145 } | |
| 146 | |
| 147 #ifdef MATCH_TAR_PATTERN | |
| 148 if (*text == '/') | |
| 149 return TRUE; | |
| 150 #endif /* MATCH_TAR_ATTERN */ | |
| 151 return *text == '\0'; | |
| 152 } | |
| 153 | |
| 154 | |
| 155 /* | |
| 156 ** User-level routine. Returns TRUE or FALSE. | |
| 157 */ | |
| 158 Bool | |
| 159 Wld_match(const char *text, const char *pattern) | |
| 160 { | |
| 161 #ifdef OPTIMIZE_JUST_STAR | |
| 162 if (pattern[0] == '*' && pattern[1] == '\0') | |
| 163 return TRUE; | |
| 164 #endif /* OPTIMIZE_JUST_STAR */ | |
| 165 return DoMatch(text, pattern) == TRUE; | |
| 166 } | |
| 167 | |
| 168 | |
| 169 | |
| 170 #if defined(WILDMAT_TEST) | |
| 171 | |
| 172 /* Yes, we use gets not fgets. Sue me. */ | |
| 173 extern char *gets(); | |
| 174 | |
| 175 | |
| 176 int | |
| 177 main() | |
| 178 { | |
| 179 char p[80]; | |
| 180 char text[80]; | |
| 181 | |
| 182 printf("Wildmat tester. Enter pattern, then strings to test.\n"); | |
| 183 printf("A blank line gets prompts for a new pattern; a blank pattern\n"); | |
| 184 printf("exits the program.\n"); | |
| 185 | |
| 186 for ( ; ; ) { | |
| 187 printf("\nEnter pattern: "); | |
| 188 (void)fflush(stdout); | |
| 189 if (gets(p) == NULL || p[0] == '\0') | |
| 190 break; | |
| 191 for ( ; ; ) { | |
| 192 printf("Enter text: "); | |
| 193 (void)fflush(stdout); | |
| 194 if (gets(text) == NULL) | |
| 195 exit(0); | |
| 196 if (text[0] == '\0') | |
| 197 /* Blank line; go back and get a new pattern. */ | |
| 198 break; | |
| 199 printf(" %s\n", Wld_match(text, p) ? "YES" : "NO"); | |
| 200 } | |
| 201 } | |
| 202 | |
| 203 exit(0); | |
| 204 /* NOTREACHED */ | |
| 205 } | |
| 206 #endif /* defined(TEST) */ |
