head 1.2; access ; symbols ; locks ; strict; comment @ * @; 1.2 date 89.07.03.08.18.05; author rsalz; state Exp; branches ; next 1.1; 1.1 date 89.03.13.09.37.15; author rsalz; state Exp; branches ; next ; desc @@ 1.2 log @Incorporate many fixes by Jussi <eloranta@@tukki.jyu.fi>, and some minor tweaks by Rich. @ text @/* ** */ #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 *d, 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: /* Back up one spot. */ fseek(a, ftell(a) - sizeof *d, 0); return a; } closelock(a); return NULL; } findpers(name, d) char *name; PERSONA *d; { return personactl(name, d, PCTL_GET) != NULL; } delpers(name) char *name; { FILE *i; PERSONA d; /* Was while loop but something happened and this looped forever... */ if (i = personactl(name, &d, PCTL_FIND)) { mudlog("Deleted %s", lowercase(name)); if (!EQ(lowercase(d.p_name), name)) crapup("Panic: Invalid Persona Delete"); d.p_name[0] = '\0'; d.p_level = -1; fwrite((char *)&d, sizeof d, 1, i); closelock(i); } } putpers(name, d) char *name; PERSONA *d; { 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 *)d, sizeof *d, 1, i) != 1) { bprintf("Save Failed - Device Full ?\n"); if (flen != -1) ftruncate(fileno(i), (off_t)flen); } } else fwrite((char *)d, sizeof *d, 1, i); closelock(i); } decpers(d, name, str, score, lev, sex) PERSONA *d; char *name; int *str, *score, *lev, *sex; { strcpy(name, d->p_name); *str = d->p_strength; *score = d->p_score; *lev = d->p_level; *sex = d->p_sex; } initme() { PERSONA d; char s[32]; if (findpers(globme, &d)) { decpers(&d, s, &my_str, &my_sco, &my_lev, &my_sex); if (my_str >= 0) return; } d.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(d.p_name, globme); d.p_strength = my_str; d.p_level = my_lev; d.p_sex = my_sex; d.p_score = my_sco; putpers(globme, &d); } saveme() { PERSONA d; strcpy(d.p_name, globme); d.p_strength = pstr(mynum); d.p_level = plev(mynum); d.p_sex = psexall(mynum); d.p_score = pscore(mynum); if (!zapped) { bprintf("\nSaving %s\n", pname(mynum)); putpers(globme, &d); } } @ 1.1 log @Initial revision @ text @d7 1 a7 1 "$Header$"; d36 1 a36 1 a = openuaf("r"); d46 2 a47 1 fseek(a, ftell(a) - sizeof (PERSONA), 0); d55 1 a55 1 findpers(name, x) d57 1 a57 1 PERSONA *x; d59 1 a59 1 return personactl(name, x, PCTL_GET) != NULL; d67 1 a67 1 PERSONA x; d69 2 a70 1 while (i = personactl(name, &x, PCTL_FIND)) { d72 1 a72 1 if (!EQ(lowercase(x.p_name), name)) d74 3 a76 3 x.p_name[0] = '\0'; x.p_level = -1; fwrite((char *)&x, sizeof x, 1, i); d82 1 a82 2 putpers(name, pers) d84 1 a84 1 PERSONA *pers; d96 1 a96 1 if (fwrite((char *)pers, sizeof *pers, 1, i) != 1) { a100 2 closelock(i); return; d102 2 a103 1 fwrite((char *)pers, sizeof *pers, 1, i); d107 3 a109 2 decpers(pers, name, str, score, lev, sex) PERSONA *pers; d113 5 a117 5 strcpy(name, pers->p_name); *str = pers->p_strength; *score = pers->p_score; *lev = pers->p_level; *sex = pers->p_sex; d122 1 a122 1 PERSONA x; d125 2 a126 2 if (findpers(globme, &x) == 0) { decpers(&x, s, &my_str, &my_sco, &my_lev, &my_sex); d131 1 a131 1 x.p_score = 0; d151 6 a156 6 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); d161 1 a161 1 PERSONA x; d163 5 a167 7 if (EQ(pname(mynum), globme)) zapped = 1; 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); d170 1 a170 1 putpers(globme, &x); @