DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T n

⟦e8cbc89a3⟧ TextFile

    Length: 3129 (0xc39)
    Types: TextFile
    Names: »newuaf.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/General/Abermud/newuaf.c« 

TextFile

/*
**
*/
#include "kernel.h"
#ifdef	RCSID
static char RCS[] =
	"$Header: newuaf.c,v 1.1 89/03/13 09:37:15 rsalz Exp $";
#endif	/* RCSID */


#define PCTL_GET	0
#define PCTL_FIND	1


static FILE *
openuaf(perm)
    char *perm;
{
    FILE *i;

    if ((i = openlock(UAF_RAND, perm)) == NULL)
	crapup("Cannot access UAF\n");
    return i;
}


static FILE *
personactl(name, d, act)
    char *name;
    PERSONA *d;
    int act;
{
    FILE *a;
    char c[32], e[32];

    a = openuaf("r+");
    lowercase(strcpy(e, name));
    while (fread((char *)d, sizeof(PERSONA), 1, a) == 1)
	if (EQ(lowercase(strcpy(c, d->p_name)), e))
	    switch (act) {
	    case PCTL_GET:
		closelock(a);
		/* Hack, return pointer to closed file. */
		return a;
	    case PCTL_FIND:
		fseek(a, ftell(a) - sizeof (PERSONA), 0);
		return a;
	    }
    closelock(a);
    return NULL;
}


findpers(name, x)
    char *name;
    PERSONA *x;
{
    return(personactl(name, x, PCTL_GET) != NULL);
}


delpers(name)
    char *name;
{
    FILE *i;
    PERSONA x;

    /* Was while loop but something happened and this looped forever... */
    if (i = personactl(name, &x, PCTL_FIND)) {
	mudlog("Deleted %s", lowercase(name));
	if (!EQ(lowercase(x.p_name), name))
	    crapup("Panic: Invalid Persona Delete");
	x.p_name[0] = '\0';
	x.p_level = -1;
	fwrite((char *)&x, sizeof(PERSONA), 1, i);
	closelock(i);
    }
}



putpers(name, pers)
    char *name;
    PERSONA *pers;
{
    FILE *i;
    off_t flen;
    PERSONA s;

    if ((i = personactl(name, &s, PCTL_FIND)) == NULL) {
	flen = -1;
	if ((i = personactl("", &s, PCTL_FIND)) == NULL) {
	    i = openuaf("a");
	    flen = ftell(i);
	}
	if (fwrite((char *)pers, sizeof(PERSONA), 1, i) != 1) {
	    bprintf("Save Failed - Device Full ?\n");
	    if (flen != -1)
		ftruncate(fileno(i), (off_t)flen);
	}
	closelock(i);
	return;
    }
    fwrite((char *)pers, sizeof(PERSONA), 1, i);
    closelock(i);
}

decpers(pers, name, str, score, lev, sex)
    PERSONA *pers;
    char *name;
    int *str, *score, *lev, *sex;
{
    strcpy(name, pers->p_name);
    *str = pers->p_strength;
    *score = pers->p_score;
    *lev = pers->p_level;
    *sex = pers->p_sex;
}

initme()
{
    PERSONA x;
    char s[32];

    if (findpers(globme, &x)) {
	decpers(&x, s, &my_str, &my_sco, &my_lev, &my_sex);
	if (my_str >= 0)
	    return;
    }

    x.p_score = 0;
    bprintf("Creating character....\n");
    my_sco = 0;
    my_str = 40;
    my_lev = 1;
    for (my_sex = -1; my_sex < 0; ) {
	bprintf("\nSex (M/F) : ");
	pbfr();
	key_input(">", 2);
	switch (key_buff[0]) {
	case 'M': case 'm':
	    my_sex = 0;
	    break;
	case 'F': case 'f':
	    my_sex = 1;
	    break;
	default:
	    bprintf("M or F");
	}
    }
    strcpy(x.p_name, globme);
    x.p_strength = my_str;
    x.p_level = my_lev;
    x.p_sex = my_sex;
    x.p_score = my_sco;
    putpers(globme, &x);
}

saveme()
{
    PERSONA x;

    strcpy(x.p_name, globme);
    x.p_strength = pstr(mynum);
    x.p_level = plev(mynum);
    x.p_sex = psexall(mynum);
    x.p_score = pscore(mynum);
    if (!zapped) {
	bprintf("\nSaving %s\n", pname(mynum));
	putpers(globme, &x);
    }
}