/* * 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); }
/*------------------------------------------------------------*/ 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; }