您的位置:首页 > 其它

在DOS屏幕上直接查找字符串,找到的被颜色标记出

2004-11-23 00:04 639 查看
/* CSP.C

   王家宝 CSP.C <ColorSearchPlus>,Turbo C 2.0

   创建:沈阳,1997.11.22
*/
#include "dos.h"
#include "conio.h"
#include "ctype.h"
#include "string.h"
#include "dir.h"

#define ESC  27
/* 查找指定属性的文件 */
#define FILE_ATTRIB FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_DIREC
/* 定义扫描字符串数组的最大空间 */
#define STRMAXLEN 129
enum UiColorIndex{ FindStrColor, /* 查找到的字符串显示为亮绿色 */
  DigitColor, /* 数字显示为青色 */
  NormalFileAttr,
  HiddenReadOnlyFileAttr,
  HiddenFileAttr, /* 隐藏文件以暗灰色显示 */
  ReadOnlyFileAttr, /* 只读文件以亮红色显示 */
  Dir_NORMAL_Attr, /* 目录以反白显示 */
  Dir_HIDDEN_RDONLY_Attr,
  Dir_HIDDEN_Attr,
  Dir_RDONLY_Attr,
  NormVideo /* 一般文档以默认方式显示 */
  };
unsigned char UiColor[]={0x0a,0x0b,0x07,0x04,0x08,0x0c,0x70,0x74,0x78,0x7c,0x07};
char *keywords[11]={"CSP",
  "TARGETSTRING",
  "DIGITAL",
  "NORMALFILE",
  "HIDDEN&READONLYFILE",
  "HIDDENFILE",
  "READONLYFILE",
                "NORMALDIRECTORY",
  "HIDDEN&READONLYDIRECTORY",
  "HIDDENDIRECTORY",
  "READONLYDIRECTORY"
  };
char *Help=
  "Color Search Plus V1.2/
  /r/nWritten by WangJiaBao,1997.11.22@ShenYang/
  /r/nUsage: CSP [<searchstring> [-S]]/
  /r/n       searchstring  target string/
  /r/n       -S            turn screen search on/
  /r/n/
  /r/nCSP based on the direct FULL SCREEN search technology.It can exact find the/
  /r/nstring that you have specified on command line,the target string either/
  /r/non screen or file in the current directory./
  /r/nWhen CSP found the target string,it will indicates it with markedness color,/
  /r/nand when you find string in a directory,all files with read only and hidden/
  /r/nproperty in the directory will also markedness with specifically color./
  /r/n/
  /r/nCSP defined such property colors in user interface:/
  /r/n  TARGETSTRING             the found target string/
  /r/n  DIGITAL                  digit/
  /r/n  NORMALFILE               normal file/
  /r/n  HIDDEN&READONLYFILE      hidden & read only file/
  /r/n  HIDDENFILE               hidden file/
  /r/n  READONLYFILE             read only file/
  /r/n  NORMALDIRECTORY          normal directory/
  /r/n  HIDDEN&READONLYDIRECTORY hidden & read only directory/
  /r/n  HIDDENDIRECTORY          hidden directory/
  /r/n  READONLYDIRECTORY        read only directory/
  ";

/* 要查找的字符串 */
char FindStr[STRMAXLEN];
/* 查找字符串函数,返回值为找到的目标字符串个数 */
int  ChgUIColor(int topy,int bottomy);
/* 列文件目录函数 */
void DirFileSearch(void);

main(int argc,char *argv[])
{
  textattr(UiColor[NormVideo]);
  if( argc>1 )  strcpy(FindStr,strupr(argv[1]));
  else{ /* 如未指定查找字符,显示提示信息 */
    int tmpi=11;
    cprintf("%s",Help);
    while( tmpi-- ){
      strcpy(FindStr,strupr(keywords[tmpi]));
      UiColor[0]=tmpi>1?UiColor[tmpi-1]:LIGHTGREEN;
      ChgUIColor(wherey()-24,wherey());
      }
    exit(0);
    }
  if( !strcmp(strupr(argv[2]),"-S") ){ /* 在当前屏幕上查找 */
    int num=ChgUIColor(0,25);
    textattr(UiColor[NormVideo]);
    cprintf("   //_//_CSP searched [%d] targets on screen.Any key back . . ._/_/",num);
    getch();
    }
  else /* 在当前目录中查找含指定字符串的文件 */
    DirFileSearch();
}

