その他にもいろいろ問題がありました。とくに、「努力の文字処理、ご苦労さま。」という感じ です。
もう疲れてきたので、不思議な文字列処理は読者自身でご検討ください。その他も変更していま すが、修正プログラム(リスト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 /********************************************************************************/ |