예제 #1
0
/*
 * Actually read the savefile
 */
static int rd_savefile_new_aux(void)
{
	u32b n_x_check, n_v_check;
	u32b o_x_check, o_v_check;

	/* Mention the savefile version */
	note(format("Loading a %d.%d.%d savefile...",
	            sf_major, sf_minor, sf_patch));

	/* Strip the version bytes */
	strip_bytes(4);

	/* Hack -- decrypt */
	xor_byte = sf_extra;


	/* Clear the checksums */
	v_check = 0L;
	x_check = 0L;


	/* Strip old data */
	strip_bytes(20);


	if (!get_check("If you import this savefile, object memory will be lost.  Is that OK? [y/n]"))
		return -1;



        if (rd_randomizer()) return -1;
        if (rd_options()) return -1;
        if (rd_messages()) return -1;
        if (rd_monster_memory()) return -1;
        if (rd_object_memory()) return -1;
        if (rd_quests()) return -1;
        if (rd_artifacts()) return -1;

        if (rd_player()) return -1;
        if (rd_squelch()) return -1;
        if (rd_misc()) return -1;       
        if (rd_player_hp()) return -1;
        if (rd_player_spells()) return -1;

        if (rd_randarts()) return -1;
        if (rd_inventory()) return -1;
        if (rd_stores()) return -1;
        
        if (rd_dungeon()) return -1;
        if (rd_objects()) return -1;
        if (rd_monsters()) return -1;
        if (rd_ghost()) return -1;

        if (rd_history()) return -1;


	/* Save the checksum */
	n_v_check = v_check;

	/* Read the old checksum */
	rd_u32b(&o_v_check);

	/* Verify */
	if (o_v_check != n_v_check)
	{
		note("Invalid checksum");
		return (-1);
	}

	/* Save the encoded checksum */
	n_x_check = x_check;

	/* Read the checksum */
	rd_u32b(&o_x_check);

	/* Verify */
	if (o_x_check != n_x_check)
	{
		note("Invalid encoded checksum");
		return (-1);
	}


	/* Hack -- no ghosts */
	r_info[z_info->r_max-1].max_num = 0;


	/* Success */
	return (0);
}
예제 #2
0
/*------------------------------------------------------------*/
PUBLIC void read_parameter_file(const char fname[])
{
  char    *line, ident[32];
  enum parset type;
  int      r, changed=0;

  if (!(fp=fopen(fname,"r"))) {
    fprintf(stderr,
	    "\nread_parameter_file:\n"
	    "\t\tcan't open file %s\n"
	    "\t\tusing default parameters instead.\n", fname);
    return;
  }

  if (!(line = get_line(fp))) {
    fprintf(stderr," File %s is inproper.\n", fname);
    fclose(fp);
    return;
  }

  if (strncmp(line,"## RNAfold parameter file",25)!=0) {
    fprintf(stderr,
	    "Missing header line in file.\n"
	    "May be this file has incorrect format.\n"
	    "Use INTERRUPT-key to stop.\n");
  }
  free(line);
  
  while((line=get_line(fp))) {
    
    r = sscanf(line, "# %31s", ident);
    if (r==1) {
      type = gettype(ident);
      switch (type)
	{
	case QUIT: break;
	case SH:     rd_stacks(enthalpies);    changed |= SH; break;
	case S:      rd_stacks(stack37);       changed |= S;  break;
	case HP:     rd_loop(hairpin37);       changed |= HP; break;
	case B:      rd_loop(bulge37);         changed |= B;  break;
	case IL:     rd_loop(internal_loop37); changed |= IL; break;
	case MMH:    rd_mismatch(mismatchH37); changed |= MMH; break;
	case MMI:    rd_mismatch(mismatchI37); changed |= MMI; break;
	case MMM:    rd_mismatch(mismatchM37); changed |= MMM; break;
	case MM_H:   rd_mismatch(mism_H);      changed |= MM_H; break;
	case INT11:  rd_int11(int11_37);       changed |= INT11; break;
	case INT11_H:rd_int11(int11_H);        changed |= INT11_H; break;
	case INT21:  rd_int21(int21_37);       changed |= INT21; break;
	case INT21_H:rd_int21(int21_H);        changed |= INT21_H; break;
	case INT22:  rd_int22(int22_37);       changed |= INT22; break;
	case INT22_H:rd_int22(int22_H);        changed |= INT22_H; break;
	case DE5:    rd_dangle(dangle5_37);    changed |= DE5;  break;
	case DE5_H:  rd_dangle(dangle5_H);     changed |= DE5_H;  break;
	case DE3:    rd_dangle(dangle3_37);    changed |= DE3; break;
	case DE3_H:  rd_dangle(dangle3_H);     changed |= DE3_H; break;
	case ML:     rd_MLparams();	       changed |= ML;  break;
	case NIN:    rd_ninio();	       changed |= NIN; break;
	case TL:     rd_Tetra_loop();          changed |= TL; break;
	case TRI:    rd_Tri_loop();            changed |= TRI; break;
	case MISC:   rd_misc();                changed |= MISC; break;
	  
	default: /* maybe it's a temperature */
	  r=sscanf(ident, "%f", &rtemp);
	  if (r!=1) fprintf(stderr," Unknown field identifier in `%s'\n", line);
	}
    } /* else ignore line */
    free(line);  
  }
  
  fclose(fp);

  check_symmetry();
  return;
}