home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FreeWare Collection 3
/
FreeSoftwareCollection3pd199x-jp.img
/
pao
/
ms_dos
/
wild
/
src
/
wild.c
< prev
next >
Wrap
Text File
|
1980-01-02
|
14KB
|
558 lines
/*
** << MSC V5.1 >>
**
** コマンドライン上のワイルドカードを展開して子プロセスとして起動
**
** CREATE : 1990.09.01
** FINISH : 1990.09.02
**
** < HISTORY >
** 1990.09.01 : CREATE
** 1990.09.07 : 連続実行モードの追加
** 1990.09.08 : ディレクトリの直後にディレクトリが検索された時のバグ修正
**
** < note > : TABS = 4
**
** Programed by Y.Hirata ( Nifty ID : NAB03321 )
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <process.h>
#include "dir.h"
#include "kyb.h"
uchar Appfile[128] ; /* 指定されたファイル名 */
uchar Filename[128] ; /* 作業用ファイル名 */
ulong Filesize ; /* 作業用ファイルのサイズ */
char Endflg = FALSE ; /* プログラム終了フラグ */
char Cmdline[128] ; /* 子プロセスに渡すコマンドライン */
char Cmdptr ; /* 実行プログラム挿入位置 */
char Wildptr ; /* ワイルドカード挿入位置 */
char Wbuf[128] ; /* コマンドライン作業領域 */
char Chkstr1[64] ; /* chk*.* のCHK文字列格納 */
uint Chklen1 ; /* chk*.* のCHK文字数 */
char Chkstr2[4] ; /* *.chk のCHK文字列格納 */
uint Chklen2 ; /* *.chk のCHK文字数 */
char TypeWildFlg ; /* 拡張子に'*'がある? */
struct _SW { /* 起動時オプションスイッチ */
char dir ; /* 下位のディレクトリも対象? */
char quit ; /* 確認メッセージなし? */
char cont ; /* 自動連続実行する? */
} Sw ;
#define SHELL "COMMAND /C"
#define DEF_FILENAME "*.*"
/****************************** キーBREAK 待ち *******************************/
void keybreak( char keyadrs )
{
char matrix[16] ;
do {
KEY_bufcls() ;
KEY_matrix( matrix ) ;
} while ( KEY_test( matrix,keyadrs ) ) ;
}
/****************************** COMMAND EXEC *******************************/
int cmdexec()
{
int ret ;
char matrix[16] ;
char keyend ;
strcpy( Cmdline+Wildptr," " ) ;
strcat( Cmdline,Filename ) ;
strcat( Cmdline,Wbuf ) ;
printf( "\n" ) ;
if ( !Sw.cont ) { /* マニュアルモード */
printf( "改行キーで、") ;
}
printf( "\x1b[32m%s\x1b[m を実行します。\n",Cmdline+Cmdptr+1 ) ;
if ( !Sw.cont ) { /* マニュアルモード */
printf( "キャンセルは、ESCキーです。終了は、BREAKキーです。\n" ) ;
}
ret = 0 ;
keyend = FALSE ;
if ( Sw.cont ) { /* 自動連続実行モード */
KEY_bufcls() ;
KEY_matrix( matrix ) ;
if ( KEY_test( matrix,KEY_BREAK ) ) {
Endflg = TRUE ;
ret = 2 ;
keyend = KEY_BREAK ;
keybreak( KEY_BREAK ) ;
} else if ( KEY_test( matrix,KEY_ESC ) ) {
ret = 1 ;
keyend = KEY_ESC ;
keybreak( KEY_ESC ) ;
} else {
if ( KEY_test( matrix,KEY_CTRL ) ) {
printf( "\nCTRLキーが放されるまで待ちます♪\n" ) ;
keybreak( KEY_CTRL ) ;
}
ret = 0 ;
keyend = KEY_CR ;
}
} else { /* マニュアルモード */
do {
KEY_bufcls() ;
KEY_matrix( matrix ) ;
if ( KEY_test( matrix,KEY_CR ) ) {
ret = 0 ;
keyend = KEY_CR ;
keybreak( KEY_CR ) ;
} else if ( KEY_test( matrix,KEY_EXEC ) ) {
ret = 0 ;
keyend = KEY_CR ;
keybreak( KEY_EXEC ) ;
} else if ( KEY_test( matrix,TKEY_CR ) ) {
ret = 0 ;
keyend = KEY_CR ;
keybreak( TKEY_CR ) ;
} else if ( KEY_test( matrix,KEY_ESC ) ) {
ret = 1 ;
keyend = KEY_ESC ;
keybreak( KEY_ESC ) ;
} else if ( KEY_test( matrix,KEY_BREAK ) ) {
Endflg = TRUE ;
ret = 2 ;
keyend = KEY_BREAK ;
keybreak( KEY_BREAK ) ;
}
} while ( !keyend ) ;
}
if ( keyend == KEY_CR ) {
printf("\x1b[32m*** EXEC ***\x1b[m\n") ;
system( Cmdline ) ;
printf("\n只今 ファイル の検索中です .") ;
} else if ( keyend == KEY_ESC ) {
printf("\x1b[33m*** CANCEL ***\x1b[m\n") ;
printf("\n只今 ファイル の検索中です .") ;
} else if ( keyend == KEY_BREAK ) {
printf("\x1b[36m*** TERMINATE! ***\x1b[m\n") ;
}
return( ret ) ;
}
/**************************** Yes/No キー入力する ****************************/
int yesno( char msgon )
{
int ret ;
char matrix[16] ;
char keyend ;
ret = 0 ;
keyend = FALSE ;
do {
KEY_bufcls() ;
KEY_matrix( matrix ) ;
if ( KEY_test( matrix,KEY_N ) ) {
ret = 0 ;
keyend = KEY_N ;
keybreak( KEY_N ) ;
} else if ( KEY_test( matrix,KEY_Y ) ) {
ret = 1 ;
keyend = KEY_Y ;
keybreak( KEY_Y ) ;
} else if ( KEY_test( matrix,KEY_BREAK ) ) {
Endflg = TRUE ;
ret = 2 ;
keyend = KEY_BREAK ;
keybreak( KEY_BREAK ) ;
}
} while ( !keyend ) ;
if ( keyend == KEY_N && msgon ) {
printf("\n只今 ファイル の検索中です .") ;
} else if ( keyend == KEY_BREAK ) {
printf("\x1b[36m*** TERMINATE! ***\x1b[m\n") ;
}
return( ret ) ;
}
/**************************** ファイル名再設定 *****************************/
void setFname( uchar *addFname )
{
int endp ;
endp = strlen( (char *)Filename ) ;
do {
endp -- ;
if ( endp < 0 ) break ;
} while ( Filename[endp]!='\\' && Filename[endp]!=':' ) ;
endp ++ ;
strcpy( &Filename[endp],addFname ) ;
}
/****************************** ファイル検索 *******************************/
int find( int rank, ushort attr, int ptr )
{
DIR dta ;
int endp, ret ;
uint chk1p, chk2p ;
int c ;
uint pptr ; /* '.' の位置 */
char execflg ;
char dirserch ;
if ( rank )
strcat( &Filename[ptr],"*.*" ) ;
if ( firstsearch( Filename,attr,&dta ) ) { /* 最初のエントリ */
do {
printf(".") ;
endp = strlen( dta.d_name ) ;
if ( strcmp( dta.d_name,"." ) && strcmp( dta.d_name,".." ) ) {
/* . or .. 以外 */
if ( (dta._attrib & DIR_DIR) ) { /* ディレクトリ */
if ( rank ) {
/* パス名にディレクトリ名を追加する */
if ( Filename[ptr-1] == '\\' ||
Filename[ptr-1] == ':') {
strcpy( &Filename[ptr],dta.d_name ) ;
} else {
strcpy( &Filename[ptr],"\\" ) ;
strcat( Filename,dta.d_name ) ;
}
} else {
/* はじめは、入力されたパスにディレクトリ名をつける */
strcpy( Filename,Appfile ) ;
setFname( dta.d_name ) ;
}
endp = strlen( Filename ) ;
Filename[endp++] = '\\' ;
Filename[endp] = '\0' ;
if ( Sw.dir ) {
dirserch = TRUE ;
} else {
dirserch = FALSE ;
}
if ( Sw.dir && !Sw.quit ) {
printf("\n\x1b[33m") ;
printf("ディレクトリ < %s > を検索しますか? ( y/n )",
Filename ) ;
printf("\x1b[m\n") ;
dirserch = yesno( TRUE ) ;
if ( Endflg ) return( TRUE ) ;
}
if ( dirserch ) {
if ( !Sw.quit )
printf("\n只今 ファイル の検索中です .") ;
ret = find( rank+1,attr,endp ) ; /* 再帰呼出 */
if ( ret ) return( TRUE ) ;
}
} else { /* ファイル */
if ( !rank ) {
/* はじめは、入力されたパス名にファイル名をつける */
strcpy( Filename,Appfile );
setFname( dta.d_name );
} else {
/* パス名にファイル名を追加する */
strcpy( &Filename[ptr],dta.d_name );
}
execflg = TRUE ;
if ( !strcmp( dta.d_name,"." ) ||
!strcmp( dta.d_name,".." ) ) {
execflg = FALSE ;
}
pptr = 0 ;
for ( c=0; c<endp; c++ )
if ( dta.d_name[c] == '.' ) pptr = c+1 ;
if ( Chklen1 && strnicmp( dta.d_name,Chkstr1,Chklen1 ) ) {
execflg = FALSE ;
}
if ( Chklen2 && !pptr ) execflg = FALSE ;
if ( pptr && Chklen2 ) {
if ( TypeWildFlg ) {
if ( strnicmp(dta.d_name+pptr,Chkstr2,Chklen2) ) {
execflg = FALSE ;
}
} else {
if ( stricmp( dta.d_name+pptr,Chkstr2 ) ) {
execflg = FALSE ;
}
}
}
if ( execflg ) {
cmdexec() ;
if ( Endflg ) return( TRUE ) ;
}
}
} else { /* . or .. の場合 */
;
}
} while ( nextsearch( &dta ) ); /* 次のエントリ */
if ( !rank ) {
printf( "\n全ての \x1b[32m%s\x1b[m の検索を",Appfile ) ;
printf( "終了しましたので、" ) ;
printf( "プログラムを終了します。\n" ) ;
}
return( FALSE ) ;
} else { /* ファイルが見つからない */
return( -1 ) ;
}
}
/****************************** ファイル名チェック *********************************/
void filechk()
{
int c, p ;
uint endp ;
uint pptr, dptr ; /* '.' , ':' or '\' の位置 */
endp = strlen( Appfile ) ;
if ( Appfile[endp-1]=='\\' || Appfile[endp-1]==':' ) { /* A:\,A: */
strcat( Appfile,DEF_FILENAME ) ;
}
if ( endp > 1 ) {
if ( Appfile[endp-2]=='\\' || Appfile[endp-2]==':' ) {
/* A:\.,A:. */
if ( Appfile[endp-1] == '.' ) {
Appfile[endp-1] = '\0' ;
strcat( Appfile,DEF_FILENAME ) ;
}
}
}
if ( !strcmp( Appfile,"." ) ) { /* . */
strcpy( Appfile,DEF_FILENAME ) ;
}
endp = strlen( Appfile ) ;
/*
** ない場合 : 0 , あった場合 : 何番目
*/
dptr = pptr = 0 ;
for ( c=0; c<endp; c++ ) { /* ':' or '\' , '.' の位置 */
if ( Appfile[c] == '\\' || Appfile[c] == ':' ) dptr = c+1 ;
if ( Appfile[c] == '.' ) pptr = c+1 ;
}
for ( c=dptr,p=0; c<endp; c++,p++ ) { /* 拡張子より前のチェック */
if ( Appfile[c] == '.' ) {
Chkstr1[p] = '\0' ;
break ;
}
if ( Appfile[c] == '*' ) {
Chkstr1[p] = '\0' ;
break ;
} else {
Chkstr1[p] = Appfile[c] ;
}
}
Chkstr1[p] = '\0' ;
TypeWildFlg = FALSE ;
if ( pptr ) {
for ( c=pptr,p=0; c<endp; c++,p++ ) { /* 拡張子のチェック */
if ( Appfile[c] == '*' ) {
Chkstr2[p] = '\0' ;
TypeWildFlg = TRUE ;
break ;
} else {
Chkstr2[p] = Appfile[c] ;
}
}
} else {
p = 0 ;
}
Chkstr2[p] = '\0' ;
strcpy( Filename,Appfile ) ;
if ( dptr+1 == pptr && pptr ) {
/* 拡張子の前にファイル名がない -> 1文字追加 */
Appfile[dptr] = '\0' ;
strcat( Appfile,"*" ) ;
strcat( Appfile,Filename+pptr-1 ) ;
endp = strlen( Appfile ) ;
}
if ( Appfile[endp-1] == '.' ) { /* 最後が '.' の場合 */
strcat( Appfile,"*" ) ;
}
if ( Sw.dir ) {
if ( dptr ) { /* 下位のディレクトリも対象とする場合 */
strncpy( Filename,Appfile,dptr ) ;
Filename[dptr] = '\0' ;
strcat( Filename,DEF_FILENAME ) ;
} else {
strcpy( Filename,DEF_FILENAME ) ;
}
} else { /* 下位のディレクトリは無視 : デフォルト */
strcpy( Filename,Appfile ) ;
}
Chklen1 = strlen( Chkstr1 ) ;
Chklen2 = strlen( Chkstr2 ) ;
}
/***************************** 使用方法表示 ********************************/
void help()
{
printf("\n< ワイルドカード展開実行プログラム >\n") ;
printf("使用方法 : WILD [{/|-}option] ") ;
printf("プログラム (ワイルドカード) 引数2 ・・・\n") ;
printf("option : 'd' 下位のディレクトリも検索対象とします。\n") ;
printf(" : 'q' ディレクトリ検索の確認メッセージを無しとします。\n") ;
printf(" : 'c' 連続実行します(実行確認メッセージ無)。\n") ;
printf("sample : WILD /dqc TYPE (*.DOC)\n") ;
printf(" : WILD /dq COPY (*.DOC) A:\n") ;
printf(" : WILD /d COMMAND /C (*.COM)\n") ;
printf("\x1b[33m☆☆☆ ワイルドカードは、必ず '(',')'で括って下さい♪") ;
printf(" ☆☆☆\x1b[m\n") ;
}
/***************************** ★ メイン ★ ********************************/
void main( int ac, char *av[] )
{
int ret, err ;
uint endp ;
ushort attr=0 ;
int c, p ;
char wildflg ;
int nsw ; /* スイッチの引数の数 */
char *comspec ;
printf("WILD.EXE v0.60 (c) パオパオ 1990. ") ;
printf("<< Copyright (C) Y.Hirata 1990. >>\n") ;
Sw.dir = FALSE ;
Sw.quit = FALSE ;
Sw.cont = FALSE ;
err = FALSE ;
if ( ac > 1 ) { /* 引数あり */
comspec = getenv( "COMSPEC" ) ;
if ( comspec == NULL ) {
strcpy( Cmdline,SHELL ) ;
} else {
strcpy( Cmdline,comspec ) ;
strcat( Cmdline," /c" ) ;
}
Cmdptr = strlen( Cmdline ) ;
Wildptr = Cmdptr ;
wildflg = FALSE ;
Wbuf[0] = '\0' ;
c = 1 ; nsw = 0 ;
while ( *av[c] == '-' || *av[c] == '/' ) {
nsw ++ ;
endp = strlen( av[c] ) ;
for ( p=1; p<endp; p++ ) {
switch (*(av[c]+p)) {
case 'd' :
case 'D' :
Sw.dir = TRUE ;
break ;
case 'q' :
case 'Q' :
Sw.quit = TRUE ;
break ;
case 'c' :
case 'C' :
Sw.cont = TRUE ;
break ;
case '-' :
case '/' :
break ;
default :
printf("\x1b[33mWarning : ") ;
printf("そのような オプションスイッチ( %c ) ",*(av[c]+p)) ;
printf("はありません!\n") ;
}
}
c ++ ;
} ;
for ( c=1+nsw; c<ac; c++ ) {
endp = strlen( av[c] ) ;
if ( *av[c] == '(' && *(av[c]+endp-1) == ')' ) {/* オプションスイッチ */
Wildptr = strlen( Cmdline ) ;
p = strlen( av[c] ) ;
if ( p == 2 ) {
strcpy( Appfile,DEF_FILENAME ) ;
} else {
strncpy( Appfile,av[c]+1,p-2 ) ;
Appfile[p] = '\0' ;
}
wildflg = TRUE ;
if ( c == (1+nsw) ) err = TRUE ;
} else { /* 起動プログラム用引数 */
if ( wildflg ) {
strcat( Wbuf," " ) ;
strcat( Wbuf,av[c] ) ;
} else {
strcat( Cmdline," " ) ;
strcat( Cmdline,av[c] ) ;
}
}
}
} else { /* 引数なし */
help() ;
exit( 1 ) ;
}
if ( err ) {
printf("\x1b[31mERROR : ") ;
printf("実行する プログラム が指定されていません!\x1b[m\n") ;
help() ;
exit( 1 ) ;
}
if ( !wildflg ) { /* 展開用ワイルドカード指定なし */
printf( "\n\x1b[33m" ) ;
printf( "WILD 用の展開するワイルドカードの指定がありません!\x1b[m\n" ) ;
printf( "\x1b[32m%s\x1b[m ",Cmdline+Cmdptr+1 ) ;
printf( "を実行しますか? ( y/n )\n" ) ;
printf( "\n" ) ;
if ( yesno( FALSE ) ) {
printf( "\x1b[32m実行します。\x1b[m\n" ) ;
system( Cmdline ) ;
} else {
printf( "\x1b[33mキャンセル しました。\x1b[m\n" ) ;
}
exit( 0 ) ;
}
filechk() ;
endp = strlen( Filename ) ;
attr |= DIR_DIR ; /* 検索ファイルの属性 */
printf("\n只今 ファイル の検索中です .") ;
ret = find( 0,attr,endp ); /* ファイル検索 & 実行 */
if ( ret == -1 ) { /* エラー */
printf("\n\x1b[1;31mファイル( %s )が見つかりません!\x1b[m\n",
Filename) ;
}
close: ;
}