home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Phoenix Heaven Sunny 2
/
APPARE2.BIN
/
oh_towns
/
taropyon
/
cci
/
find2.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-06-20
|
7KB
|
308 lines
/*************************************************************************
* "find2.cci" : パターン検索
*************************************************************************/
#include "ccilib.h"
/* パレットデータ(HEwin 配色) */
char PltDat[3][16] =
{
/* G R B */
{ 0, 0, 0}, /* C_BALCK, C_THROUGH */
{ 0, 0, 0}, /* C_BLUE , C_MBLACK */
{ 7, 7, 8}, /* C_RED */
{12,12,13}, /* C_MAGENTA */
{ 6, 5, 7}, /* C_GREEN */
{ 8, 7, 9}, /* C_CYAN */
{10, 9,11}, /* C_YELLOW */
{11,11,12}, /* C_WHITE */
{ 5, 5, 6}, /* C_HBALCK */
{ 0, 0,11}, /* C_HBLUE */
{ 0,11, 0}, /* C_HRED */
{ 0,11,11}, /* C_HMAGENTA */
{11, 0, 0}, /* C_HGEEN */
{11, 0,11}, /* C_HCYAN */
{11,11, 0}, /* C_HYELLOW */
{14,14,15} /* C_HWHITE */
};
/*************************************************************************
* 初期化
*************************************************************************/
int init()
{
DSP_sysInit(0); /* 表示システム初期化 */
KBF_sysInit(); /* キーボードシステム初期化 */
KBF_kan_off();
FDL_sysInit(); /* ファイルダイアログ初期化 */
sdk_control(0); /* サイドワーク起動禁止 */
DSP_writePage(0); /* 書き込みページ */
DSP_setPlt( PltDat ); /* パレット設定 */
DSP_boxf(0,24,639,463,PSET,COLMIX(5,6));
DSP_writePage(1); /* 書き込みページ */
DSP_setPlt( PltDat ); /* パレット設定 */
DSP_title("FIND2","0.99",15,7,0,0);
evt_setDspTime( 1, 432, 4, 7, 0 ); /* 時刻表示アイドリング処理設定 */
SYL_clear();
}
/*************************************************************************
* 終了
*************************************************************************/
int term()
{
FDL_sysEnd();
KBF_sysEnd();
DSP_sysEnd();
}
int Upcase = 0;
char Ptn[BUFSIZ] = {'\0'};
char *RePtn = NULL;
char *TxtPtr = NULL;
#define TABSIZE (8)
#define TXT_XS (80)
#define TXT_YS (20)
/*************************************************************************
* 大文字,小文字を区別するモードの切り換え
*************************************************************************/
int upcase_func( int evtNo, char *sbj )
{
Upcase = Upcase ? 0 : 1;
/* 検索パターンの再コンパイル */
if ( RePtn )
RePtnFree(RePtn);
RePtn = RePtnAlloc(Ptn,Upcase);
return (evtNo);
}
/*************************************************************************
* 検索パターンの入力
*************************************************************************/
int pattern_func( int evtNo, char *sbj )
{
int ret, x, y;
char *dlg;
x = y = DLGPOS_MOS_SET_HOME;
dlg = DLG_getsOpen( x, y, 320, "検索パターンを入力してください。");
if ( dlg == NULL )
return (evtNo); /* error */
DLG_getsSetTitle( dlg, "INPUT PATTERN" );
ret = DLG_getsStart( dlg, BUFSIZ-1, Ptn );
if ( ret > 0 )
{ /* 入力あり */
if ( RePtn )
RePtnFree(RePtn);
if ( (RePtn = RePtnAlloc(Ptn,Upcase)) == NULL )
{
DLG_tmpMsgBox( x, y, C_MBLACK, C_DLGBASE, COLMIX(C_ERROR,C_GRAY),
" Pattern error!! " );
}
}
DLG_getsClose(dlg);
return (evtNo);
}
int find( char *dlg, char *fn )
{
char *fp;
char buf[BUFSIZ];
int count;
long ln; /* 行番号 */
DLG_msgPrintf(dlg,"\r\n- %s -\r\n", fn );
TxtPtr = DLG_txtSetLinBuf( TxtPtr, TABSIZE, TXT_XS, "- %s -", fn );
if ( (fp = fopen(fn,"r")) == NULL )
{
DLG_msgPrintf(dlg,"File open error!! (%s)\r\n", fn );
return (ERR);
}
count = 0;
ln = 0;
while ( fgets(buf,BUFSIZ,fp) != NULL )
{
++ln;
if ( RePtnMatch( RePtn, buf ) >= 0 )
{ /* マッチング */
++count;
DLG_msgPrintf(dlg,"%6d : %s\r", ln, buf );
TxtPtr = DLG_txtSetLinBuf( TxtPtr, TABSIZE, TXT_XS, "%s", buf );
}
}
fclose(fp);
return (count);
}
/*************************************************************************
* 検索開始
*************************************************************************/
int find_func( int evtNo, char *sbj )
{
int i, x, y, ret;
int mdFdl;
char *fdl;
char *fn;
char *dlg;
if ( RePtn == NULL )
{
x = y = DLGPOS_CENTER_OF_SCN;
MNU_sure( x, y, C_MBLACK, C_DLGBASE, COLMIX(C_ERROR,C_GRAY),
SELBTN_ATT_CENTER, " 検索パターンが指定されていません。 " );
return (ERR);
}
mdFdl = FDL_MODE_MULTI | FDL_MODE_BIT_DIRIGN | FDL_MODE_BIT_SIDEWORK;
if ( (fdl = FDL_open(mdFdl)) == NULL )
return (ERR);
FDL_set_title( fdl, "FIND");
FDL_set_wildcard( fdl, "*.*");
SYL_puts(C_HGREEN,"検索するファイルを指定してください。");
ret = FDL_start(fdl);
SYL_clear();
if ( ret != NORMAL )
{
FDL_close(fdl);
return (evtNo);
}
i = 0;
while ( FDL_getMarkFile(fdl, i) != NULL )
++i;
if ( i == 0 )
{ /* ファイルが指定されていない */
FDL_close(fdl);
return (evtNo);
}
x = y = DLGPOS_CENTER_OF_SCN;
ret = MNU_sure( x, y, C_MBLACK, C_DLGBASE, COLMIX(C_INFO,C_GRAY),
SELBTN_ATT_CENTER,
" %d 個のファイルが指定されています。 \n 検索を実行します。 ",
i );
if ( ret < 0 )
{
FDL_close(fdl);
return (evtNo);
}
dlg = DLG_msgOpen( x, y, 80*6, 23*12,
C_MBLACK, C_DLGBASE, COLMIX(C_INFO,C_GRAY),
"***** FIND *****" );
if ( dlg == NULL )
{
FDL_close(fdl);
return (evtNo);
}
DLG_msgSetConfig( dlg, 8, 6, 12 );
DLG_msgClear( dlg, C_HWHITE );
i = ret = 0;
while ( (fn = FDL_getMarkFile(fdl, i)) != NULL )
{
if ( find( dlg, fn ) > 0 )
ret = 1;
++i;
}
DLG_msgClose(dlg);
FDL_close(fdl);
if ( ret )
{
dlg = DLG_txtOpen( x, y, TXT_XS, TXT_YS, TxtPtr, 0 );
if ( dlg == NULL )
return (evtNo);
DLG_txtSetTitle( dlg, "FIND" );
DLG_txtStart( dlg );
DLG_txtClose( dlg );
} else
{
MNU_sure( x, y, C_MBLACK, C_DLGBASE, COLMIX(C_ERROR,C_GRAY),
SELBTN_ATT_CENTER, " Pattern not found!! " );
}
return (evtNo);
}
/*************************************************************************
* メニュー設定
*************************************************************************/
int set_menudat( char *obj )
{
char *s;
s = Upcase ? "Upcase [ON]" : "Upcase [OFF]";
MNU_setObj(obj, 0, MNU_NOR, 'U', s , NULL, 1, "upcase_func" , NULL );
MNU_setObj(obj, 1, MNU_NOR, 'P', "Input pattern ", NULL, 2, "pattern_func", NULL );
MNU_setObj(obj, 2, MNU_BLK, 0 , NULL , NULL, 0, NULL , NULL );
MNU_setObj(obj, 3, MNU_NOR, 'F', "Find" , NULL, 3, "find_func" , NULL );
}
/*************************************************************************
* 検索のためのメニュー
*************************************************************************/
int find_menu()
{
int ret, x, y;
char *mnu;
char *obj;
if ( (obj = MNU_alloc(4)) == NULL )
return (ERR);
set_menudat(obj);
x = y = DLGPOS_CENTER_OF_SCN;
mnu = MNU_open( x, y, MNUATT_EXIT, obj, "FIND MENU" );
if ( mnu == NULL )
return (ERR);
for(;;)
{
if ( (ret = MNU_start( mnu )) < 0 )
break;
set_menudat(obj);
}
MNU_close(mnu);
MNU_free(obj);
return (NORMAL);
}
/*************************************************************************
* MAIN
*************************************************************************/
int main( int argc, char **argv )
{
init();
find_menu();
term();
return (0);
}