int ChgUIColor(int topy,int bottomy)
{
  int FindStrLen=strlen(FindStr);
  int i,Found=0,IncludeDigit;
  char *StrTmp,*mark="/1",mark1='/2';
  unsigned char Ch,ScannedStr[STRMAXLEN];
  unsigned Buf=0xB800,BufOffset,Start,DigitStart,ScanStrStart;
  topy*=160; bottomy*=160;
  for( BufOffset=topy;BufOffset<bottomy; ){ /* 扫描整个屏幕 */
   Ch=peekb(Buf,BufOffset); /* 直接从屏幕缓冲区读取字符 */
   if( !isspace(Ch) ){
     Start=BufOffset;    i=IncludeDigit=0;
 /* step 1 of 3 */       /* 提取屏幕上的连续字符 */
     do{
       if( i>STRMAXLEN-1 ) break;
       ScannedStr[i++]=Ch;
       if( isdigit(Ch) && !IncludeDigit ){
  DigitStart=BufOffset;
  IncludeDigit=1;
  }
       Ch=peekb(Buf,BufOffset+=2);
     }while( !isspace(Ch) && BufOffset<bottomy );
     ScannedStr[i]='/0';
 /* step 2 of 3*/ /* 标示连续字符中的数字 */
     if( IncludeDigit ){
       while(DigitStart<BufOffset){
  if( isdigit(peekb(Buf,DigitStart)) )
    pokeb(Buf,DigitStart+1,UiColor[DigitColor]|(peekb(Buf,BufOffset+1)&0xF0));
  DigitStart+=2;
  }
       }
 /* step 3 of 3*/ /* 在该字符串中查找指定的字符 */
     strupr(ScannedStr);
     while( (StrTmp=strstr(ScannedStr,FindStr))!='/0' ){
       *StrTmp=mark[0];  /* 对提取字符进行预处理 */
       ScanStrStart=strcspn(ScannedStr,mark)*2+Start;
       for(i=0;i<FindStrLen;i++,StrTmp++){ /* 标示字符串中的指定字符 */
  pokeb(Buf,ScanStrStart+i*2+1,UiColor[FindStrColor]|(peekb(Buf,BufOffset+1)&0xF0));
  *StrTmp=mark1;
  }
       Found++;
       }
     Ch=peekb(Buf,BufOffset);
     }
  if( isdigit(Ch) )
     do{ /* 标示屏幕上的数字 */
       pokeb( Buf,BufOffset+1,UiColor[DigitColor]|(peekb(Buf,BufOffset+1)&0xF0) );
     }while( isdigit((Ch=peekb(Buf,BufOffset+=2))) && BufOffset<bottomy );
  BufOffset+=2;  /* 继续查找 */
   } /* switch end */
 return(Found);
} /* ChgUIColor() END */

void DirFileSearch(void)
{
  struct ffblk DTA;
  int LineCount=0,Top;
  unsigned long Files=0,FullScreen=0;
  findfirst("*.*",&DTA,FILE_ATTRIB);
  textattr(UiColor[Dir_NORMAL_Attr]);
  cprintf("%-13s",DTA.ff_name);
  LineCount++; Files++;
  while( !findnext(&DTA) ){
    Files++;
    textattr(UiColor[NormalFileAttr]);
    if( LineCount==23*6 ){ /* 文件列表满一屏幕 */
      FullScreen++;
      LineCount=0;
      if( ChgUIColor(2,25) ){ /* 找到目标字符即暂停 */
 cprintf("/r/n   //_//_ESC quit,other key continue.[%d] files scanned_/_/",Files);
 if( getch()==ESC ){
   cprintf("/r   //_//_CSP interrupt by user.[%d] files scanned already_/_/",Files);
   exit(0);
   }
 }
      cprintf("/r/n");
      }
    if(
4000
LineCount%6==0 ) cprintf("/r/n"); /* 列表满一行则折行 */
    LineCount++;
    if( DTA.ff_attrib&FA_DIREC ){
      textattr(UiColor[Dir_NORMAL_Attr]); /* 普通目录 */
      if( DTA.ff_attrib&FA_RDONLY ) /* 只读属性目录 */
 textattr(UiColor[Dir_RDONLY_Attr]);
      if( DTA.ff_attrib&FA_HIDDEN ) /* 隐藏属性目录 */
 textattr(UiColor[Dir_HIDDEN_Attr]);
      if( DTA.ff_attrib&FA_HIDDEN && DTA.ff_attrib&FA_RDONLY )
 textattr(UiColor[Dir_HIDDEN_RDONLY_Attr]); /* 具有只读&隐藏属性目录 */
      cprintf("%-13s",DTA.ff_name);
      continue;
      }
    if( DTA.ff_attrib&FA_HIDDEN && DTA.ff_attrib&FA_RDONLY ){
      textattr(UiColor[HiddenReadOnlyFileAttr]);
      cprintf("%-13s",DTA.ff_name);
      continue;
      }
    if( DTA.ff_attrib&FA_HIDDEN ){ /* 隐藏文档 */
      textattr(UiColor[HiddenFileAttr]);
      cprintf("%-13s",DTA.ff_name);
      continue;
      }
    if( DTA.ff_attrib&FA_RDONLY ){ /* 只读文档 */
      textattr(UiColor[ReadOnlyFileAttr]);
      cprintf("%-13s",DTA.ff_name);
      continue;
      }
    cprintf("%-13s",DTA.ff_name); /* 普通文档 */
    }
  Top=wherey()-(Files-FullScreen*23*6)/6-(Files%6==0?0:1);
  Top=Top<0?0:Top;
  ChgUIColor(Top,wherey());
  textattr(UiColor[NormVideo]);
  cprintf("/r/n   //_//_CSP finished search.[%d] files scanned total_/_/",Files);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息