さて、フローチャートを理解したら、次はそれに基づいて作られたプログラムです。フローチャー トが分かればプログラムの理解は容易なはずですが、果たしてそうでしょうか。
だいぶ努力したつもりですが、私には、ほとんど意味不明なことばかりでした。
さあ、読者の方も、先を読み進む前に、リストをながめて、「変だ!?」とか、「エーッ」という ところをリストアップしてください。そして、どう変なのか、あるいは、修正を試みてください。
リスト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段組にして、右半 分を完全な白紙にしてしまいました。
とにかく、問題だらけなのです。いっぱいあり過ぎて困りますが、重要なもの、今まで説明して いないものから順に説明していきます。ただし、今回はあまりに問題点だらけで、説明半ばにして 私の持久力が尽きると思いますので、その点は了解してください。