diff --git a/src/sbbs3/str.cpp b/src/sbbs3/str.cpp
index bf680d858eee8fe7ba4d79097fc26228ec09688d..0543da43208656b4b339c92aa19494633baf9129 100644
--- a/src/sbbs3/str.cpp
+++ b/src/sbbs3/str.cpp
@@ -717,6 +717,7 @@ void sbbs_t::dirinfo(uint dirnum)
 /****************************************************************************/
 extern "C" BOOL trashcan(scfg_t* cfg, char* insearch, char* name)
 {
+	char*	p;
 	char	str[128];
 	char	search[81];
 	int		c;
@@ -728,32 +729,47 @@ extern "C" BOOL trashcan(scfg_t* cfg, char* insearch, char* name)
 	if((stream=fopen(str,"r"))==NULL)
 		return(FALSE); 
 
-	found=FALSE;
-
 	sprintf(search,"%.*s",sizeof(search)-1,insearch);
 	strupr(search);
+
+	found=FALSE;
+
 	while(!feof(stream) && !ferror(stream) && !found) {
 		if(!fgets(str,sizeof(str),stream))
 			break;
-		truncsp(str);
-		c=strlen(str);
+		
+		found=FALSE;
+
+		p=str;	
+		while(*p && *p<=' ') p++; /* Skip white-space */
+
+		if(*p==';')		/* comment */
+			continue;
+
+		if(*p=='!')	{	/* !match */
+			found=TRUE;
+			p++;
+		}
+
+		truncsp(p);
+		c=strlen(p);
 		if(c) {
 			c--;
-			strupr(str);
-			if(str[c]=='~') {
-				str[c]=0;
-				if(strstr(search,str))
-					found=TRUE; 
+			strupr(p);
+			if(p[c]=='~') {
+				p[c]=0;
+				if(strstr(search,p))
+					found=!found; 
 			}
 
-			else if(str[c]=='^') {
-				str[c]=0;
-				if(!strncmp(str,search,c))
-					found=TRUE; 
+			else if(p[c]=='^') {
+				p[c]=0;
+				if(!strncmp(p,search,c))
+					found=!found; 
 			}
 
-			else if(!strcmp(str,search))
-				found=TRUE; 
+			else if(!strcmp(p,search))
+				found=!found; 
 		} 
 	}
 	fclose(stream);