#include #include #include #include #include #ifdef UNIX #include #include #include #endif #include "aplinks.h" static NAMELIST *top = NULL; long chg_make_dir(char *sdir, int mdir, int *last_fat_num, DIR_RANGE dir_range, unsigned char *dir_buffer[], FAT_RANGE fat_range, unsigned char *fat_buffer[], unsigned char *data_buffer[]) { int dirent_ds_num; int dirent_ds_bias; long dirent; int dirent_top_ds_num; int ndirent_ds_num; int i, j; int chg; char dirname[13]; int file_num; int dirsec_num; char fullpathname[MAX_DIR_LEN]; char fullpathname_tu[MAX_DIR_LEN]; char *dir; #ifdef UNIX char head[MAX_DIR_LEN]; #else char head[4]; #endif char topdir[MAX_DIR_LEN]; char org_topdir[MAX_DIR_LEN]; char nextdir[MAX_DIR_LEN]; unsigned int dateword, timeword; if((mdir == ON) && (haveto_chg(sdir) == 1)){ /* 本当の dir エントリを検索して、chg dir する */ dirent = 0; chg = 0; /* chg = 1 -> CD 成功。 */ /* chg = -1 -> CD 失敗。MD 実行 */ get_topdir(sdir, head, org_topdir, nextdir); sprintf(fullpathname, "%s%s", head, org_topdir); chk_get_Lname(fullpathname, org_topdir, topdir, mdir); /* strcpy(fullpathname, topdir); */ while(dirent < ((dir_range.end-dir_range.start+1) * SECTOR_SIZE)){ dirent_ds_num = (int)(dirent / SECTOR_SIZE); dirent_ds_bias= (int)(dirent % SECTOR_SIZE); if(*(dir_buffer[dirent_ds_num] + dirent_ds_bias) == 0x00){ chg = -1; break; } else if(*(dir_buffer[dirent_ds_num] + dirent_ds_bias) == 0xe5){ ; /* ファイル削除の痕跡。通常ここに処理は移らない。 */ } else{ if((*(dir_buffer[dirent_ds_num] + dirent_ds_bias + ATTR_OFFS) & DIR_ATTR) == DIR_ATTR){ /* dirname にディレクトリ名を取り出す */ j = 0; for(i = 0; i < 8; i++){ if(*(dir_buffer[dirent_ds_num]+dirent_ds_bias + i) == 0x20){ break; } dirname[j] = *(dir_buffer[dirent_ds_num]+dirent_ds_bias+i); j++; } if(*(dir_buffer[dirent_ds_num]+dirent_ds_bias + 8) != 0x20){ dirname[j] = '.'; j++; for(i = 0; i < 3; i++){ if(*(dir_buffer[dirent_ds_num]+dirent_ds_bias+8+i) == 0x20){ break; } dirname[j] = *(dir_buffer[dirent_ds_num]+dirent_ds_bias+8+i); } } dirname[j] = '\0'; if(strcmp(dirname, topdir) == 0){ /* topdir に CD する。 */ ndirent_ds_num = *(dir_buffer[dirent_ds_num]+dirent_ds_bias+FAT_HH); ndirent_ds_num = (ndirent_ds_num << 8) + *(dir_buffer[dirent_ds_num]+dirent_ds_bias+FAT_LL); dirent_ds_num = ndirent_ds_num - 2; dirent_ds_bias = 64; chg = 1; /* CD 成功 */ break; } } } dirent += 32; } /* ルートでの CD に失敗したとき、ルートにディレクトリを作る */ if(chg == -1){ /* CD に失敗 */ if(data_buffer[*(last_fat_num) - 2] == NULL){ displist_c_printf(2, "メモリを確保できなかったセクタにアクセスするため、\n"); displist_c_printf(2, "ディレクトリ %s を作れません。\n", topdir); return -1; } j = 0; for(i = 0; i < 8; i++){ if((topdir[j] != '\0') && (topdir[j] != '.')){ *(dir_buffer[dirent_ds_num] + dirent_ds_bias + i) = topdir[j]; j++; } else{ *(dir_buffer[dirent_ds_num]+dirent_ds_bias+i) = 0x20; } } if(topdir[j] == '.'){ /* ディレクトリ名に拡張子がある */ j++; } for(i = 0; i < 3; i++){ if(topdir[j] != '\0'){ *(dir_buffer[dirent_ds_num] + dirent_ds_bias + 8 + i) = topdir[j]; j++; } else{ *(dir_buffer[dirent_ds_num]+dirent_ds_bias+8+i) = 0x20; } } *(dir_buffer[dirent_ds_num]+dirent_ds_bias + ATTR_OFFS) = (DIR_ATTR | WRI_PROTECT); /* MS-DOS 形式でディレクトリのタイムスタンプをセット*/ get_filetime(fullpathname, &dateword, &timeword); *(dir_buffer[dirent_ds_num]+dirent_ds_bias + TIME_LL) = (timeword & 0x00ff); *(dir_buffer[dirent_ds_num]+dirent_ds_bias + TIME_HH) = (timeword >> 8); *(dir_buffer[dirent_ds_num]+dirent_ds_bias + DATE_LL) = (dateword & 0x00ff); *(dir_buffer[dirent_ds_num]+dirent_ds_bias + DATE_HH) = (dateword >> 8); /* ディレクトリのファイルサイズは 0 にしておく。 */ *(dir_buffer[dirent_ds_num]+dirent_ds_bias + FILESIZE_LL) = 0; *(dir_buffer[dirent_ds_num]+dirent_ds_bias + FILESIZE_MM) = 0; *(dir_buffer[dirent_ds_num]+dirent_ds_bias + FILESIZE_HH) = 0; *(dir_buffer[dirent_ds_num] + dirent_ds_bias + FAT_LL) = (*(last_fat_num) & 0xff); *(dir_buffer[dirent_ds_num] + dirent_ds_bias + FAT_HH) = (*(last_fat_num) >> 8); /* '.' ディレクトリを作る。 */ set_dirent_info(data_buffer[*(last_fat_num) - 2], 0, ".", " ", DIR_ATTR | WRI_PROTECT); /* MS-DOS 形式でディレクトリのタイムスタンプをセット*/ sprintf(fullpathname_tu, "%s%c%s", fullpathname, DIR_DELIM, "."); get_filetime(fullpathname_tu, &dateword, &timeword); *(data_buffer[*(last_fat_num) - 2] + 0 + TIME_LL) = (timeword & 0x00ff); *(data_buffer[*(last_fat_num) - 2] + 0 + TIME_HH) = (timeword >> 8); *(data_buffer[*(last_fat_num) - 2] + 0 + DATE_LL) = (dateword & 0x00ff); *(data_buffer[*(last_fat_num) - 2] + 0 + DATE_HH) = (dateword >> 8); /* ディレクトリのファイルサイズは 0 にしておく。 */ *(data_buffer[*(last_fat_num) - 2] + 0 + FILESIZE_LL) = 0; *(data_buffer[*(last_fat_num) - 2] + 0 + FILESIZE_MM) = 0; *(data_buffer[*(last_fat_num) - 2] + 0 + FILESIZE_HH) = 0; /* 自分自身のディレクトリエントリの FAT 番号 */ *(data_buffer[*(last_fat_num) - 2] + 0 + FAT_LL) = (*(last_fat_num) & 0xff); *(data_buffer[*(last_fat_num) - 2] + 0 + FAT_HH) = (*(last_fat_num) >> 8); /* '..' ディレクトリを作る。 */ set_dirent_info(data_buffer[*(last_fat_num) - 2], 32, "..", " ", DIR_ATTR | WRI_PROTECT); /* MS-DOS 形式でディレクトリのタイムスタンプをセット*/ sprintf(fullpathname_tu, "%s%c%s", fullpathname, DIR_DELIM, ".."); get_filetime(fullpathname, &dateword, &timeword); *(data_buffer[*(last_fat_num) - 2] + 32 + TIME_LL) = (timeword & 0x00ff); *(data_buffer[*(last_fat_num) - 2] + 32 + TIME_HH) = (timeword >> 8); *(data_buffer[*(last_fat_num) - 2] + 32 + DATE_LL) = (dateword & 0x00ff); *(data_buffer[*(last_fat_num) - 2] + 32 + DATE_HH) = (dateword >> 8); /* ディレクトリのファイルサイズは 0 にしておく。 */ *(data_buffer[*(last_fat_num) - 2] + 32 + FILESIZE_LL) = 0; *(data_buffer[*(last_fat_num) - 2] + 32 + FILESIZE_MM) = 0; *(data_buffer[*(last_fat_num) - 2] + 32 + FILESIZE_HH) = 0; /* ルートにあるディレクトリの親ディレクトリ(..) は FAT 番号 0 を指していなければならない。 (0 のとき、DS は 本物のディレクトリエントリを 読みに行く?) */ *(data_buffer[*(last_fat_num) - 2] + 32 + FAT_LL) = 0; *(data_buffer[*(last_fat_num) - 2] + 32 + FAT_HH) = 0; /*dir エントリ(DATA セクタにある)の '..' の次を指すようにする*/ dirent_ds_num = (*(last_fat_num) - 2); dirent_ds_bias = 64; /* 雑な実装だけど(^^; ディレクトリエントリの大きさを先に設定してしまう。*/ /* ディレクトリエントリのセクタ数を求めるために、 ディレクトリ内のファイル数を数える */ if((file_num = count_file(fullpathname)) == -1){ return -1; /* ここに処理が移ることは、まず、ない。 */ } dirsec_num = ((file_num - 1) / (SECTOR_SIZE / 32)) + 1; dirsec_num--; while(dirsec_num){ if(data_buffer[*(last_fat_num) - 1] == NULL){ displist_c_printf(2, "L: の容量が足りないので、ディレクトリ %s は不完全ですが、強行します。\n", topdir); put_fat(*(last_fat_num), 0xff0, fat_buffer, fat_range); return -1; } put_fat(*(last_fat_num), (*(last_fat_num) + 1), fat_buffer, fat_range); (*(last_fat_num))++; dirsec_num--; } put_fat(*(last_fat_num), 0xff0, fat_buffer, fat_range); (*(last_fat_num))++; } /* サブディレクトリ検索 */ while(1){ if(strcmp(nextdir, "") == 0){ break; } dir = nextdir; get_topdir(dir, head, org_topdir, nextdir); *(fullpathname + strlen(fullpathname) + 1) = '\0'; *(fullpathname + strlen(fullpathname)) = DIR_DELIM; strcat(fullpathname, org_topdir); chk_get_Lname(fullpathname, org_topdir, topdir, mdir); chg = 0; /* 1 -> CD 成功。-1 -> CD 失敗。 */ dirent = (long)dirent_ds_num * SECTOR_SIZE; dirent += dirent_ds_bias; dirent_top_ds_num = dirent_ds_num; /*'..'dirを作るときに必要*/ while(1){ dirent_ds_num = (int)(dirent / SECTOR_SIZE); dirent_ds_bias= (int)(dirent % SECTOR_SIZE); if(data_buffer[dirent_ds_num] == NULL){ ; /* メモリを確保できなかったセクタ */ } else if(*(data_buffer[dirent_ds_num]+dirent_ds_bias) == 0x00){ chg = -1; /* CD 失敗 */ break; } else if(*(data_buffer[dirent_ds_num]+dirent_ds_bias) ==0xe5){ ; /* ファイル削除の痕跡。 通常、ここに処理が移ることはない。*/ } else{ if((*(data_buffer[dirent_ds_num]+dirent_ds_bias+ATTR_OFFS) & DIR_ATTR) == DIR_ATTR){ /* dirname にディレクトリ名を取り出す */ j = 0; for(i = 0; i < 8; i++){ if(*(data_buffer[dirent_ds_num]+dirent_ds_bias+i) != 0x20){ dirname[j] = *(data_buffer[dirent_ds_num]+dirent_ds_bias+i); j++; } else{ break; } } /* ディレクトリ名に拡張子がある */ if(*(data_buffer[dirent_ds_num]+dirent_ds_bias+8) != 0x20){ dirname[j] = '.'; j++; for(i = 0; i < 3; i++){ if(*(data_buffer[dirent_ds_num]+dirent_ds_bias+8+i) != 0x20){ dirname[j] = *(data_buffer[dirent_ds_num]+dirent_ds_bias+8+i); j++; } else{ break; } } } dirname[j] = '\0'; if(strcmp(dirname, topdir) == 0){ /* sub dir に CD する */ ndirent_ds_num = *(data_buffer[dirent_ds_num]+dirent_ds_bias+FAT_HH); ndirent_ds_num = (ndirent_ds_num << 8) + *(data_buffer[dirent_ds_num]+dirent_ds_bias+FAT_LL); /* sub dir の dir エントリ(DATA セクタにある) の '..' の次を指すようにする。 */ dirent_ds_num = ndirent_ds_num - 2; dirent_ds_bias = 64; chg = 1; /* CD 成功 */ break; } } } dirent += 32; if((dirent % SECTOR_SIZE) == 0){ ndirent_ds_num = get_fat(dirent_ds_num+2, fat_buffer); if(ndirent_ds_num == 0xff0){ chg = -1; /* CD 失敗 */ break; } else{ dirent_ds_num = ndirent_ds_num - 2; dirent = (long)dirent_ds_num * SECTOR_SIZE; dirent_ds_bias = 0; } } } /* sub dir への CD に失敗したときは、ディレクトリを作る */ if(chg == -1){ if(data_buffer[*(last_fat_num) - 2] == NULL){ displist_c_printf(2, "メモリを確保できなかったセクタにアクセスするため、\n"); displist_c_printf(2, "ディレクトリ %s を作れません。\n", topdir); return -1; } j = 0; for(i = 0; i < 8; i++){ if((topdir[j] != '\0') && (topdir[j] != '.')){ *(data_buffer[dirent_ds_num]+dirent_ds_bias+i) = topdir[j]; j++; } else{ *(data_buffer[dirent_ds_num]+dirent_ds_bias+i) = 0x20; } } /* ディレクトリ名に拡張子がある。 */ if(topdir[j] == '.'){ j++; } for(i = 0; i < 3; i++){ if(topdir[j] != '\0'){ *(data_buffer[dirent_ds_num]+dirent_ds_bias+8+i) = topdir[j]; j++; } else{ *(data_buffer[dirent_ds_num]+dirent_ds_bias+8+i) = 0x20; } } *(data_buffer[dirent_ds_num]+dirent_ds_bias+ATTR_OFFS) = (DIR_ATTR | WRI_PROTECT); /* MS-DOS 形式でタイムスタンプをセット */ get_filetime(fullpathname, &dateword, &timeword); *(data_buffer[dirent_ds_num]+dirent_ds_bias + TIME_LL) = (timeword & 0x00ff); *(data_buffer[dirent_ds_num]+dirent_ds_bias + TIME_HH) = (timeword >> 8); *(data_buffer[dirent_ds_num]+dirent_ds_bias + DATE_LL) = (dateword & 0x00ff); *(data_buffer[dirent_ds_num]+dirent_ds_bias + DATE_HH) = (dateword >> 8); /* dir のファイルサイズは 0 とする。 */ *(data_buffer[dirent_ds_num]+dirent_ds_bias+FILESIZE_LL)=0; *(data_buffer[dirent_ds_num]+dirent_ds_bias+FILESIZE_MM)=0; *(data_buffer[dirent_ds_num]+dirent_ds_bias+FILESIZE_HH)=0; *(data_buffer[dirent_ds_num]+dirent_ds_bias + FAT_LL) = (*(last_fat_num) & 0xff); *(data_buffer[dirent_ds_num]+dirent_ds_bias + FAT_HH) = (*(last_fat_num) >> 8); /* '.' ディレクトリを作る */ set_dirent_info(data_buffer[*(last_fat_num) - 2], 0, ".", " ", DIR_ATTR | WRI_PROTECT); /* MS-DOS 形式でディレクトリのタイムスタンプをセット*/ sprintf(fullpathname_tu, "%s%c%s", fullpathname, DIR_DELIM, "."); get_filetime(fullpathname_tu, &dateword, &timeword); *(data_buffer[*(last_fat_num) - 2] + 0 + TIME_LL) = (timeword & 0x00ff); *(data_buffer[*(last_fat_num) - 2] + 0 + TIME_HH) = (timeword >> 8); *(data_buffer[*(last_fat_num) - 2] + 0 + DATE_LL) = (dateword & 0x00ff); *(data_buffer[*(last_fat_num) - 2] + 0 + DATE_HH) = (dateword >> 8); /* ディレクトリのファイルサイズは 0 にしておく。 */ *(data_buffer[*(last_fat_num) - 2] + 0 + FILESIZE_LL) = 0; *(data_buffer[*(last_fat_num) - 2] + 0 + FILESIZE_MM) = 0; *(data_buffer[*(last_fat_num) - 2] + 0 + FILESIZE_HH) = 0; /* 自分自身のディレクトリエントリの FAT 番号 */ *(data_buffer[*(last_fat_num) - 2] + 0 + FAT_LL) = (*(last_fat_num) & 0xff); *(data_buffer[*(last_fat_num) - 2] + 0 + FAT_HH) = (*(last_fat_num) >> 8); /* '..' ディレクトリを作る。 */ set_dirent_info(data_buffer[*(last_fat_num) - 2], 32, "..", " ", DIR_ATTR | WRI_PROTECT); /* MS-DOS 形式でディレクトリのタイムスタンプをセット*/ sprintf(fullpathname_tu, "%s%c%s", fullpathname, DIR_DELIM, ".."); get_filetime(fullpathname_tu, &dateword, &timeword); *(data_buffer[*(last_fat_num) - 2] + 32 + TIME_LL) = (timeword & 0x00ff); *(data_buffer[*(last_fat_num) - 2] + 32 + TIME_HH) = (timeword >> 8); *(data_buffer[*(last_fat_num) - 2] + 32 + DATE_LL) = (dateword & 0x00ff); *(data_buffer[*(last_fat_num) - 2] + 32 + DATE_HH) = (dateword >> 8); /* ディレクトリのファイルサイズは 0 にしておく。 */ *(data_buffer[*(last_fat_num) - 2] + 32 + FILESIZE_LL) = 0; *(data_buffer[*(last_fat_num) - 2] + 32 + FILESIZE_MM) = 0; *(data_buffer[*(last_fat_num) - 2] + 32 + FILESIZE_HH) = 0; /* 親ディレクトリのディレクトリエントリの先頭の FAT 番号を指していなければならない。 */ *(data_buffer[*(last_fat_num) - 2] + 32 + FAT_LL) = (dirent_top_ds_num + 2) & 0xff; *(data_buffer[*(last_fat_num) - 2] + 32 + FAT_HH) = ((dirent_top_ds_num + 2) >> 8); /* dir エントリ(DATA セクタにある)の '..' の次を 指すようにする。 */ dirent_ds_num = *(last_fat_num) - 2; dirent_ds_bias = 64; /* 雑な実装だけど(^^; ディレクトリエントリの大きさを先に設定してしまう。*/ /* ディレクトリエントリのセクタ数を求めるために、 ディレクトリ内のファイル数を数える */ if((file_num = count_file(fullpathname)) == -1){ return -1; /* 通常、ここに処理が移ることは、ない。 */ } dirsec_num = ((file_num - 1) / (SECTOR_SIZE / 32)) + 1; dirsec_num--; while(dirsec_num){ if(data_buffer[*(last_fat_num) - 1] == NULL){ displist_c_printf(2, "L: の容量が足りないので、ディレクトリ %s は不完全ですが、強行します。\n", topdir); put_fat(*(last_fat_num - 1), 0xff0, fat_buffer, fat_range); return -1; } put_fat(*(last_fat_num), (*(last_fat_num) + 1), fat_buffer, fat_range); (*(last_fat_num))++; dirsec_num--; } put_fat(*(last_fat_num), 0xff0, fat_buffer, fat_range); (*(last_fat_num))++; } } } else{ /* mdir == OFF || sdir が ""(CD する必要がない) */ dirent = 0; while(1){ dirent_ds_num = (int)(dirent / SECTOR_SIZE); dirent_ds_bias= (int)(dirent % SECTOR_SIZE); if(*(dir_buffer[dirent_ds_num] + dirent_ds_bias) == 0x00){ return dirent; } dirent += 32; if(dirent >= ((dir_range.end-dir_range.start+1)*SECTOR_SIZE)){ displist_c_printf(2, "ディレクトリエントリに空きがありませんのでファイルを読み込めません。\n"); return -1; } } } while(1){ if(*(data_buffer[dirent_ds_num] + dirent_ds_bias) == 0x00){ dirent = ((long)dirent_ds_num * SECTOR_SIZE) + dirent_ds_bias; break; } dirent_ds_bias += 32; if((dirent_ds_bias % SECTOR_SIZE) == 0){ ndirent_ds_num = get_fat(dirent_ds_num + 2, fat_buffer); if(ndirent_ds_num == 0xff0){ displist_c_printf(2, "ディレクトリエントリに空きがありませんのでファイルを読み込めません。\n"); return -1; } dirent_ds_num = (ndirent_ds_num - 2); dirent_ds_bias = 0; } } return dirent; } int get_topdir(char *org_dir, char head[], char *topdir, char *nextdir) { int i; char *nextdir_top; char *dir; #if 0 #ifdef UNIX char real_org_dir[MAXPATHLEN]; /* char cur_dir_name[MAX_DIR_LEN]; */ char *homedir; int len, len1, len2; #endif #endif dir = org_dir; strcpy(head, ""); #ifndef UNIX if(*(dir + 1) == ':'){ head[0] = *(dir); head[1] = *(dir + 1); head[2] = '\0'; if(*(dir + 2) == DIR_DELIM){ head[2] = *(dir + 2); head[3] = '\0'; dir += 3; } else{ head[2] = '\0'; dir += 2; } } #else #if 0 realpath(org_dir, real_org_dir); /* getcwd(cur_dir_name, MAX_DIR_LEN); */ homedir = getenv("HOME"); len = ((len1 = strlen(homedir)) < (len2 = strlen(real_org_dir))) ? len1 : len2; if(strncmp(real_org_dir, homedir, len) == 0){ for(i = 0; i < len; i++){ head[i] = real_org_dir[i]; } head[i] = '\0'; dir = &real_org_dir[i]; } else{ dir = org_dir; } #endif if(*(dir) == DIR_DELIM){ head[0] = *(dir); head[1] = '\0'; dir++; } else{ head[0] = '\0'; } #endif if((nextdir_top = strchr(dir, DIR_DELIM)) == NULL){ strcpy(topdir, dir); strcpy(nextdir, ""); } else{ for(i = 0; i < strlen(dir); i++){ if((dir + i) == nextdir_top){ *(topdir + i) = '\0'; break; } *(topdir + i) = *(dir + i); } nextdir_top++; i = 0; while(1){ *(nextdir + i) = *(nextdir_top + i); if(*(nextdir_top + i) == '\0'){ break; } i++; } } return 0; } int chk_get_Lname(char org_fullpathname[], char org_name[], char Lname[], int mdir) { NAMELIST*cur; char org_dirname[MAX_DIR_LEN]; char org_drv_dirname[MAX_DIR_LEN]; char Ldirname[MAX_DIR_LEN]; char Lfullname[MAX_DIR_LEN]; char name8[13]; char drv[4]; if(top == NULL){ if((top = malloc(sizeof(NAMELIST))) == NULL){ displist_c_printf(2, "ファイル名チェックのためのメモリを確保できませんでした。\n"); return -1; } top->org_name = NULL; top->Lname = NULL; top->next = NULL; } if(mdir == ON){ cur = top; if(cur->org_name == NULL){ if(cur->next != NULL){ cur = cur->next; } } while(1){ if(cur->org_name != NULL){ if(strcmp(cur->org_name, org_fullpathname) == 0){ get_filename(cur->Lname, Lname); return 0; } } if(cur->next == NULL){ break; } else{ cur = cur->next; } } get_drv_dirname(org_fullpathname, drv, org_dirname); sprintf(org_drv_dirname, "%s%s", drv, org_dirname); cur = top; while(1){ if(cur->org_name != NULL){ if(strcmp(cur->org_name, org_drv_dirname) == 0){ strcpy(Ldirname, cur->Lname); break; } } if(cur->next == NULL){ to_name8(org_dirname, name8); strcpy(Ldirname, name8); break; } cur = cur->next; } to_name8(org_name, name8); if(strcmp(Ldirname, "") == 0){ strcpy(Lfullname, name8); } else{ sprintf(Lfullname, "%s%c%s", Ldirname, DIR_DELIM, name8); } cur = top; while(1){ if(cur->Lname != NULL){ if(strcmp(cur->Lname, Lfullname) == 0){ to_name_num(name8); if(strcmp(Ldirname, "") == 0){ strcpy(Lfullname, name8); } else{ strcpy(Lfullname, Ldirname); strcat(Lfullname, DIR_DELIM_STR); strcat(Lfullname, name8); /* sprintf(Lfullname, "%s%c%s", Ldirname, DIR_DELIM, name8);*/ } cur = top; } } if(cur->next == NULL){ break; } cur = cur->next; } } else{ to_name8(org_name, name8); cur = top; while(1){ if(cur->Lname != NULL){ if(strcmp(cur->Lname, name8) == 0){ to_name_num(name8); cur = top; continue; } } if(cur->next == NULL){ strcpy(Lfullname, name8); break; } else{ cur = cur->next; } } } if((cur->next = malloc(sizeof(NAMELIST))) == NULL){ displist_c_printf(2, "ファイル名チェックのためのメモリを確保できませんでした。\n"); return -1; } cur = cur->next; cur->next = NULL; if((cur->org_name = malloc(strlen(org_fullpathname) + 1)) == NULL){ displist_c_printf(2, "ファイル名チェックのためのメモリを確保できませんでした。\n"); return -1; } strcpy(cur->org_name, org_fullpathname); if((cur->Lname = malloc(strlen(Lfullname) + 1)) == NULL){ displist_c_printf(2, "ファイル名チェックのためのメモリを確保できませんでした。\n"); return -1; } strcpy(cur->Lname, Lfullname); strcpy(Lname, name8); return 0; } int to_name8(char org_name[], char name8[]) { int i, j; int org_idx; int ext_top; #ifdef UNIX if(org_name[0] == '.'){ org_idx = 1; } else{ org_idx = 0; } #else org_idx = 0; #endif for(i = 0; i < 8; i++){ if(org_name[org_idx + i] == '.'){ break; } name8[i] = org_name[org_idx + i]; if(org_name[org_idx + i] == '\0'){ return 0; } } if(org_name[org_idx + i] == '\0'){ name8[i] = '\0'; return 0; } for(ext_top = strlen(org_name); ext_top >= 0; ext_top--){ if(org_name[ext_top] == '.'){ break; } } if(ext_top == 0){ name8[i] = '\0'; return 0; } else{ ext_top++; name8[i] = '.'; i++; } for(j = 0; j < 3; j++){ if(org_name[ext_top + j] == '\0'){ break; } name8[i + j] = org_name[ext_top + j]; } name8[i + j] = '\0'; return 0; } int to_name_num(char *name8) { char filename[13]; int i, j; long num; char num_str[9]; int len; for(i = 0; i < 8; i++){ if((*(name8 + i) == '\0') || (*(name8 + i) == '.')){ break; } *(filename + i) = *(name8 + i); } *(filename + i) = '\0'; if(i < 8){ for(j = i;j < 7; j++){ *(filename + j) = '_'; } *(filename + j) = '0'; *(filename + j + 1) = '\0'; if(*(name8 + i) == '.'){ *(filename + 8) = '.'; i++; for(j = 0; j < 3; j++){ if(*(name8 + i + j) == '\0'){ break; } *(filename + 9 + j) = *(name8 + i + j); } *(filename + 9 + j) = '\0'; } strcpy(name8, filename); return 0; } if(*(name8 + i) == '.'){ i++; *(filename + 8) = '.'; for(j = 0; j < 3; j++){ if(*(name8 + i + j) == '\0'){ break; } *(filename + 9 + j) = *(name8 + i + j); } *(filename + 9 + j) = '\0'; } if(isdigit(*(filename + 7)) == 0){ *(filename + 7) = '0'; strcpy(name8, filename); return 0; } num = 0; for(i = 7; i >= 0; i--){ if(isdigit(*(filename + i)) == 0){ break; } num = (*(filename + i) - '0') * pow(10.0, (double)(i - 7)) + num; } num++; sprintf(num_str, "%ld", num); len = strlen(num_str); for(i = 0; i < len; i++){ *(filename + 7 - (len - 1) + i) = num_str[i]; } strcpy(name8, filename); return 0; } int free_namelist(void) { NAMELIST *tmp; while(top != NULL){ tmp = top->next; free(top->org_name); free(top->Lname); free(top); top = tmp; } return 0; } int haveto_chg(char *sdir) { #if 0 #ifdef UNIX char *homedir; #endif #endif if(strcmp(sdir, "") == 0){ return 0; } #if 0 #ifdef UNIX homedir = getenv("HOME"); if(strncmp(homedir, sdir, strlen(homedir)) == 0){ return 0; } #endif #endif if(*(sdir) == DIR_DELIM){ return 1; } #ifndef UNIX if((*(sdir + 1) == ':') && (strlen(sdir) <= 3)){ return 0; } #endif return 1; }