|
|
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 s
Length: 6287 (0x188f)
Types: TextFile
Names: »savegame.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Galaxy/src/savegame.c«
/*
* %W% (mrdch&amnnon) %G%
*/
# include "header"
# include <signal.h>
# include <pwd.h>
extern char *sys_errlist[];
char errmsg[511];
extern errno;
movedir (saver)
char *saver;
{
struct passwd *p;
struct passwd *getpwnam ();
p = getpwnam (saver);
if (p == 0)
return;
else
if (chdir (p -> pw_dir) != -1)
return;
else
return;
}
# include "table.h"
# define TABSIZ 100
# define K 1024
int SWITCH_FLAG;
char version[80] = "Galaxy: version 1.0 13/6/85";
/*
* A few helpfull hints about galaxy's save file structure:
* The save file is made of three parts:
* 1. Galaxy version.
* 2. The program break.
* 3. global information.
*
* save should read the version, and compare it to the current.
* if they don't match, save must abort.
* after reading the program break, it should be re-set using
* brk(1).
* Now, save is prepared to read back all global data.
*/
char *
save (f)
char *f;
{
extern end;
extern edata;
extern etext;
char *sbrk ();
char *sbrk0;
int savef;
int nwrite;
char *realetext;
umask (0);
realetext = (char *) & etext;
realetext = (char *) ((int) (realetext + K - 1) & ~(K - 1));
savef = creat (f, 0600);
if (savef == -1) {
(void) sprintf(errmsg, "%s: %s", f, sys_errlist[errno]);
return(errmsg);
}
sbrk0 = sbrk (0);
enc_write (savef, version, 80);
if (enc_write (savef, (char *) & sbrk0, sizeof (sbrk0)) != sizeof (sbrk0)) {
(void) close (savef);
unlink (f);
return ("read error");
}
nwrite = (int) sbrk0 - (int) realetext;
if (enc_write (savef, realetext, nwrite) != nwrite) {
(void) close (savef);
unlink (f);
return ("read error");
}
(void) close (savef);
return (0);
}
char *
restor (f)
char *f;
{
extern etext;
extern edata;
extern end;
int savef;
char *brk ();
char *sbrk0;
int nread;
char *realetext;
char vers[81];
realetext = (char *) & etext;
realetext = (char *) ((int) (realetext + K - 1) & ~(K - 1));
savef = open (f, 0);
if (savef == -1) {
(void) sprintf(errmsg, "%s: %s", f, sys_errlist[errno]);
return(errmsg);
}
enc_read (savef, vers, 80);
if (strcmp (vers, version) != 0) {
close (savef);
/* don't unlink here! */
return ("ill formated save file");
}
if (enc_read (savef, (char *) & sbrk0, sizeof (sbrk0)) != sizeof (sbrk0)) {
perror ("read sbrk0");
(void) close (savef);
return ("read error");
}
if (brk (sbrk0) == (char *) - 1) {
perror ("brk");
(void) close (savef);
return ("not enough memory");
}
nread = (int) sbrk0 - (int) realetext;
if (enc_read (savef, realetext, nread) != nread) {
perror ("read etext");
(void) close (savef);
return ("read error");
}
return (0);
}
enc_write (fd, buf, nwrite)
int fd,
nwrite;
char *buf;
{
char buf2[TABSIZ + 1];
char *cp;
char *bp = buf;
int i;
int nw = nwrite;
while (nwrite > 0) {
cp = buf2;
for (i = 0; i < TABSIZ && nwrite > 0; i++, nwrite--) {
*cp++ = crypt_tab[i] ^ *bp++;
}
if (write (fd, buf2, i) != i)
return (-1);
}
return (nw);
}
enc_read (fd, buf, nread)
int fd,
nread;
char *buf;
{
char buf2[TABSIZ + 1];
char *cp;
char *bp = buf;
int i;
int cc;
int nr = nread;
while (nread > 0) {
cp = buf2;
cc = read (fd, cp, nread > TABSIZ ? TABSIZ : nread);
if (cc != (nread > TABSIZ ? TABSIZ : nread))
return (nr - nread);
for (i = 0; i < TABSIZ && nread > 0; i++, nread--)
*bp++ = crypt_tab[i] ^ *cp++;
}
return (nr);
}
savegame (fn)
char *fn;
{
static char fn1[100];
char *c;
skipwhite (fn);
if (wants_save[player]) {
say ("save canceled");
wants_save[player] = 0;
return;
}
wants_save[player] = 1;
if (wants_save[!player])
goto saveit;
strcpy (fn1, fn);
dowrite_enemy ("Lets save the game, O.K ?", !player);
say ("Ok, saving when he agrees...");
if (player == 0)
movedir (ply0);
else
movedir (ply1);
return;
saveit:
if (nullstr (fn) && nullstr (fn1))
strcpy (fn, "galaxy.save");
if (nullstr (fn1))
strcpy (fn1, fn);
if (nullstr (fn))
strcpy (fn, fn1);
if (strcmp (fn, fn1) != 0) {
say ("Hey, he wants to save on \"%s\"!", fn1);
wants_save[0] = wants_save[1] = 0;
return;
}
wants_save[0] = wants_save[1] = 0;
c = save (fn);
if (c != 0)
say (c);
if (iswiz[1] || iswiz[2])
return;
endgame (-1);
}
restorgame (fn)
char *fn;
{
char *c;
static char fn1[100];
char pl[100];
skipwhite (fn);
if (wants_restor[player]) {
say ("restor canceled");
wants_restor[player] = 0;
return;
}
wants_restor[player] = 1;
if (wants_restor[!player])
goto restorit;
strcpy (fn1, fn);
dowrite_enemy ("Lets restor, O.K ?", !player);
if (player == 0)
movedir (ply0);
else
movedir (ply1);
return;
restorit:
if (nullstr (fn) && nullstr (fn1))
strcpy (fn, "galaxy.save");
if (nullstr (fn1))
strcpy (fn1, fn);
if (nullstr (fn))
strcpy (fn, fn1);
if (strcmp (fn, fn1) != 0) {
say ("Hey, he wants to restore on \"%s\"!", fn1);
wants_restor[0] = wants_restor[1] = 0;
return;
}
/*
* save player0's name.
*/
strcpy (pl, ply0);
c = restor (fn);
if (c != 0)
say (c);
/*
* This is the hard part. When restoring a game, the users
* may have switched terminals. in this case, we have to
* switch the terminals.
*/
if (strcmp (ply0, pl) == 0) /* it's ok. */
return;
/* else o o, switched */
SWITCH_FLAG = 1;
}
nullstr (s)
char *s;
{
return (*s == '\0');
}