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

第3章 上司が問題

プログラムの紹介


さて、フローチャートを理解したら、次はそれに基づいて作られたプログラムです。フローチャー トが分かればプログラムの理解は容易なはずですが、果たしてそうでしょうか。

だいぶ努力したつもりですが、私には、ほとんど意味不明なことばかりでした。

さあ、読者の方も、先を読み進む前に、リストをながめて、「変だ!?」とか、「エーッ」という ところをリストアップしてください。そして、どう変なのか、あるいは、修正を試みてください。

▼続きがあります。

リスト3−1 オリジナルプログラム

     1  /******************************************************************************/
     2  /*                                                                            */
     3  /*       バックアップ  チェック プログラム                                    */
     4  /*                                                                            */
     5  /*       STMPCHK バックアップ元 バックアップ先                                */
     6  /*                                                                            */
     7  /*                                                                 STMPCHK.C  */
     8  /*       Program by : 中尾 竜己                                   1991.05.11  */
     9  /******************************************************************************/
    10  
    11  #include <stdio.h>
    12  #include <process.h>
    13  #include <stdlib.h>
    14  #include <malloc.h>
    15  #include <dos.h>
    16  #include <string.h>
    17  #include <ctype.h>
    18  #include <memory.h>
    19  
    20  union    REGS inregs, outregs;
    21  struct   SREGS segregs;
    22  
    23  char     DIRNAME[200][10];                 /* 拡張子名 */
    24  char     A_DRIVE[50], B_DRIVE[50];
    25  
    26  struct RECA{
    27                  char     FLG[1];                    /* フラグ     */
    28                  char     FNAME[15];                 /* ファイル名 */
    29                  char     TIME[5];                   /* 時間       */
    30  }reca[1000];
    31  
    32  struct RECB{
    33                  char     FLG[1];                    /* フラグ     */
    34                  char     FNAME[15];                 /* ファイル名 */
    35                  char     TIME[5];                   /* 時間       */
    36  }recb[1000];
    37  
    38  int     FCNT;                               /* ファイル数 */
    39  int     KCNT;                               /* 拡張子個数 */
    40  int     ERCNT;                              /* エラーフラグ  */
    41  int     DFLG;                               /* 処理フラグ */
    42  
    43  int main( argc, argv )
    44  int     argc;
    45  char    *argv[];
    46  {
    47  int     ret, len, i, flg, cnt1, cnt2;
    48  char    moji[80];
    49  
    50          ret = 1;
    51          DFLG = 0x00;
    52          if( argc != 3 ){
    53                  printf("\n指定の誤りです。");
    54                  printf("\n[例] = STMPCHK D: A:");
    55                  printf("\nSTMPCHK (バックアップ元)(バックアップ先)");
    56                  exit(-1);                           /*  指定型式のエラー  */
    57          }
    58  
    59          KCNT = 0;
    60          strcpy( A_DRIVE, argv[1] );
    61          strcpy( B_DRIVE, argv[2] );
    62  
    63          len = strlen( A_DRIVE );                /* ドライブ名に¥を付ける */
    64          if( A_DRIVE[len-1] != '\\' ){
    65                  A_DRIVE[len] = '\\';
    66                  A_DRIVE[len+1] = 0;
    67          }
    68  
    69          len = strlen( B_DRIVE );                /* ドライブ名に¥を付ける */
    70          if( B_DRIVE[len-1] != '\\' ){
    71                  B_DRIVE[len] = '\\';
    72                  B_DRIVE[len+1] = 0;
    73          }
    74  
    75          strcpy( moji, A_DRIVE );                /*  1 ファイル名         */
    76          strcat( moji, "*.*" );
    77  
    78          ret = disk_chk( moji, &flg );           /*  Aディスクのチェック */
    79          if( ret != 0 )exit( ret ); 
    80          if( flg == 0 ){
    81                  DFLG = 0x00;                        /*  フロッピーディスク   */
    82          }else{
    83                  DFLG = 0x10;                        /*  ハードディスク       */
    84          }
    85  
    86          strcpy( moji, B_DRIVE );                /*  2 ファイル名         */
    87          strcat( moji, "*.*" );
    88  
    89          ret = disk_chk( moji, &flg );           /*  Bディスクのチェック */
    90          if( ret != 0 )exit( ret ); 
    91  
    92          if( flg == 0 ){
    93                  DFLG = DFLG + 0x00;                 /*  フロッピーディスク   */
    94          }else{
    95                  DFLG = DFLG + 0x01;                 /*  ハードディスク       */
    96          }
    97  
    98          /*  DFLG    0x00    1: FD   2: FD  */
    99          /*  DFLG    0x01    1: FD   2: HD  */
   100          /*  DFLG    0x10    1: HD   2: FD  */
   101          /*  DFLG    0x11    1: HD   2: HD  */
   102  
   103          ERCNT = FCNT = 0;
   104          clear_reca();
   105          clear_recb();
   106          switch( DFLG ){
   107                  case  0x00:  /* 1:FD 2:FD */
   108                          strcpy( moji, A_DRIVE );        /*  1 ファイル名         */
   109                          ret = FD_get( 1, moji );
   110                          cnt1 = FCNT;
   111                          if( ret != 0  )exit( 1 );
   112                          if( FCNT <= 0 ){
   113                                  printf("\nファイルが登録されていません。\n");
   114                                  exit( 1 );
   115                          }
   116                          KNAME_put();                    /*  拡張子の取得            */
   117                          KNAME_dsp( 0 );                 /*  拡張子の表示            */
   118                          KNAME_inp();                    /*  拡張子の入力            */
   119                          KNAME_dsp( 1 );                 /*  拡張子の表示            */
   120                          FCNT = 0;
   121                          strcpy( moji, B_DRIVE );        /*  1 ファイル名            */
   122                          ret = FD_get( 2, moji );
   123                          cnt2 = FCNT;
   124                          FCNT = cnt1;
   125                          fd_fd_chk( cnt2 );
   126                          file_chek2();
   127                          break;
   128                  case  0x01:                         /* 1:FD  2:HD */
   129                          strcpy( moji, A_DRIVE );        /*  1 ファイル名         */
   130                          ret = FD_get( 1, moji );
   131                          if( ret != 0  )exit( 1 );
   132                          if( FCNT <= 0 ){
   133                                  printf("\nファイルが登録されていません。\n");
   134                                  exit( 1 );
   135                          }
   136                          KNAME_put();                    /*  拡張子の取得            */
   137                          KNAME_dsp( 0 );                 /*  拡張子の表示            */
   138                          KNAME_inp();                    /*  拡張子の入力            */
   139                          KNAME_dsp( 1 );                 /*  拡張子の表示            */
   140                          strcpy( moji, B_DRIVE );        /*  1 ファイル名            */
   141                          dir_sh( 0, moji );              /*  ファイル検索            */
   142                          file_chek2();
   143                          break;
   144                  case  0x10:                         /*  1:HD  2:FD              */
   145                          strcpy( moji, A_DRIVE );        /*  1 ファイル名            */
   146                          dir_sh( 1, moji );              /*  ファイル検索            */
   147                          if( FCNT <= 0 ){
   148                                  printf("\nファイルが登録されていません。\n");
   149                                  exit( 1 );
   150                          }
   151                          cnt1 = FCNT;
   152                          KNAME_put();                    /*  拡張子の取得            */
   153                          KNAME_dsp( 0 );                 /*  拡張子の表示            */
   154                          KNAME_inp();                    /*  拡張子の入力            */
   155                          KNAME_dsp( 1 );                 /*  拡張子の表示            */
   156                          FCNT = 0;
   157                          strcpy( moji, B_DRIVE );        /*  1 ファイル名            */
   158                          ret = FD_get( 2, moji );
   159                          cnt2 = FCNT;
   160                          FCNT = cnt1;
   161                          fd_fd_chk( cnt2 );
   162                          file_chek2();
   163                          break;
   164                  case  0x11:  /* 1:HD 2:HD */
   165                          strcpy( moji, A_DRIVE );        /*  1 ファイル名            */
   166                          dir_sh( 1, moji );              /*  ファイル検索            */
   167                          if( FCNT <= 0 ){
   168                                  printf("\nファイルが登録されていません。\n");
   169                                  exit( 1 );
   170                          }
   171                          KNAME_put();                    /*  拡張子の取得            */
   172                          KNAME_dsp( 0 );                 /*  拡張子の表示            */
   173                          KNAME_inp();                    /*  拡張子の入力            */
   174                          KNAME_dsp( 1 );                 /*  拡張子の表示            */
   175                          strcpy( moji, B_DRIVE );        /*  1 ファイル名            */
   176                          dir_sh( 0, moji );              /*  ファイル検索            */
   177                          file_chek2();
   178                          break;
   179                  default:
   180                          exit( 1 );
   181                          break;
   182          }
   183          if( ERCNT == 0 ){
   184                  printf("\n\n      バックアップは完璧です!\n");
   185          }
   186  }
   187  
   188                                  /* *************************** */
   189                                  /*       構造体の初期化        */
   190                                  /* *************************** */
   191  
   192  clear_reca()
   193  {
   194  int      i, j;
   195  
   196          for( i = 0 ; i < 1000 ; i++ ){
   197                  for( j = 0 ; j < 21 ; j++ ){
   198                          reca[i].FLG[j] = ' ';
   199                  }
   200          }
   201  }
   202  
   203  clear_recb()
   204  {
   205  int      i, j;
   206  
   207          for( i = 0 ; i < 1000 ; i++ ){
   208                  for( j = 0 ; j < 21 ; j++ ){
   209                          recb[i].FLG[j] = ' ';
   210                  }
   211          }
   212  }
   213  
   214                                  /* *************************** */
   215                                  /*      ディスクチェック       */
   216                                  /* *************************** */
   217  
   218  disk_chk( DRIVE, tflg )                   /*  ディスクのチェック */
   219  char      DRIVE[];
   220  int       *tflg;
   221  {
   222  int               dr, sec, byte, clust;
   223  unsigned char     id;
   224  int               ret, i, len, flg;
   225  char              moji[80], *p;
   226  
   227          len = strlen( DRIVE );
   228          strcpy( moji, DRIVE );
   229          p = strchr( moji, ':' );
   230          if( p == 0 ){
   231                  printf("\nドライブ指定の誤りです。");
   232                  return( 1 );                        /* ドライブ指定の誤りです */
   233          }
   234          *p = 0;
   235          if( 1 != strlen( moji ) ){
   236                  printf("\nドライブ指定の誤りです。");
   237                  return( 1 );                        /* ドライブ指定の誤りです */
   238          }
   239          ret = 0;
   240          flg = 0;
   241          if( moji[0] > 0x60 ){
   242                  flg = moji[0] - 0x60;
   243          }else{
   244                  flg = moji[0] - 0x40;
   245          }
   246          dskstat( flg, &sec, &byte, &clust, &id );
   247          if( id == 0xfe ){
   248                  *tflg = 0; /* FD */
   249          }else{
   250                  *tflg = 1; /* HD */
   251          }
   252  return( 0 );
   253  }
   254  
   255                                  /* *************************** */
   256                                  /*    指定ドライブ諸元の取得   */
   257                                  /* *************************** */
   258  
   259  dskstat( dr, sec, byte, clust, id )
   260  int      dr;
   261  int      *sec, *byte, *clust;
   262  unsigned char     *id;
   263  {
   264  int       DS_SEG;
   265  char      buf[64];
   266  
   267                  inregs.h.ah = 0x1c;
   268                  inregs.h.dl = (unsigned char)dr;
   269                  intdosx( &inregs, &outregs, &segregs );
   270                  *sec = outregs.h.al;
   271                  *byte = outregs.x.cx;
   272                  *clust = outregs.x.dx;
   273                  DS_SEG = segregs.ds;
   274                  segread( &segregs );
   275                  movedata( DS_SEG, outregs.x.bx, segregs.ds,(unsigned)id, 1 );
   276  }
   277  
   278                                  /* ************************************** */
   279                                  /*     フロッピーセット の メッセージ     */
   280                                  /* ************************************** */
   281  
   282  FD_get( flg, fi_name )
   283  int     flg;
   284  char    fi_name[];
   285  {
   286  int     cnt, ch;
   287  char    moji[100], dummy[50], *p;
   288  
   289          cnt = 0;
   290          if( flg == 1 ){
   291                  strcpy( moji,"\nバックアップ元のフロッピーを ");
   292                  strcpy( dummy, A_DRIVE );
   293                  p = strchr( dummy, ':' );
   294                  *p = 0;
   295                  strcat( moji, dummy );
   296                  strcat( moji," ドライブにセットして下さい。NO %d\n");
   297          }else{
   298                  strcpy( moji,"\nバックアップ先のフロッピーを");
   299                  strcpy( dummy, B_DRIVE );
   300                  p = strchr( dummy, ':' );
   301                  *p = 0;
   302                  strcat( moji, dummy );
   303                  strcat( moji," ドライブにセットして下さい。NO %d\n");
   304          }
   305          while( 1 ){
   306                  cnt++;
   307                  if( cnt == 1 ){
   308                          printf( moji, cnt);
   309                          printf("準備OK = [改行] ・ 中止 = [その他]\n");
   310                  }else{
   311                          printf( moji, cnt);
   312                          printf("準備OK = [改行] ・ フロッピー終了 = [その他]\n");
   313                  }
   314                  printf("\nINPUT KEY > ");
   315                  ch = getch();
   316                  printf("\n");
   317                  if( ch == 13 ){
   318                          dir_sh( flg, fi_name );     /*  ファイル検索          */
   319                  }else{
   320                          if( cnt == 1 ){
   321                                  return( -1 );
   322                          }else{
   323                                  return( 0 );
   324                          }
   325                  }
   326          }
   327  }
   328  
   329                                  /* *************************** */
   330                                  /*      ファイル情報の取得     */
   331                                  /* *************************** */
   332  
   333  int dir_sh( flg, fi_name )
   334  int       flg;
   335  char      fi_name[];
   336  {
   337  int       ret, len, max, i, tflg;
   338  char      moji1[80], buf[64], fi_name2[80], tmoji[80], time[10];
   339  char      name[20], subdir[100];
   340  
   341          segread( &segregs );
   342          setdta( segregs.ds, (unsigned)buf );
   343          strcpy( fi_name2, fi_name );
   344          strcat( fi_name2, "*.*" );
   345          if( search( fi_name2 ) ){
   346                  strcpy( name, buf+0x1e );           /* ファイル名    */
   347                  strncpy( time, buf+0x16, 4 );       /* 作成時刻 時間 */
   348                  time[4] = 0;
   349                  tflg = 0;
   350                  len = strlen( name );
   351                  for( i = len-1 ; i >= 0 ; i-- ){
   352                          if( name[i] == '.' ){
   353                                  tflg = 1;
   354                          }
   355                  }
   356                  if( tflg == 1 ){
   357                          if( name[0] != '.' ){
   358                                  if( flg != 0 ){
   359                                          ret = chek_fname( name, flg );       /* 2重登録のチェック */
   360                                          if( ret == 0 ){
   361                                                  put_filename( name, time, flg ); /* ファイル名 時間 を配列に */
   362                                                  FCNT++;
   363                                          }
   364                                  }else{
   365                                          file_chek( name, time );  /* 配列のファイルと比較 */
   366                                  }
   367                          }
   368                  }else{
   369                          strncpy( subdir, buf+0x15, 1 );       /* 作成時刻 時間 */
   370                          subdir[1] = 0;
   371                          if( subdir[0] < 0x20 ){
   372                                  strcpy( tmoji, fi_name );
   373                                  strcat( tmoji, name );
   374                                  len = strlen( tmoji );
   375                                  tmoji[ len ] = '\\';
   376                                  tmoji[ len+1 ] = 0;
   377                                  dir_sh( flg, tmoji );           /*  ファイル検索          */
   378                                  setdta( segregs.ds, (unsigned)buf );
   379                          }else{
   380                                  if( name[0] != '.' ){
   381                                          strcat( name, ".***" );
   382                                          if( flg != 0 ){
   383                                                  ret = chek_fname( name, flg );       /* 2重登録のチェック */
   384                                                  if( ret == 0 ){
   385                                                          put_filename( name, time, flg ); /* ファイル名 時間 を配列に */
   386                                                          FCNT++;
   387                                                  }
   388                                          }else{
   389                                                  file_chek( name, time );  /* 配列のファイルと比較 */
   390                                          }
   391                                  }
   392                          }
   393                  }
   394          }
   395          while( next() ){
   396                  strcpy( name, buf+0x1e );           /*  ファイル名            */
   397                  strncpy( time, buf+0x16, 4 );       /*  作成時刻 時間         */
   398                  time[4] = 0;
   399                  tflg = 0;
   400                  len = strlen( name );
   401                  for( i = len-1 ; i >= 0 ; i-- ){
   402                          if( name[i] == '.' ){
   403                                  tflg = 1;
   404                          }
   405                  }
   406                  if( tflg == 1 ){
   407                          if( name[0] != '.' ){
   408                                  if( flg != 0 ){
   409                                          ret = chek_fname( name, flg );       /* 2重登録のチェック */
   410                                          if( ret == 0 ){
   411                                                  put_filename( name, time, flg ); /* ファイル名 時間 を配列に */
   412                                                  FCNT++;
   413                                          }
   414                                  }else{
   415                                          file_chek( name, time );
   416                                  }
   417                          }
   418                  }else{
   419                          strncpy( subdir, buf+0x15, 1 );       /* 作成時刻 時間 */
   420                          subdir[1] = 0;
   421                          if( subdir[0] < 0x20 ){
   422                                  strcpy( tmoji, fi_name );
   423                                  strcat( tmoji, name );
   424                                  len = strlen( tmoji );
   425                                  tmoji[ len ] = '\\';
   426                                  tmoji[ len+1 ] = 0;
   427                                  dir_sh( flg, tmoji );           /*  ファイル検索     */
   428                                  setdta( segregs.ds, (unsigned)buf );
   429                          }else{
   430                                  if( name[0] != '.' ){
   431                                          strcat( name, ".***" );
   432                                          if( flg != 0 ){
   433                                                  ret = chek_fname( name, flg );  /* 2重登録のチェック */
   434                                                  if( ret == 0 ){
   435                                                          put_filename( name, time, flg ); /* ファイル名 時間 を配列に */
   436                                                          FCNT++;
   437                                                  }
   438                                          }else{
   439                                                  file_chek( name, time );  /* 配列のファイルと比較 */
   440                                          }
   441                                  }
   442                          }
   443                  }
   444          }
   445  }
   446  
   447                                  /* ***************************** */
   448                                  /* ファイル名・二重登録のチェック*/
   449                                  /* ***************************** */
   450  
   451  int chek_fname( name, flg )
   452  char      name[];
   453  int       flg;
   454  {
   455  int       i;
   456  char      dum[20];
   457  
   458          for( i = 0 ; i < FCNT ; i++ ){
   459                  if( flg == 1 ){
   460                          strcpy( dum, reca[i].FNAME );
   461                  }else{
   462                          strcpy( dum, recb[i].FNAME );
   463                  }
   464                  if( 0 == strcmp( name, dum )){
   465                          return( 1 );
   466                  }
   467          }
   468  return( 0 );
   469  }
   470  
   471                                  /* *************************** */
   472                                  /*   ファイル情報を構造体へ    */
   473                                  /* *************************** */
   474  
   475  int put_filename( name, time, flg )
   476  char      name[], time[];
   477  int       flg;
   478  {
   479  int       ret;
   480  
   481          ret = 0;
   482          if( flg == 1 ){
   483                  strcpy( reca[FCNT].FNAME, name );
   484                  strcpy( reca[FCNT].TIME, time );
   485          }else{
   486                  strcpy( recb[FCNT].FNAME, name );
   487                  strcpy( recb[FCNT].TIME, time );
   488          }
   489  return( ret );
   490  }
   491  
   492                                  /* *************************** */
   493                                  /*       拡張子を配列へ        */
   494                                  /* *************************** */
   495  
   496  int KNAME_put()
   497  {
   498  int       ret, i, j, flg, len, k, tflg, flg2;
   499  char      kname[50], dum[50];
   500  
   501          ret = 0;
   502          for( i = 0 ; i < FCNT ; i++ ){
   503                  flg = 0;
   504                  strcpy( dum, reca[i].FNAME );
   505                  len = strlen( dum );
   506                  for( j = len-1 ; j >= 0 ; j-- ){
   507                          tflg = 0;
   508                          if( dum[j] == '.' ){
   509                                  if( j != len-1 ){
   510                                          strcpy( kname, "*" );
   511                                          strcat( kname, &dum[j] );
   512                                          flg = 1;
   513                                          break;
   514                                  }else{
   515                                          break;
   516                                  }
   517                          }
   518                  }
   519                  if( flg == 1 ){
   520                          flg2 = 0;
   521                          for( k = 0 ; k < KCNT ; k++ ){
   522                                  if( 0 == strcmp( DIRNAME[k], kname ))flg2 = 1;
   523                          }
   524                          if( flg2 == 0 ){
   525                                  strcpy( DIRNAME[KCNT], kname );
   526                                  KCNT++;
   527                          }
   528                  }
   529          }
   530          if( KCNT <= 0 )ret = 1;
   531  return( ret );
   532  }
   533  
   534                                  /* *************************** */
   535                                  /*       拡張子の表示          */
   536                                  /* *************************** */
   537  
   538  int KNAME_dsp( flg )
   539  int     flg;
   540  {
   541  int      ret, len, i, ff, j, tt;
   542  char     moji[80], dat[20];
   543  
   544          if( flg == 0){
   545                  printf("\n    バックアップ元 には、 %d 個 のファイルが", FCNT );
   546                  printf("\n    登録されています。\n");
   547                  printf("\n    下記の拡張子が登録されています。" );
   548                  printf("バックアップチェックする" );
   549                  printf("\n    拡張子を番号で選択して下さい。" );
   550          }
   551          printf("\n\n      ");
   552          for( i = 0 ; i < KCNT ; i++ ){
   553                  itoa( i+1, moji, 10 );
   554                  tt = strlen( moji );
   555                  if( tt == 1 ){
   556                          dat[0] = ' ';
   557                          dat[1] = moji[0];
   558                          dat[2] = 0;
   559                  }else{
   560                          strcpy( dat, moji );
   561                  }
   562                  if( flg == 0 )printf( "%s: ", dat );
   563                  if( flg == 1 )printf( "    ");
   564                  if( 0 == strcmp( DIRNAME[i], "*.***" )){
   565                          printf( "%s", "拡張子ナシ" );
   566                          len = 8;
   567                  }else{
   568                          printf( "%s", DIRNAME[i] );
   569                          len = strlen( DIRNAME[i] );
   570                  }
   571                  ff = 14 - len;
   572                  for( j = 0 ; j < ff ; j++ )printf(" ");
   573                  if( 0 == (i+1)%4 ){
   574                          printf("\n      ");
   575                  }
   576          }
   577          printf("\n");
   578          if( flg == 0 )printf("\n   [例]CHECK = 1,2,6,7   CHECK = ALL ( 全拡張子)" );
   579  }
   580  
   581                                  /* **************************** */
   582                                  /* recb より ファイル情報の取得 */
   583                                  /* **************************** */
   584  
   585  int fd_fd_chk( cnt )
   586  int     cnt;
   587  {
   588  int     i;
   589  char    name[50], time[20];
   590  
   591          for( i = 0 ; i < cnt ; i++ ){
   592                  strcpy( name, recb[i].FNAME );
   593                  strcpy( time, recb[i].TIME );
   594                  file_chek( name, time );
   595          }
   596  }
   597  
   598                                  /* *************************** */
   599                                  /*       拡張子 の 選択        */
   600                                  /* *************************** */
   601  
   602  int KNAME_inp()
   603  {
   604  int     ret;
   605  char    data[100];
   606  
   607          while( 1 ){
   608                  printf("\n\n  CHECK = " );
   609                  gets( data );
   610                  ret = data_chek( data );
   611                  if( ret != 0 ){
   612                          printf("\n  入力に誤りがあります。");
   613                  }else{
   614                          break;
   615                  }
   616          }
   617  }
   618  
   619                                  /* *************************** */
   620                                  /*      拡張子 の チェック     */
   621                                  /* *************************** */
   622  
   623  data_chek( data )
   624  char       data[];
   625  {
   626  int    len, i, cnt, fflen, a, j, flg;
   627  char   d1[80], d2[80];
   628  char   dummy[200][10];
   629  char   dummy2[200][10];
   630  
   631          len = strlen( data );
   632          flg = 0;
   633          for( j = 0 ; j < len ; j++ ){
   634                  if( data[j] != ' ' )flg = 1;
   635          }
   636          if( flg == 0 )return( -1 );
   637          if( 0 == strcmpi( data , "ALL" ))return( 0 );  /* ALL の場合 */
   638          strcpy( d1, data );
   639          cnt = fflen = 0;
   640          for( i = 0 ; i < len ; i++ ){
   641                  if( d1[cnt] == ',' ){
   642                          if( cnt == 0 )return( -1 );
   643                          strcpy( d2, d1 );
   644                          d1[cnt] = 0;
   645                          strcpy( dummy[fflen], d1 );
   646                          strcpy( d1, &d2[cnt]+1 );
   647                          fflen++;
   648                          cnt = -1;
   649                  }
   650                  cnt++;
   651          }
   652          if( cnt != 0 ){
   653                  strcpy( dummy[fflen], d1 );
   654                  fflen++;
   655          }
   656          for( i = 0 ; i < fflen ; i++ ){
   657                  a = atoi( dummy[i] );
   658                  if( KCNT < a || a <= 0 )return( -1 );
   659                  strcpy( dummy2[i], DIRNAME[a-1] );
   660          }
   661          KCNT = 0;
   662          for( i = 0 ; i < fflen ; i++ ){
   663                  KCNT++;
   664                  strcpy( DIRNAME[i], dummy2[i] );
   665          }
   666  return( 0 );
   667  }
   668  
   669                                  /* ***************************** */
   670                                  /* ファイル名と作成日付のチェック*/
   671                                  /* ***************************** */
   672  
   673  file_chek( name, time )
   674  char    name[], time[];
   675  {
   676  int     i, flg, j, len;
   677  char    dum[100], dum1[100], moji[50];
   678  
   679          flg = 0;
   680          for( i = 0 ; i < KCNT ; i++ ){
   681                  strcpy( dum, &DIRNAME[i][1] );
   682                  len = strlen( name );
   683                  if( len != 0 ){
   684                          for( j = len-1 ; j >= 0 ; j-- ){
   685                                  if( name[j] == '.' ){
   686                                          strcpy( moji, &name[j] );
   687                                          break;
   688                                  }
   689                          }
   690                          if( strlen( moji ) == strlen( dum ) ){
   691                                  if( NULL != strstr( name, dum )){
   692                                          flg = 1;
   693                                          break;
   694                                  }
   695                          }
   696                  }
   697          }
   698          if( flg == 0 )return;
   699          for( i = 0 ; i < FCNT ; i++ ){
   700                  flg = 0;
   701                  strcpy( dum, reca[i].FNAME );
   702                  if( 0 == strcmp( dum, name )){
   703                          strcpy( dum, reca[i].TIME );
   704                          if( 0 == strcmp( dum, time )){
   705                                  reca[i].FLG[0] = '*';
   706                          }else{
   707                                  reca[i].FLG[0] = '*';
   708                                  error_mess( 0, 1, name );
   709                          }
   710                          flg = 1;
   711                          break;
   712                  }
   713          }
   714          if( flg == 0 ){
   715                  error_mess( 0, 2, name );
   716          }
   717  }
   718  
   719                                  /* ********************************** */
   720                                  /* バックアップ元にないファイルを探す */
   721                                  /* ********************************** */
   722  
   723  file_chek2()
   724  {
   725  int     i, j, flg, len, k;
   726  char    dum[100], dum1[100], name[100], moji[100];
   727  
   728          for( i = 0 ; i < FCNT ; i++ ){
   729                  if( reca[i].FLG[0] != '*' ){
   730                          strcpy( name, reca[i].FNAME );
   731                          for( j = 0 ; j < KCNT ; j++ ){
   732                                  strcpy( dum, &DIRNAME[j][1] );
   733                                  len = strlen( name );
   734                                  if( len != 0 ){
   735                                          for( k = len-1 ; k >= 0 ; k-- ){
   736                                                  if( name[k] == '.' ){
   737                                                          strcpy( moji, &name[k] );
   738                                                          break;
   739                                                  }
   740                                          }
   741                                          if( strlen( moji ) == strlen( dum ) ){
   742                                                  if( NULL != strstr( name, dum )){
   743                                                          error_mess( 1, 0, name );
   744                                                  }
   745                                          }
   746                                  }
   747                          }
   748                  }
   749          }
   750  }
   751  
   752                                  /* *************************** */
   753                                  /*   エラーメッセージの表示    */
   754                                  /* *************************** */
   755  
   756  error_mess( type, erflg, fname )
   757  int    type, erflg;
   758  char   fname[];
   759  {
   760  int    ch, len;
   761  
   762          if( NULL != strstr( fname,".***")){
   763                  len = strlen( fname );
   764                  fname[len-4] = 0;
   765          }
   766          if( type == 0 ){
   767                  if( erflg == 1 ){
   768                          printf("\n %s のファイルが、時間に相違があります。\n", fname );
   769                  }else{
   770                          if( DFLG == 0x10 ){
   771                                  printf("\n %s のファイルが %s にはありません。\n", fname, B_DRIVE );
   772                          }else{
   773                                  printf("\n %s のファイルが %s にはありません。\n", fname, A_DRIVE );
   774                          }
   775                  }
   776          }else{
   777                  if( DFLG == 0x10 ){
   778                          printf("\n %s のファイルが %s にはありません。\n", fname, A_DRIVE );
   779                  }else{
   780                          printf("\n %s のファイルが %s にはありません。\n", fname, B_DRIVE );
   781                  }
   782          }
   783          if( ERCNT == 0 )ERCNT = 10;
   784          ERCNT++;
   785          if( ERCNT > 19 ){
   786                  printf("\n 処理続行 = [改行] 処理中止 = [その他]\n" );
   787                  printf("\nINPUT KEY > ");
   788                  ch = getch();
   789                  printf("\n");
   790                  if( ch != 13 ){
   791                          exit( 1 );
   792                  }else{
   793                          ERCNT = 10;
   794                  }
   795          }
   796  }
   797  
   798                                  /* *************************** */
   799                                  /*      ディレクトリ関数       */
   800                                  /* *************************** */
   801  
   802  setdta( dseg, doff )
   803  int     dseg, doff;
   804  {
   805          inregs.h.ah = 0x1a;
   806          segregs.ds  = dseg;
   807          inregs.x.dx = doff;
   808          intdosx( &inregs, &outregs, &segregs );
   809  }
   810  
   811  int search( fname )
   812  char    *fname;
   813  {
   814          segread( &segregs );
   815          inregs.h.ah = 0x4e;
   816          inregs.x.dx = (unsigned) fname;
   817          inregs.x.cx = 0x16;
   818          intdosx( &inregs, &outregs, &segregs );
   819          if( outregs.h.al != 0 )return( 0 );
   820          return( ! outregs.x.cflag );
   821  }
   822  
   823  int next()
   824  {
   825          segread( &segregs );
   826          inregs.h.ah = 0x4f;
   827          intdosx( &inregs, &outregs, &segregs );
   828          if( outregs.h.al != 0 )return( 0 );
   829          return( ! outregs.x.cflag );
   830  }

私がこのプログラムの問題点をリストアップするとき、A4用紙を横にして、左右2段に小さめ の字で出力し、きれいな地球を守っているのです。そして、取り上げるべき問題点を赤で書き込ん でいたのですが、このプログラムはあまりの問題点の多さに、左側半分だけの1段組にして、右半 分を完全な白紙にしてしまいました。

とにかく、問題だらけなのです。いっぱいあり過ぎて困りますが、重要なもの、今まで説明して いないものから順に説明していきます。ただし、今回はあまりに問題点だらけで、説明半ばにして 私の持久力が尽きると思いますので、その点は了解してください。


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