From 44b782c4d044536471b13ffcba196f07623cc348 Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Tue, 26 Feb 2008 07:19:55 +0000 Subject: [PATCH] Created findstr_in_string() function (this is the function that needs better regular expression suppor). Reverted findstr() and trashcan() to read the file a line at a time rather than load the entire file (potentially very large) into a string list. --- src/sbbs3/sbbs.h | 1 + src/sbbs3/str_util.c | 112 +++++++++++++++++++++++-------------------- 2 files changed, 61 insertions(+), 52 deletions(-) diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h index 592924db70..5918ad159b 100644 --- a/src/sbbs3/sbbs.h +++ b/src/sbbs3/sbbs.h @@ -848,6 +848,7 @@ extern "C" { DLLEXPORT char * DLLCALL truncstr(char* str, const char* set); DLLEXPORT char * DLLCALL ascii_str(uchar* str); DLLEXPORT BOOL DLLCALL findstr(const char *insearch, const char *fname); + DLLEXPORT BOOL DLLCALL findstr_in_string(const char* insearchof, char* string); DLLEXPORT BOOL DLLCALL findstr_in_list(const char* insearchof, str_list_t list); DLLEXPORT BOOL DLLCALL trashcan(scfg_t* cfg, const char *insearch, const char *name); DLLEXPORT char * DLLCALL trashcan_fname(scfg_t* cfg, const char *name, char* fname, size_t); diff --git a/src/sbbs3/str_util.c b/src/sbbs3/str_util.c index d55cf304e6..8113aec09c 100644 --- a/src/sbbs3/str_util.c +++ b/src/sbbs3/str_util.c @@ -112,71 +112,79 @@ char* DLLCALL prep_file_desc(char *str) } /****************************************************************************/ -/* Pattern matching string search of 'insearchof' in 'fname'. */ +/* Pattern matching string search of 'insearchof' in 'string'. */ /****************************************************************************/ -BOOL DLLCALL findstr_in_list(const char* insearchof, str_list_t list) +BOOL DLLCALL findstr_in_string(const char* insearchof, char* string) { char* p; char str[256]; char search[81]; int c; int i; - size_t index; - BOOL found; + BOOL found=FALSE; - if(list==NULL || insearchof==NULL) + if(string==NULL || insearchof==NULL) return(FALSE); SAFECOPY(search,insearchof); strupr(search); + SAFECOPY(str,string); - found=FALSE; + p=str; + SKIP_WHITESPACE(p); - for(index=0;list[index]!=NULL && !found; index++) { - SAFECOPY(str,list[index]); - - found=FALSE; + if(*p==';') /* comment */ + return(FALSE); - p=str; - while(*p && *p<=' ') p++; /* Skip white-space */ + if(*p=='!') { /* !match */ + found=TRUE; + p++; + } - if(*p==';') /* comment */ - continue; + truncsp(p); + c=strlen(p); + if(c) { + c--; + strupr(p); + if(p[c]=='~') { + p[c]=0; + if(strstr(search,p)) + found=!found; + } - if(*p=='!') { /* !match */ - found=TRUE; - p++; + else if(p[c]=='^' || p[c]=='*') { + p[c]=0; + if(!strncmp(p,search,c)) + found=!found; } - truncsp(p); - c=strlen(p); - if(c) { - c--; - strupr(p); - if(p[c]=='~') { - p[c]=0; - if(strstr(search,p)) - found=!found; - } + else if(p[0]=='*') { + i=strlen(search); + if(i<c) + return(found); + if(!strncmp(p+1,search+(i-c),c)) + found=!found; + } - else if(p[c]=='^' || p[c]=='*') { - p[c]=0; - if(!strncmp(p,search,c)) - found=!found; - } + else if(!strcmp(p,search)) + found=!found; + } + return(found); +} - else if(p[0]=='*') { - i=strlen(search); - if(i<c) - continue; - if(!strncmp(p+1,search+(i-c),c)) - found=!found; - } +/****************************************************************************/ +/* Pattern matching string search of 'insearchof' in 'fname'. */ +/****************************************************************************/ +BOOL DLLCALL findstr_in_list(const char* insearchof, str_list_t list) +{ + size_t index; + BOOL found=FALSE; - else if(!strcmp(p,search)) - found=!found; - } - } + if(list==NULL || insearchof==NULL) + return(FALSE); + + for(index=0;list[index]!=NULL && !found; index++) + found=findstr_in_string(insearchof, list[index]); return(found); } @@ -185,23 +193,23 @@ BOOL DLLCALL findstr_in_list(const char* insearchof, str_list_t list) /****************************************************************************/ BOOL DLLCALL findstr(const char* insearchof, const char* fname) { - str_list_t list; - BOOL found; + char str[256]; + BOOL found=FALSE; FILE* fp; - if(insearchof==NULL) + if(insearchof==NULL || fname==NULL) return(FALSE); if((fp=fopen(fname,"r"))==NULL) return(FALSE); - list=strListReadFile(fp,NULL,255); - fclose(fp); - - found=findstr_in_list(insearchof,list); - - strListFree(&list); + while(!feof(fp) && !ferror(fp) && !found) { + if(!fgets(str,sizeof(str),fp)) + break; + found=findstr_in_string(insearchof,str); + } + fclose(fp); return(found); } -- GitLab