|
|
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: 2671 (0xa6f)
Types: TextFile
Names: »savgm.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Adventure/src/adv/savgm.c«
/*
** Copyright (c) 1985 Ken Wellsch
**
** Permission is hereby granted to all users to possess, use, copy,
** distribute, and modify the programs and files in this package
** provided it is not for direct commercial benefit and secondly,
** that this notice and all modification information be kept and
** maintained in the package.
**
*/
#include "adefs.h"
#define READONLY 0
#define WRITEONLY 1
#define READWRITE 2
struct saveb
{
int s_uid ;
short int s_ov[OBJECTS], s_ob[OBJECTS], s_ol[OBJECTS] ;
short int s_pb[PLACES] ;
short int s_vv[VARS], s_vb[VARS] ;
} ;
struct saveb sb ;
int savgm ()
{
register int i ;
register int uid ;
register int fd ;
if ( ( fd = open (FREEZER,READWRITE) ) < 0 )
{
if ( ( fd = creat (FREEZER,0600) ) < 0 )
return (ERROR) ;
close (fd) ;
if ( ( fd = open (FREEZER,READWRITE) ) < 0 )
return (ERROR) ;
}
uid = getuid() + 1 ;
forever
{
if ( read(fd,(char *)&sb,sizeof(sb)) != sizeof(sb) )
break ;
if ( sb.s_uid == uid || sb.s_uid == 0 )
{
(void) lseek (fd,-(sizeof(sb)),1) ;
break ;
}
}
sb.s_uid = uid ;
for ( i = 0 ; i < OBJECTS ; i++ )
{
sb.s_ov[i] = objval[i] ;
sb.s_ob[i] = objbit[i] ;
sb.s_ol[i] = objloc[i] ;
}
for ( i = 0 ; i < PLACES ; i++ )
{
sb.s_pb[i] = plcbit[i] ;
}
for ( i = 0 ; i < VARS ; i++ )
{
sb.s_vv[i] = varval[i] ;
sb.s_vb[i] = varbit[i] ;
}
if ( write (fd,(char *)&sb,sizeof(sb)) != sizeof(sb) )
{
(void) close(fd) ;
return (ERROR) ;
}
(void) close(fd) ;
return (OK) ;
}
int resgm ()
{
register int i ;
register int uid ;
register int fd ;
if ( ( fd = open (FREEZER,READONLY) ) < 0 )
return (ERROR) ;
uid = getuid() + 1 ;
forever
{
if ( read(fd,(char *)&sb,sizeof(sb)) != sizeof(sb) )
{
(void) close (fd) ;
return (ERROR) ;
}
if ( sb.s_uid == uid )
break ;
}
for ( i = 0 ; i < OBJECTS ; i++ )
{
objval[i] = sb.s_ov[i] ;
objbit[i] = sb.s_ob[i] ;
objloc[i] = sb.s_ol[i] ;
}
for ( i = 0 ; i < PLACES ; i++ )
{
plcbit[i] = sb.s_pb[i] ;
}
for ( i = 0 ; i < VARS ; i++ )
{
varval[i] = sb.s_vv[i] ;
varbit[i] = sb.s_vb[i] ;
}
(void) close(fd) ;
return (OK) ;
}
int delgm ()
{
register int uid ;
register int fd ;
if ( ( fd = open (FREEZER,READWRITE) ) < 1 )
return (ERROR) ;
uid = getuid() + 1 ;
forever
{
if ( read(fd,(char *)&sb,sizeof(sb)) != sizeof(sb) )
{
(void) close (fd) ;
return (ERROR) ;
}
if ( sb.s_uid == uid )
break ;
}
sb.s_uid = 0 ;
(void) lseek (fd,-(sizeof(sb)),1) ;
if ( write (fd,(char *)&sb,sizeof(sb)) != sizeof(sb) )
{
(void) close(fd) ;
return (ERROR) ;
}
(void) close(fd) ;
return (OK) ;
}