/****
* submitted to r/badcode
* entire program was in one 1280-line file
* written using RHIDE, a DOS (i.e. text-mode) IDE
* compiled using DJGPP
* ran on a Packard Bell 100(?) with 386SXL-25 (~ 2.9 bogomips),
* 40MB full-height IDE drive, ?? kB RAM
****/
//March 1, 2001
/****************************FPU?!********************************************
***************Link with -lemu to avoid SIGNOFP******************************/
void read_settings()
{
//open settings file - if not created, jump to function to get and write settings
//if it is opened successfully, read the settings from it and post to appropriate variables
int good=1; //flag for continuation into nested IF statements
int already_tried_main=0, tried_bak=0,temp;
FILE *settings;
settings=fopen("config.dat","r");
printf("\nNeed to change read_settings()."); //fix: does not detect corrupt cfg file!
do {
if (already_tried_main!=0) //it doesn't exist
{
fprintf(stderr,"\nNormal configuration file cannot be opened! Trying backup file.\n");
settings=fopen("config.bak","r");
tried_bak=1;
good=1;
//delete main config.dat file
if (!access("config.dat",F_OK)) //true if it exists! (delete it)
system("del config.dat >NUL");
}
if (settings!=NULL) //TRUE if either file will open
{
//file exists. hopefully data is OK.
//read data
if (fscanf(settings,"right.fan_set_pt\t%f\n",&world.right.fan_set_pt)!=EOF && good!=0)
{
if (fscanf(settings,"right.fan_off_dx\t%f\n",&world.right.fan_off_dx)!=EOF && good!=0)
{
if (fscanf(settings,"right.heater_offset\t%f\n",&world.right.heater_offset)!=EOF && good!=0)
{
if (fscanf(settings,"right.heater_off_dx\t%f\n",&world.right.heater_off_dx)!=EOF && good!=0)
{
if (fscanf(settings,"right.vent_secs_on\t%d\n",&world.right.vent_secs_on)!=EOF && good!=0)
{
if (fscanf(settings,"right.vent_secs_off\t%d\n",&world.right.vent_secs_off)!=EOF && good!=0)
{
if (fscanf(settings,"right.lights_on\t%d\n",&world.right.lights_on)!=EOF && good!=0)
{
if (fscanf(settings,"right.lights_off\t%d\n",&world.right.lights_off)!=EOF && good!=0)
{
if (fscanf(settings,"right.min_temp\t%f\n",&world.right.min_temp)!=EOF && good!=0)
{
if (fscanf(settings,"right.max_temp\t%f\n",&world.right.max_temp)!=EOF && good!=0)
{
if (fscanf(settings,"left.fan_set_pt\t%f\n",&world.left.fan_set_pt)!=EOF && good!=0)
{
if (fscanf(settings,"left.fan_off_dx\t%f\n",&world.left.fan_off_dx)!=EOF && good!=0)
{
if (fscanf(settings,"left.heater_offset\t%f\n",&world.left.heater_offset)!=EOF && good!=0)
{
if (fscanf(settings,"left.heater_off_dx\t%f\n",&world.left.heater_off_dx)!=EOF && good!=0)
{
if (fscanf(settings,"left.vent_secs_on\t%d\n",&world.left.vent_secs_on)!=EOF && good!=0)
{
if (fscanf(settings,"left.vent_secs_off\t%d\n",&world.left.vent_secs_off)!=EOF && good!=0)
{
if (fscanf(settings,"left.lights_on\t%d\n",&world.left.lights_on)!=EOF && good!=0)
{
if (fscanf(settings,"left.lights_off\t%d\n",&world.left.lights_off)!=EOF && good!=0)
{
if (fscanf(settings,"left.min_temp\t%f\n",&world.left.min_temp)!=EOF && good!=0)
{
if (fscanf(settings,"left.max_temp\t%f\n",&world.left.max_temp)!=EOF && good!=0)
{
temp=fscanf(settings,"printer_port\t%x\n",&world.printer_port);
if (temp==EOF || good==0 || (world.printer_port != 0x378 && world.printer_port != 0x278 && world.printer_port != 0x3BC))
{
good=0; //set flag if it wasn't set
input_settings(); //get user input because file is incomplete
}
temp=world.printer_port; //so I don't have to type as much. Optimization will take care of this.
if (temp!=0x378 && temp!=0x278 && temp!=0x3BC)
{
puts("\nprinter port setting invalid. Resetting to default.");
world.printer_port=0x378; //revert to default if file is wrong.
}
}
else good = 0; //get user input and flag for rest of if statements
}
else good = 0;
}
else good = 0;
}
else good = 0;
}
else good = 0;
}
else good = 0;
}
else good = 0;
}
else good = 0;
}
else good = 0;
}
else good = 0;
}
else good = 0;
}
else good = 0;
}
else good = 0;
}
else good = 0;
}
else good = 0;
}
else good = 0;
}
else good = 0;
}
else good = 0;
}
else good = 0;
}
else good = 0;
fclose(settings);
}
else
{
good=0;
}
already_tried_main++;
} while ((tried_bak==0) && (good==0)); //loop if:
// 1) haven't tried backup file
// 2) failure reading file (good=0)
if (good==0) //read failed.
{
if (!access("config.bak",F_OK)) //only delete if exists AND read failed.
system("delete config.bak>NUL");
input_settings(); //Neither file exists. Go through setup.
//input_settings() copies into world global variable,
//THEN calls function to write to file
//This way, we don't have to read back from file here.
}
else
{
/*****************************************************************
* *
** If we're here, read succeeded. Check if the main file exists;
** if it doesn't (access() returns *true*) copy backup to main.
**
** ALSO copy backup to main if tried_bak is nonzero, because this
** means that the config.dat is corrupted (if good != 0)
**
*****************************************************************/
if (access("config.dat",F_OK) || tried_bak)
system("copy config.bak config.dat /y>NUL");
}
}