예제 #1
0
파일: nomad.c 프로젝트: eddie/clearn
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;
}
예제 #2
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 */
}