『Cプログラミング診断室』目次次(第3章 上司が問題 おわりに)

第3章 上司が問題

その他


その他にもいろいろ問題がありました。とくに、「努力の文字処理、ご苦労さま。」という感じ です。

もう疲れてきたので、不思議な文字列処理は読者自身でご検討ください。その他も変更していま すが、修正プログラム(リスト3−2)を参考にしてください。力のある方、根気のある方、気の 長い方、どうぞご自分で修正を続けてください。

リスト3−2 修正版

     1  /********************************************************************************/
     2  /*                                                                              */
     3  /*       バックアップ  チェック プログラム                                      */
     4  /*                                                                              */
     5  /*       STMPCHK バックアップ元 バックアップ先                                  */
     6  /*                                                                              */
     7  /*                                                                 STMPCHK.C    */
     8  /*       Program by : 中尾 竜己                                   1991.05.11    */
     9  /*                                                                              */
    10  /*      変更    1991/05/24      藤原    もう、あちこち、変更だらけでーす。      */
    11  /*                                                                              */
    12  /********************************************************************************/
    13  
    14  #include <stdio.h>
    15  #include <process.h>
    16  #include <stdlib.h>
    17  #include <malloc.h>
    18  #include <dos.h>
    19  #include <string.h>
    20  #include <ctype.h>
    21  #include <memory.h>
    22  
    23  /**************************       マクロ定義      *******************************/
    24  
    25  #define         TRUE                    (1)
    26  #define         FALSE                   (0)
    27  
    28  #define         CR_KEY                  (0x0d)
    29  
    30  #define         FILE_MAX_COUNT          1000
    31  #define         EXT_MAX_COUNT           200
    32  #define         DRIVE_NAME_LENGTH       50
    33  
    34  /**************************         型定義        *******************************/
    35  
    36  typedef struct  {
    37                  char     checked;               /* フラグ       */
    38                  char     name[15];              /* ファイル名   */
    39                  char     time[5];               /* 時間         */
    40  } file_spec;
    41  
    42                                          /* ドライブ型の定義     */              
    43  typedef enum    {
    44          floppy_disk, hard_disk
    45  } dev_type;
    46  
    47  /**************************       変数宣言        *******************************/
    48  
    49  union    REGS inregs, outregs;
    50  struct   SREGS segregs;
    51  
    52  char            ext_name[EXT_MAX_COUNT][10];            /* 拡張子名     */
    53  int             ext_count;                              /* 拡張子個数   */
    54  
    55                                          /*   バックアップ「元」の情報   */
    56  char            drive_from[DRIVE_NAME_LENGTH];          /* ドライブ名   */
    57  dev_type        dev_type_from;                          /* ドライブの型 */
    58  file_spec       rec_from[FILE_MAX_COUNT];               /* ファイル情報 */
    59  int             file_count_from;                        /* ファイル数   */
    60  
    61                                          /*   バックアップ「先」の情報   */
    62  char            drive_to[DRIVE_NAME_LENGTH];            /* ドライブ名   */
    63  dev_type        dev_type_to;                            /* ドライブの型 */
    64  file_spec       rec_to[FILE_MAX_COUNT];                 /* ファイル情報 */
    65  int             file_count_to;                          /* ファイル数   */
    66  
    67  int             error_count;                            /* エラーカウント */
    68  
    69  /********************************************************************************/
    70  /*                      メイン・プログラム                                      */
    71  /********************************************************************************/
    72  int main( argc, argv )
    73    int     argc;
    74    char    *argv[];
    75  {
    76          if( argc != 3 ){
    77                  printf("\n指定の誤りです。");
    78                  printf("\n[例] = STMPCHK D: A:");
    79                  printf("\nSTMPCHK (バックアップ元)(バックアップ先)");
    80                  exit(-1);                           /*  指定型式のエラー  */
    81          }
    82  
    83          ext_count = 0;
    84  
    85          /* 第1引数(バックアップ元)のチェック */
    86          if( disk_check( argv[1], drive_from, &dev_type_from ) )
    87                  exit( 1 ); 
    88  
    89          /* 第2引数(バックアップ先)のチェック */
    90          if( disk_check( argv[2], drive_to, &dev_type_to ) )
    91                  exit( 1 ); 
    92  
    93          /* ファイルのチェック   */
    94          backup_check( dev_type_from, dev_type_to );
    95  }
    96  
    97  /********************************************************************************/
    98  /*      ディスクチェック                                                        */
    99  /*              引数をチェックし、ドライブのタイプを調べる                      */
   100  /********************************************************************************/
   101  disk_check( argdrive, drive, drive_type )
   102    char          *argdrive;
   103    char          *drive;
   104    dev_type      *drive_type;
   105  {
   106          int               drive_num;
   107  
   108          strcpy( drive, argdrive );
   109          if( ! isascii( drive[0] ) )
   110                  goto error;
   111          drive[0] = toupper( drive[0] );
   112          if( drive[1] != ':' )
   113                  goto error;
   114  
   115          if( drive[strlen(drive)-1] != '\\' ){   /* ドライブ名に¥を付ける */
   116                  strcat( drive, "\\" );
   117          }
   118  
   119          drive_num = drive[0] - ('A' - 1);
   120  
   121          get_disk_type( drive_num, drive_type );
   122  
   123          return( 0 );                    /*   正常終了   */
   124    error:
   125          printf("\nドライブ指定の誤りです。");
   126          return( 1 );                    /* ドライブ指定の誤りです */
   127  }
   128  
   129  /********************************************************************************/
   130  /*      指定ドライブタイプ(フロッピー/ハードディスク)の識別                  */
   131  /********************************************************************************/
   132  get_disk_type( dr, drive_type )
   133    int           dr;             /* 入力 ドライブ番号    */
   134    dev_type      *drive_type;    /* 出力 ドライブの型    */
   135  {
   136          int             DS_SEG;
   137          unsigned char   fat_top[1];
   138  
   139          inregs.h.ah = 0x1c;
   140          inregs.h.dl = (unsigned char)dr;
   141          intdosx( &inregs, &outregs, &segregs );
   142          DS_SEG = segregs.ds;
   143          segread( &segregs );
   144          movedata( DS_SEG, outregs.x.bx, segregs.ds,fat_top, sizeof(fat_top) );
   145  
   146          *drive_type = ( fat_top[0] == 0xfe ) ? floppy_disk : hard_disk;
   147  }
   148  
   149  /********************************************************************************/
   150  /*      バックアップのチェック                                                  */
   151  /********************************************************************************/
   152  backup_check( dev_type_from, dev_type_to )
   153    dev_type      dev_type_from, dev_type_to;
   154  {
   155          file_count_from = file_count_to = 0;
   156          error_count = 0;
   157  
   158          if( dev_type_from == floppy_disk ) {
   159                  if( FD_get( TRUE, drive_from, &file_count_from ) )
   160                          exit( 1 );
   161          } else {
   162                  dir_sh( 1, drive_from, &file_count_from );
   163          }
   164          if( file_count_from <= 0 ){
   165                  printf("\nファイルが登録されていません。\n");
   166                  exit( 1 );
   167          }
   168  
   169          ext_name_put();                 /* 拡張子の取得 */
   170          ext_name_display( 0 );          /* 拡張子の表示 */
   171          ext_name_input();               /* 拡張子の入力 */
   172          ext_name_display( 1 );          /* 拡張子の表示 */
   173  
   174          if( dev_type_from == floppy_disk ) {
   175                  FD_get( FALSE, drive_to, &file_count_to );
   176                  fd_fd_chk( file_count_from, file_count_to );
   177          } else {
   178                  dir_sh( 0, drive_to, &file_count_to );
   179          }
   180          file_chek2();
   181  
   182          if( error_count == 0 ){
   183                  printf("\n\n      バックアップは完璧です!\n");
   184          }
   185  }
   186  
   187  /********************************************************************************/
   188  /*      フロッピーセットメッセージ と ファイル情報の取得                        */
   189  /********************************************************************************/
   190  FD_get( is_from, drive_name, file_count )
   191    int     is_from;
   192    char    drive_name[];
   193    int     *file_count;
   194  {
   195          int     count, ch;
   196          char    moji[100];
   197  
   198          if( is_from ){
   199                  sprintf( moji, "\n%s %c %s\n",
   200                                  "バックアップ元のフロッピーを", drive_name[0],
   201                                  "ドライブにセットして下さい。NO %d" );
   202          }else{
   203                  sprintf( moji, "\n%s %c %s\n",
   204                                  "バックアップ先のフロッピーを", drive_name[0],
   205                                  "ドライブにセットして下さい。NO %d" );
   206          }
   207  
   208          for( count=1 ; ; count++ ) {
   209                  printf( moji, count);
   210                  if( count == 1 ){
   211                          printf("準備OK = [改行] ・ 中止 = [その他]\n");
   212                  }else{
   213                          printf("準備OK = [改行] ・ フロッピー終了 = [その他]\n");
   214                  }
   215                  printf("\nINPUT KEY > ");
   216                  ch = getch();
   217                  printf("\n");
   218                  if( ch != CR_KEY )
   219                          break;
   220  
   221                  dir_sh( is_from, drive_name, file_count );   /*  ファイル検索   */
   222          }
   223  
   224          return  (count==1) ? -1 : 0;
   225  }
   226  
   227  /********************************************************************************/
   228  /*      修正に疲れました。私には、これ以上続ける忍耐がないので、読者の方々      */
   229  /*      には誠に申し訳ないのですが、もう体力、精神力の限界なので、ここまで      */
   230  /*      を載せることにさせていただきます。                                      */
   231  /*      もうイヤだ、イヤだ。こんなの直すくらいなら、初めから作った方がよっ      */
   232  /*      ぽど楽に決まってるよー。それにしても簡単なことを複雑にするもんだ。      */
   233  /********************************************************************************/


Copyright1996 Hirofumi Fujiwara. No reproduction or republication without written permission
『Cプログラミング診断室』目次次(第3章 上司が問題 おわりに)