int main() { nd_file file; create_pack(&file); add_file(&file,"a.out"); add_file(&file,"test.txt"); write_pack(&file,"out.p"); free_pack(&file); nd_file x = {0}; read_pack(&x,"out.p"); //dump_pack(&x); extract_file(&x,"test.txt","test.xxx"); free_pack(&x); return 0; }
void restore(char *fname) { FILE *fp = { NULL }; /* 未初期化変数の使用の警告除去のため NULL で初期化 */ struct rogue_time saved_time, mod_time; char buf[4]; char tbuf[40]; int new_file_id, saved_file_id; #if !defined( ORIGINAL ) if (org_dir && *org_dir) { chdir(org_dir); } #endif /* ORIGINAL */ if (((new_file_id = md_get_file_id(fname)) == -1) || ((fp = fopen(fname, "rb")) == NULL)) { #if defined( JAPAN ) clean_up("ファイルがオープンできませんでした。"); #else /* not JAPAN */ clean_up("Cannot open file"); #endif /* not JAPAN */ } if (md_link_count(fname) > 1) { #if defined( JAPAN ) clean_up("ファイルはリンクされています。"); #else /* not JAPAN */ clean_up("File has link"); #endif /* not JAPAN */ } (void) xxx(1); r_read(fp, (char *) &detect_monster, sizeof(detect_monster)); r_read(fp, (char *) &cur_level, sizeof(cur_level)); r_read(fp, (char *) &max_level, sizeof(max_level)); read_string(hunger_str, fp); (void) strcpy(tbuf, login_name); read_string(login_name, fp); if (strcmp(tbuf, login_name)) { #if defined( JAPAN ) clean_up("セーブファイルの持ち主が違います。"); #else /* not JAPAN */ clean_up("You're not the original player"); #endif /* not JAPAN */ } r_read(fp, (char *) &party_room, sizeof(party_room)); r_read(fp, (char *) &party_counter, sizeof(party_counter)); read_pack(&level_monsters, fp, 0); read_pack(&level_objects, fp, 0); r_read(fp, (char *) &saved_file_id, sizeof(saved_file_id)); if (new_file_id != saved_file_id) { #if defined( JAPAN ) clean_up("これは元のセーブファイルではありません。"); #else /* not JAPAN */ clean_up("Sorry, saved game is not in the same file"); #endif /* not JAPAN */ } rw_dungeon(fp, 0); r_read(fp, (char *) &foods, sizeof(foods)); r_read(fp, (char *) &rogue, sizeof(fighter)); read_pack(&rogue.pack, fp, 1); rw_id(id_potions, fp, POTIONS, 0); rw_id(id_scrolls, fp, SCROLS, 0); rw_id(id_wands, fp, WANDS, 0); rw_id(id_rings, fp, RINGS, 0); r_read(fp, (char *) traps, (MAX_TRAPS * sizeof(trap))); r_read(fp, (char *) is_wood, (WANDS * sizeof(boolean))); r_read(fp, (char *) &cur_room, sizeof(cur_room)); rw_rooms(fp, 0); r_read(fp, (char *) &being_held, sizeof(being_held)); r_read(fp, (char *) &bear_trap, sizeof(bear_trap)); r_read(fp, (char *) &halluc, sizeof(halluc)); r_read(fp, (char *) &blind, sizeof(blind)); r_read(fp, (char *) &confused, sizeof(confused)); r_read(fp, (char *) &levitate, sizeof(levitate)); r_read(fp, (char *) &haste_self, sizeof(haste_self)); r_read(fp, (char *) &see_invisible, sizeof(see_invisible)); r_read(fp, (char *) &detect_monster, sizeof(detect_monster)); r_read(fp, (char *) &wizard, sizeof(wizard)); r_read(fp, (char *) &score_only, sizeof(score_only)); r_read(fp, (char *) &m_moves, sizeof(m_moves)); r_read(fp, (char *) &saved_time, sizeof(saved_time)); if (fread(buf, sizeof(char), 1, fp) > 0) { clear(); #if defined( JAPAN ) clean_up("ファイル中によけいな文字があります。"); #else /* JAPAN */ clean_up("Extra characters in file"); #endif /* JAPAN */ } md_gfmt(fname, &mod_time); /* get file modification time */ if (has_been_touched(&saved_time, &mod_time)) { clear(); #if defined( JAPAN ) clean_up("ファイルが変更されています。"); #else /* not JAPAN */ clean_up("Sorry, file has been touched"); #endif /* not JAPAN */ } fclose(fp); if ((!wizard) && !md_df(fname)) { #if defined( JAPAN ) clean_up("ファイルを消すことができません。"); #else /* not JAPAN */ clean_up("Cannot delete file"); #endif /* not JAPAN */ } msg_cleared = 0; ring_stats(0); #if !defined( ORIGINAL ) if (game_dir && *game_dir) { chdir(game_dir); } #endif /* not ORIGINAL */ }