在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);
}
王家宝 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);
}
相关文章推荐
- 用Ole Automation实现Delphi和AutoCad之间的数据交换
- Java测试规范(引用)
- Hibernate Tool & Files
- Java面试题目
- delphi中的时间操作技术(2)
- 解析IP地址为主机域名
- 将某一主机域名解析为IP地址
- 在做控件的存取控制时碰到的问题,请教各位!
- 有关TrueDBGrid的问题向各位大虾请教
- 一个画图类,类似ms_chart的线图,适用于科学仿真数据分析(二)
- 一个画图类,类似ms_chart的线图,适用于科学仿真数据分析(一)
- Ant应用(1)
- Ant应用(2)
- 使用C#开发COM+组件
- 2004/10/08第一天到东软南京研发中心兼职
- 解决打过震荡波补丁之后oracle无法正常启动的问题
- 关于win2000安装的2个问题
- Thinking in C++ 卷2中文版
- 初学者的问题----csdn系列