/*																				*/
/*																				*/
/*				File:		  	execute.c									*/
/*				Returns:	  	void											*/
/*				Parameters:													*/
/*																				*/
/*																				*/

#include <stdio.h>

#include "advm.h"

#include "values.h"
#include "string.h"

#include "clear.h"
#include "start.h"
#include "hours.h"
#include "setval.h"
#include "eval.h"
#include "halt.h"

void execut ()

	{
	static int comtmp;
	int maxrec;
	int check;
	char zkey [13];
	FILE *freeze;

	maxrec = (((nobj+1)*3)+((nvars+1)*2)+((nplace+1)*1)+1)*2;
	lineln = eval(status);
	strcpy (zkey, "advd");
	if (lineln > 1)
		{
		strncat (zkey, zarg [1],4);
		zkey[8] = 0;
		}
	strcat (zkey, ".sav");
	switch (word1)
		{
		case 1:	/*	exec 1 - save */
				if (freeze = fopen(zkey, "wb"))
					{
					array (objloc,nobj-1);
					array (objval,nobj-1);
					array (objbit,nobj-1);
					array (varval,nvars-1);
					array (varbit,nvars-1);
					array (placeb,nplace-1);
					if (fwrite ((char *)&chcksm, sizeof (chcksm), 1, freeze) == 1)
						if (fwrite ((char *)objloc, sizeof(objloc[0]), nobj, freeze) == nobj)
							if (fwrite ((char *)objval, sizeof(objval[0]), nobj, freeze) == nobj)
								if (fwrite ((char *)objbit, sizeof(objbit[0]), nobj, freeze) == nobj)
									if (fwrite ((char *)varval, sizeof(varval[0]), nvars, freeze) == nvars)
										if (fwrite ((char *)varbit, sizeof(varbit[0]), nvars, freeze) == nvars)
											if (fwrite ((char *)placeb, sizeof(placeb[0]), nplace, freeze) == nplace)
												{
												setval (word2,fclose(freeze)?1:0);
												return;
												}
					setval (word2,1);
					fclose (freeze);
					return;
					}	
				setval (word2, 1);
				break;
		case 2:
				if (!(freeze = fopen(zkey, "rb")))
					{
					setval(word2,1);
					return;
					}
				if (fread((char *)&check, sizeof(check),1,freeze) == 1)
					{
					if (check != chcksm)
						{
						setval(word2,2);
						return;
						}
					fseek (freeze, 0l, 0);
					array (objloc,nobj-1);
					array (objval,nobj-1);
					array (objbit,nobj-1);
					array (varval,nvars-1);
					array (varbit,nvars-1);
					array (placeb,nplace-1);
					if (fread ((char *)&chcksm, sizeof (chcksm), 1, freeze) == 1)
						if (fread ((char *)objloc, sizeof(objloc[0]), nobj, freeze) == nobj)
							if (fread ((char *)objval, sizeof(objval[0]), nobj, freeze) == nobj)
								if (fread ((char *)objbit, sizeof(objbit[0]), nobj, freeze) == nobj)
									if (fread ((char *)varval, sizeof(varval[0]), nvars, freeze) == nvars)
										if (fread ((char *)varbit, sizeof(varbit[0]), nvars, freeze) == nvars)
											if (fread ((char *)placeb, sizeof(placeb[0]), nplace, freeze) == nplace)
												{
												setval (word2,fclose(freeze)?1:0);
												return;
												}
					}
				setval (word2,1);
				fclose (freeze);
				return;
		case 3:
				unlink(zkey);
				break;
		case 4:
				if (!enable)
					setval(word2,1);
				else
					{
					clear();
					if (start() == 1) enable = FALSE;
					setval (word2,0);
					}
				break;
		case 5:
				setval(word2,0);
				break;
		case 6:
				hours();
				setval(word2,0);
				break;
		case 7:
				comtmp = eval(word2);
				break;
		case 8:
				setval (word2, comtmp);
				break;
		case 9:
				halt();
				break;
		default:
			printf ("Glitch!  Bad EXEC code: %d on rec %d.%03d after loc %d\n",
					word1,rec2,rec1,bp);
			break;
		}
	}


