|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T c
Length: 3854 (0xf0e)
Types: TextFile
Names: »cvsave.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Crystal/cvsave.c«
/* cvsave.c
* routine to save or restore the user's game
* only one game per user name is allowed in this version
* what is saved:
* a time-stamp of the program version (not the game)
* all non-stack variables from cvmain.c
* all variable info from cvlocs.c, cvobj.c
*************************************************************************/
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#include "cvobj.h"
#include "cvlocs.h"
#define DIRNAME "/usr/games/lib/crystal/"
#define DIRLEN (sizeof DIRNAME)
extern char *cuserid();
extern char emain, datastart;
extern int saved;
static char savename[DIRLEN+L_cuserid] = DIRNAME;
static unsigned datalen ;
static unsigned conlen = sizeof(struct cvloc *) + sizeof(struct conn *);
long ptime = -1; /* program time-stamp */
void
cvsave()
{ register struct cvloc *curloc;
register struct cvobj *curobj;
auto char userid[L_cuserid];
auto struct stat buf;
auto int save;
datalen = &emain-&datastart;
if (cuserid(userid) == NULL) {
puts("\nCannot save because I don't know who you are!");
return;
}
(void) strcpy(savename+DIRLEN-1, userid);
if (stat(savename,&buf) == -1) {
if (errno != ENOENT) {
puts("\nCannot save because of directory trouble\n");
return;
}
} else {
if (yes(93,0,0)) {
if (unlink(savename) == -1) {
printf("\nCannot unlink %s\n",savename);
return;
}
} else { return; }
}
if ((save = open(savename,O_WRONLY|O_EXCL|O_CREAT,0600)) == -1) {
printf("\nCannot create %s\n",savename);
return;
}
if (write(save,&ptime,sizeof(long)) == -1
|| write(save,&datastart,datalen) == -1) {
perror("Saving cave:");
close(save);
unlink(savename);
return;
}
for (curobj = cvobj; curobj->desc != NULL; curobj++) {
if (write(save, &(curobj->prop), sizeof(int)) == -1
|| write(save, &(curobj->conn1.where),conlen) == -1
|| write(save, &(curobj->conn2.where),conlen) == -1) {
perror("Saving cave objects");
close(save);
unlink(savename);
return;
}
}
for (curloc = cvloc; curloc->travel != NULL; curloc++) {
if (write(save, &(curloc->abb), sizeof(int)) == -1
|| write(save, &(curloc->atloc.where),conlen) == -1) {
perror("Saving cave places");
close(save);
unlink(savename);
return;
}
}
(void) close(save);
return;
}
void
cvrest()
{ register struct cvloc *curloc;
register struct cvobj *curobj;
auto char userid[L_cuserid];
auto int save;
auto long ftime = -1;
datalen = &emain-&datastart;
if (cuserid(userid) == NULL) {
puts("\nCannot restore because I don't know who you are!");
return;
}
(void) strcpy(savename+DIRLEN-1, userid);
if ((save = open(savename,O_RDONLY)) == -1) {
printf("\nCannot find %s\n",savename);
return;
}
if (read(save,&ftime,sizeof(long)) != sizeof(long)
#ifdef XVERSION
|| ftime != ptime
#endif
|| read(save,&datastart,datalen) != datalen) {
if (ftime == -1) {
perror("Restoring cave:");
} else {
puts("\nSave file not created by this version");
}
close(save);
unlink(savename);
return;
}
for (curobj = cvobj; curobj->desc != NULL; curobj++) {
if (read(save, &(curobj->prop), sizeof(int)) != sizeof(int)
|| read(save, &(curobj->conn1.where),conlen) != conlen
|| read(save, &(curobj->conn2.where),conlen) != conlen) {
perror("Restoring cave objects");
close(save);
unlink(savename);
return;
}
}
for (curloc = cvloc; curloc->travel != NULL; curloc++) {
if (read(save, &(curloc->abb), sizeof(int)) != sizeof(int)
|| read(save, &(curloc->atloc.where),conlen) != conlen) {
perror("Restoring cave places");
close(save);
unlink(savename);
return;
}
}
if (read(save, &ftime, 1) != 0) {
puts("\nNot end of file");
close (save);
unlink(savename);
exit(1);
}
(void) close(save);
if (saved == 1) saved = -1;
return;
}