home *** CD-ROM | disk | FTP | other *** search
/ FreeWare Collection 3 / FreeSoftwareCollection3pd199x-jp.img / pao / ms_dos / wild / src / wild.c < prev    next >
Text File  |  1980-01-02  |  14KB  |  558 lines

  1. /*
  2. **    << MSC V5.1 >>
  3. **
  4. **    コマンドライン上のワイルドカードを展開して子プロセスとして起動
  5. **
  6. **    CREATE : 1990.09.01
  7. **    FINISH : 1990.09.02
  8. **
  9. **    < HISTORY >
  10. **    1990.09.01 : CREATE
  11. **    1990.09.07 : 連続実行モードの追加
  12. **    1990.09.08 : ディレクトリの直後にディレクトリが検索された時のバグ修正
  13. **
  14. **    < note > : TABS = 4
  15. **
  16. **    Programed by Y.Hirata ( Nifty ID : NAB03321 )
  17. */
  18.  
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include <process.h>
  23. #include "dir.h"
  24. #include "kyb.h"
  25.  
  26. uchar    Appfile[128] ;                            /*  指定されたファイル名        */
  27. uchar    Filename[128] ;                            /*  作業用ファイル名            */
  28. ulong    Filesize ;                                /*  作業用ファイルのサイズ        */
  29.  
  30. char    Endflg = FALSE ;                        /*  プログラム終了フラグ            */
  31.  
  32. char    Cmdline[128] ;                            /*  子プロセスに渡すコマンドライン    */
  33. char    Cmdptr ;                                /*  実行プログラム挿入位置        */
  34. char    Wildptr ;                                /*  ワイルドカード挿入位置        */
  35. char    Wbuf[128] ;                                /*  コマンドライン作業領域        */
  36. char    Chkstr1[64] ;                            /*  chk*.* のCHK文字列格納    */
  37. uint    Chklen1 ;                                /*  chk*.* のCHK文字数        */
  38. char    Chkstr2[4] ;                            /*  *.chk のCHK文字列格納    */
  39. uint    Chklen2 ;                                /*  *.chk のCHK文字数        */
  40. char    TypeWildFlg ;                            /*  拡張子に'*'がある?        */
  41.  
  42. struct _SW {                                    /*  起動時オプションスイッチ        */
  43.     char    dir ;                                /*  下位のディレクトリも対象?    */
  44.     char    quit ;                                /*  確認メッセージなし?        */
  45.     char    cont ;                                /*  自動連続実行する?        */
  46.     } Sw ;
  47.  
  48. #define        SHELL            "COMMAND /C"
  49. #define        DEF_FILENAME    "*.*"
  50.  
  51. /******************************  キーBREAK 待ち  *******************************/
  52. void keybreak( char keyadrs )
  53. {
  54.     char    matrix[16] ;
  55.  
  56.     do {
  57.         KEY_bufcls() ;
  58.         KEY_matrix( matrix ) ;
  59.     } while ( KEY_test( matrix,keyadrs ) ) ;
  60.  
  61. }
  62.  
  63. /******************************  COMMAND EXEC  *******************************/
  64. int cmdexec()
  65. {
  66.     int        ret ;
  67.     char    matrix[16] ;
  68.     char    keyend ;
  69.  
  70.     strcpy( Cmdline+Wildptr," " ) ;
  71.     strcat( Cmdline,Filename ) ;
  72.     strcat( Cmdline,Wbuf ) ;
  73.     printf( "\n" ) ;
  74.     if ( !Sw.cont ) {                                /*  マニュアルモード            */
  75.         printf( "改行キーで、") ;
  76.     }
  77.     printf( "\x1b[32m%s\x1b[m を実行します。\n",Cmdline+Cmdptr+1 ) ;
  78.     if ( !Sw.cont ) {                                /*  マニュアルモード            */
  79.         printf( "キャンセルは、ESCキーです。終了は、BREAKキーです。\n" ) ;
  80.     }
  81.  
  82.     ret = 0 ;
  83.     keyend = FALSE ;
  84.  
  85.     if ( Sw.cont ) {                                /*  自動連続実行モード    */
  86.         KEY_bufcls() ;
  87.         KEY_matrix( matrix ) ;
  88.         if ( KEY_test( matrix,KEY_BREAK ) ) {
  89.             Endflg = TRUE ;
  90.             ret = 2 ;
  91.             keyend = KEY_BREAK ;
  92.             keybreak( KEY_BREAK ) ;
  93.         } else if ( KEY_test( matrix,KEY_ESC ) ) {
  94.             ret = 1 ;
  95.             keyend = KEY_ESC ;
  96.             keybreak( KEY_ESC ) ;
  97.         } else {
  98.             if ( KEY_test( matrix,KEY_CTRL ) ) {
  99.                 printf( "\nCTRLキーが放されるまで待ちます♪\n" ) ;
  100.                 keybreak( KEY_CTRL ) ;
  101.             }
  102.             ret = 0 ;
  103.             keyend = KEY_CR ;
  104.         }
  105.  
  106.     } else {                                        /*  マニュアルモード            */
  107.         do {
  108.             KEY_bufcls() ;
  109.             KEY_matrix( matrix ) ;
  110.             if ( KEY_test( matrix,KEY_CR ) ) {
  111.                 ret = 0 ;
  112.                 keyend = KEY_CR ;
  113.                 keybreak( KEY_CR ) ;
  114.             } else if ( KEY_test( matrix,KEY_EXEC ) ) {
  115.                 ret = 0 ;
  116.                 keyend = KEY_CR ;
  117.                 keybreak( KEY_EXEC ) ;
  118.             } else if ( KEY_test( matrix,TKEY_CR ) ) {
  119.                 ret = 0 ;
  120.                 keyend = KEY_CR ;
  121.                 keybreak( TKEY_CR ) ;
  122.             } else if ( KEY_test( matrix,KEY_ESC ) ) {
  123.                 ret = 1 ;
  124.                 keyend = KEY_ESC ;
  125.                 keybreak( KEY_ESC ) ;
  126.             } else if ( KEY_test( matrix,KEY_BREAK ) ) {
  127.                 Endflg = TRUE ;
  128.                 ret = 2 ;
  129.                 keyend = KEY_BREAK ;
  130.                 keybreak( KEY_BREAK ) ;
  131.             }
  132.         } while ( !keyend ) ;
  133.     }
  134.  
  135.     if ( keyend == KEY_CR ) {
  136.         printf("\x1b[32m***  EXEC  ***\x1b[m\n") ;
  137.         system( Cmdline ) ;
  138.         printf("\n只今 ファイル の検索中です .") ;
  139.     } else if ( keyend == KEY_ESC ) {
  140.         printf("\x1b[33m***  CANCEL  ***\x1b[m\n") ;
  141.         printf("\n只今 ファイル の検索中です .") ;
  142.     } else if ( keyend == KEY_BREAK ) {
  143.         printf("\x1b[36m***  TERMINATE!  ***\x1b[m\n") ;
  144.     }
  145.  
  146.     return( ret ) ;
  147. }
  148.  
  149. /****************************  Yes/No キー入力する  ****************************/
  150. int yesno( char msgon )
  151. {
  152.     int        ret ;
  153.     char    matrix[16] ;
  154.     char    keyend ;
  155.  
  156.     ret = 0 ;
  157.     keyend = FALSE ;
  158.     do {
  159.         KEY_bufcls() ;
  160.         KEY_matrix( matrix ) ;
  161.         if ( KEY_test( matrix,KEY_N ) ) {
  162.             ret = 0 ;
  163.             keyend = KEY_N ;
  164.             keybreak( KEY_N ) ;
  165.         } else if ( KEY_test( matrix,KEY_Y ) ) {
  166.             ret = 1 ;
  167.             keyend = KEY_Y ;
  168.             keybreak( KEY_Y ) ;
  169.         } else if ( KEY_test( matrix,KEY_BREAK ) ) {
  170.             Endflg = TRUE ;
  171.             ret = 2 ;
  172.             keyend = KEY_BREAK ;
  173.             keybreak( KEY_BREAK ) ;
  174.         }
  175.     } while ( !keyend ) ;
  176.  
  177.     if ( keyend == KEY_N && msgon ) {
  178.         printf("\n只今 ファイル の検索中です .") ;
  179.     } else if ( keyend == KEY_BREAK ) {
  180.         printf("\x1b[36m***  TERMINATE!  ***\x1b[m\n") ;
  181.     }
  182.  
  183.     return( ret ) ;
  184. }
  185.  
  186. /****************************  ファイル名再設定  *****************************/
  187. void setFname( uchar *addFname )
  188. {
  189.     int        endp ;
  190.  
  191.     endp = strlen( (char *)Filename ) ;
  192.     do {
  193.         endp -- ;
  194.         if ( endp < 0 ) break ;
  195.     } while ( Filename[endp]!='\\' && Filename[endp]!=':' ) ;
  196.     endp ++ ;
  197.     strcpy( &Filename[endp],addFname ) ;
  198. }
  199.  
  200. /******************************  ファイル検索  *******************************/
  201. int find( int rank, ushort attr, int ptr )
  202. {
  203.     DIR        dta ;
  204.     int        endp, ret ;
  205.     uint    chk1p, chk2p ;
  206.     int        c ;
  207.     uint    pptr ;                                    /*  '.' の位置        */
  208.     char    execflg ;
  209.     char    dirserch ;
  210.  
  211.     if ( rank )
  212.         strcat( &Filename[ptr],"*.*" ) ;
  213.  
  214.     if ( firstsearch( Filename,attr,&dta ) ) {            /*  最初のエントリ    */
  215.         do {
  216.             printf(".") ;
  217.             endp = strlen( dta.d_name ) ;
  218.  
  219.             if ( strcmp( dta.d_name,"." ) && strcmp( dta.d_name,".." ) ) {
  220.                                                         /*  . or .. 以外    */
  221.                 if ( (dta._attrib & DIR_DIR) ) {        /*  ディレクトリ            */
  222.                     if ( rank ) {
  223.                         /* パス名にディレクトリ名を追加する                    */
  224.                         if ( Filename[ptr-1] == '\\' ||
  225.                                 Filename[ptr-1] == ':') {
  226.                             strcpy( &Filename[ptr],dta.d_name ) ;
  227.                         } else {
  228.                             strcpy( &Filename[ptr],"\\" ) ;
  229.                             strcat( Filename,dta.d_name ) ;
  230.                         }
  231.                     } else {
  232.                         /* はじめは、入力されたパスにディレクトリ名をつける    */
  233.                         strcpy( Filename,Appfile ) ;
  234.                         setFname( dta.d_name ) ;
  235.                     }
  236.                     endp = strlen( Filename ) ;
  237.                     Filename[endp++] = '\\' ;
  238.                     Filename[endp] = '\0' ;
  239.  
  240.                     if ( Sw.dir ) {
  241.                         dirserch = TRUE ;
  242.                     } else {
  243.                         dirserch = FALSE ;
  244.                     }
  245.                     if ( Sw.dir && !Sw.quit ) {
  246.                         printf("\n\x1b[33m") ;
  247.                         printf("ディレクトリ < %s > を検索しますか? ( y/n )",
  248.                             Filename ) ;
  249.                         printf("\x1b[m\n") ;
  250.                         dirserch = yesno( TRUE ) ;
  251.                         if ( Endflg ) return( TRUE ) ;
  252.                     }
  253.                     if ( dirserch ) {
  254.                         if ( !Sw.quit )
  255.                             printf("\n只今 ファイル の検索中です .") ;
  256.                         ret = find( rank+1,attr,endp ) ;    /*  再帰呼出    */
  257.                         if ( ret )    return( TRUE ) ;
  258.                     }
  259.  
  260.                 } else {                                /*  ファイル        */
  261.                     if ( !rank ) {
  262.                     /* はじめは、入力されたパス名にファイル名をつける        */
  263.                         strcpy( Filename,Appfile );
  264.                         setFname( dta.d_name );
  265.                     } else {
  266.                     /* パス名にファイル名を追加する                            */
  267.                         strcpy( &Filename[ptr],dta.d_name );
  268.                     }
  269.  
  270.                     execflg = TRUE ;
  271.                     if ( !strcmp( dta.d_name,"." ) ||
  272.                             !strcmp( dta.d_name,".." ) ) {
  273.                         execflg = FALSE ;
  274.                     }
  275.                     pptr = 0 ;
  276.                     for ( c=0; c<endp; c++ )
  277.                         if ( dta.d_name[c] == '.' ) pptr = c+1 ;
  278.                     if ( Chklen1 && strnicmp( dta.d_name,Chkstr1,Chklen1 ) ) {
  279.                         execflg = FALSE ;
  280.                     }
  281.                     if ( Chklen2 && !pptr ) execflg = FALSE ;
  282.                     if ( pptr && Chklen2 ) {
  283.                         if ( TypeWildFlg ) {
  284.                             if ( strnicmp(dta.d_name+pptr,Chkstr2,Chklen2) ) {
  285.                                 execflg = FALSE ;
  286.                             }
  287.                         } else {
  288.                             if ( stricmp( dta.d_name+pptr,Chkstr2 ) ) {
  289.                                 execflg = FALSE ;
  290.                             }
  291.                         }
  292.                     }
  293.                     if ( execflg ) {
  294.                         cmdexec() ;
  295.                         if ( Endflg ) return( TRUE ) ;
  296.                     }
  297.  
  298.                 }
  299.  
  300.             } else {                                    /*  . or .. の場合    */
  301.                 ;
  302.             }
  303.  
  304.         } while ( nextsearch( &dta ) );                    /*  次のエントリ    */
  305.  
  306.         if ( !rank ) {
  307.             printf( "\n全ての \x1b[32m%s\x1b[m の検索を",Appfile ) ;
  308.             printf( "終了しましたので、" ) ;
  309.             printf( "プログラムを終了します。\n" ) ;
  310.         }
  311.         return( FALSE ) ;
  312.  
  313.     } else {                                    /*  ファイルが見つからない    */
  314.         return( -1 ) ;
  315.     }
  316. }
  317.  
  318. /******************************  ファイル名チェック  *********************************/
  319. void filechk()
  320. {
  321.     int        c, p ;
  322.     uint    endp ;
  323.     uint    pptr, dptr ;                    /*  '.' , ':' or '\' の位置        */
  324.  
  325.     endp = strlen( Appfile ) ;
  326.     if ( Appfile[endp-1]=='\\' || Appfile[endp-1]==':' ) {    /*  A:\,A:        */
  327.         strcat( Appfile,DEF_FILENAME ) ;
  328.     }
  329.     if ( endp > 1 ) {
  330.         if ( Appfile[endp-2]=='\\' || Appfile[endp-2]==':' ) {
  331.                                                             /*  A:\.,A:.    */
  332.             if ( Appfile[endp-1] == '.' ) {
  333.                 Appfile[endp-1] = '\0' ;
  334.                 strcat( Appfile,DEF_FILENAME ) ;
  335.             }
  336.         }
  337.     }
  338.     if ( !strcmp( Appfile,"." ) ) {                            /*  .            */
  339.         strcpy( Appfile,DEF_FILENAME ) ;
  340.     }
  341.  
  342.     endp = strlen( Appfile ) ;
  343. /*
  344. **    ない場合 : 0 , あった場合 : 何番目
  345. */
  346.     dptr = pptr = 0 ;
  347.     for ( c=0; c<endp; c++ ) {                    /*  ':' or '\' , '.' の位置    */
  348.         if ( Appfile[c] == '\\' || Appfile[c] == ':' ) dptr = c+1 ;
  349.         if ( Appfile[c] == '.' ) pptr = c+1 ;
  350.     }
  351.  
  352.     for ( c=dptr,p=0; c<endp; c++,p++ ) {        /*  拡張子より前のチェック        */
  353.         if ( Appfile[c] == '.' ) {
  354.             Chkstr1[p] = '\0' ;
  355.             break ;
  356.         }
  357.         if ( Appfile[c] == '*' ) {
  358.             Chkstr1[p] = '\0' ;
  359.             break ;
  360.         } else {
  361.             Chkstr1[p] = Appfile[c] ;
  362.         }
  363.     }
  364.     Chkstr1[p] = '\0' ;
  365.  
  366.     TypeWildFlg = FALSE ;
  367.     if ( pptr ) {
  368.         for ( c=pptr,p=0; c<endp; c++,p++ ) {    /*  拡張子のチェック            */
  369.             if ( Appfile[c] == '*' ) {
  370.                 Chkstr2[p] = '\0' ;
  371.                 TypeWildFlg = TRUE ;
  372.                 break ;
  373.             } else {
  374.                 Chkstr2[p] = Appfile[c] ;
  375.             }
  376.         }
  377.     } else {
  378.         p = 0 ;
  379.     }
  380.     Chkstr2[p] = '\0' ;
  381.  
  382.     strcpy( Filename,Appfile ) ;
  383.     if ( dptr+1 == pptr && pptr ) {
  384.                                 /*  拡張子の前にファイル名がない -> 1文字追加    */
  385.         Appfile[dptr] = '\0' ;
  386.         strcat( Appfile,"*" ) ;
  387.         strcat( Appfile,Filename+pptr-1 ) ;
  388.         endp = strlen( Appfile ) ;
  389.     }
  390.  
  391.     if ( Appfile[endp-1] == '.' ) {                /*  最後が '.' の場合        */
  392.         strcat( Appfile,"*" ) ;
  393.     }
  394.  
  395.     if ( Sw.dir ) {
  396.         if ( dptr ) {                    /*  下位のディレクトリも対象とする場合    */
  397.             strncpy( Filename,Appfile,dptr ) ;
  398.             Filename[dptr] = '\0' ;
  399.             strcat( Filename,DEF_FILENAME ) ;
  400.         } else {
  401.             strcpy( Filename,DEF_FILENAME ) ;
  402.         }
  403.     } else {                            /*  下位のディレクトリは無視 : デフォルト    */
  404.         strcpy( Filename,Appfile ) ;
  405.     }
  406.  
  407.     Chklen1 = strlen( Chkstr1 ) ;
  408.     Chklen2 = strlen( Chkstr2 ) ;
  409.  
  410. }
  411.  
  412. /*****************************  使用方法表示  ********************************/
  413. void help()
  414. {
  415.     printf("\n< ワイルドカード展開実行プログラム >\n") ;
  416.     printf("使用方法 :  WILD  [{/|-}option]  ") ;
  417.     printf("プログラム  (ワイルドカード)  引数2 ・・・\n") ;
  418.     printf("option   :  'd'  下位のディレクトリも検索対象とします。\n") ;
  419.     printf("         :  'q'  ディレクトリ検索の確認メッセージを無しとします。\n") ;
  420.     printf("         :  'c'  連続実行します(実行確認メッセージ無)。\n") ;
  421.     printf("sample   :  WILD  /dqc  TYPE  (*.DOC)\n") ;
  422.     printf("         :  WILD  /dq  COPY  (*.DOC)  A:\n") ;
  423.     printf("         :  WILD  /d  COMMAND /C (*.COM)\n") ;
  424.     printf("\x1b[33m☆☆☆  ワイルドカードは、必ず '(',')'で括って下さい♪") ;
  425.     printf("  ☆☆☆\x1b[m\n") ;
  426. }
  427.  
  428. /*****************************  ★ メイン ★  ********************************/
  429. void main( int ac, char *av[] )
  430. {
  431.     int        ret, err ;
  432.     uint    endp ;
  433.     ushort    attr=0 ;
  434.     int        c, p ;
  435.     char    wildflg ;
  436.     int        nsw ;                                        /*  スイッチの引数の数    */
  437.     char    *comspec ;
  438.  
  439.     printf("WILD.EXE  v0.60  (c) パオパオ 1990.           ") ;
  440.     printf("<< Copyright (C) Y.Hirata 1990. >>\n") ;
  441.  
  442.     Sw.dir = FALSE ;
  443.     Sw.quit = FALSE ;
  444.     Sw.cont = FALSE ;
  445.  
  446.     err = FALSE ;
  447.     if ( ac > 1 ) {                                            /*  引数あり    */
  448.         comspec = getenv( "COMSPEC" ) ;
  449.         if ( comspec == NULL ) {
  450.             strcpy( Cmdline,SHELL ) ;
  451.         } else {
  452.             strcpy( Cmdline,comspec ) ;
  453.             strcat( Cmdline," /c" ) ;
  454.         }
  455.         Cmdptr = strlen( Cmdline ) ;
  456.         Wildptr = Cmdptr ;
  457.         wildflg = FALSE ;
  458.         Wbuf[0] = '\0' ;
  459.  
  460.         c = 1 ;    nsw = 0 ;
  461.         while ( *av[c] == '-' || *av[c] == '/' ) {
  462.             nsw ++ ;
  463.             endp = strlen( av[c] ) ;
  464.             for ( p=1; p<endp; p++ ) {
  465.                 switch (*(av[c]+p)) {
  466.                     case 'd' :
  467.                     case 'D' :
  468.                         Sw.dir = TRUE ;
  469.                         break ;
  470.                     case 'q' :
  471.                     case 'Q' :
  472.                         Sw.quit = TRUE ;
  473.                         break ;
  474.                     case 'c' :
  475.                     case 'C' :
  476.                         Sw.cont = TRUE ;
  477.                         break ;
  478.                     case '-' :
  479.                     case '/' :
  480.                         break ;
  481.                     default :
  482.                         printf("\x1b[33mWarning : ") ;
  483.                         printf("そのような オプションスイッチ( %c ) ",*(av[c]+p)) ;
  484.                         printf("はありません!\n") ;
  485.                 }
  486.             }
  487.             c ++ ;
  488.         } ;
  489.  
  490.         for ( c=1+nsw; c<ac; c++ ) {
  491.             endp = strlen( av[c] ) ;
  492.             if ( *av[c] == '(' && *(av[c]+endp-1) == ')' ) {/* オプションスイッチ    */
  493.                 Wildptr = strlen( Cmdline ) ;
  494.                 p = strlen( av[c] ) ;
  495.                 if ( p == 2 ) {
  496.                     strcpy( Appfile,DEF_FILENAME ) ;
  497.                 } else {
  498.                     strncpy( Appfile,av[c]+1,p-2 ) ;
  499.                     Appfile[p] = '\0' ;
  500.                 }
  501.                 wildflg = TRUE ;
  502.                 if ( c == (1+nsw) ) err = TRUE ;
  503.             } else {                                /* 起動プログラム用引数    */
  504.                 if ( wildflg ) {
  505.                     strcat( Wbuf," " ) ;
  506.                     strcat( Wbuf,av[c] ) ;
  507.                 } else {
  508.                     strcat( Cmdline," " ) ;
  509.                     strcat( Cmdline,av[c] ) ;
  510.                 }
  511.             }
  512.         }
  513.  
  514.     } else {                                                /*  引数なし    */
  515.         help() ;
  516.         exit( 1 ) ;
  517.     }
  518.  
  519.     if ( err ) {
  520.         printf("\x1b[31mERROR : ") ;
  521.         printf("実行する プログラム が指定されていません!\x1b[m\n") ;
  522.         help() ;
  523.         exit( 1 ) ;
  524.     }
  525.  
  526.     if ( !wildflg ) {                            /*  展開用ワイルドカード指定なし    */
  527.         printf( "\n\x1b[33m" ) ;
  528.         printf( "WILD 用の展開するワイルドカードの指定がありません!\x1b[m\n" ) ;
  529.         printf( "\x1b[32m%s\x1b[m ",Cmdline+Cmdptr+1 ) ;
  530.         printf( "を実行しますか? ( y/n )\n" ) ;
  531.         printf( "\n" ) ;
  532.         if ( yesno( FALSE ) ) {
  533.             printf( "\x1b[32m実行します。\x1b[m\n" ) ;
  534.             system( Cmdline ) ;
  535.         } else {
  536.             printf( "\x1b[33mキャンセル しました。\x1b[m\n" ) ;
  537.         }
  538.         exit( 0 ) ;
  539.     }
  540.  
  541.     filechk() ;
  542.     endp = strlen( Filename ) ;
  543.  
  544.     attr |= DIR_DIR ;                                /* 検索ファイルの属性    */
  545.  
  546.     printf("\n只今 ファイル の検索中です .") ;
  547.     ret = find( 0,attr,endp );                        /*  ファイル検索 & 実行     */
  548.  
  549.     if ( ret == -1 ) {                                            /* エラー    */
  550.         printf("\n\x1b[1;31mファイル( %s )が見つかりません!\x1b[m\n",
  551.                     Filename) ;
  552.     }
  553.  
  554. close: ;
  555.  
  556. }
  557.  
  558.