#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <ctype.h> /* main header file */ #include "mud.h" #define MAX_STRING 5413120 char *string_space; char *top_string; char *string_hash[MAX_KEY_HASH]; char str_empty[1]; int nAllocString; int sAllocString; int nAllocPerm; int sAllocPerm; void save_pfile ( D_MOBILE *dMob ); void save_profile ( D_MOBILE *dMob ); void save_player(D_MOBILE *dMob) { if (!dMob) return; save_pfile(dMob); /* saves the actual player data */ save_profile(dMob); /* saves the players profile */ } char *fread_string2(FILE * fp) { char *plast; char c; plast = top_string + sizeof(char *); if (plast > &string_space[MAX_STRING - MAX_STRING_LENGTH]) { bug("Fread_string: MAX_STRING %d exceeded.", MAX_STRING); exit(1); } /* * Skip blanks. * Read first char. */ do { c = getc(fp); } while (isspace(c)); if ((*plast++ = c) == '~') return &str_empty[0]; for (;;) { /* * Back off the char type lookup, * it was too dirty for portability. * -- Furey */ switch (*plast = getc(fp)) { default: plast++; break; case EOF: /* temp fix */ bug("Fread_string: EOF", 0); return NULL; /* exit( 1 ); */ break; case '\n': plast++; *plast++ = '\r'; break; case '\r': break; case '~': plast++; { union { char *pc; char rgc[sizeof(char *)]; } u1; int ic; int iHash; char *pHash; char *pHashPrev; plast[-1] = '\0'; iHash = UMIN(MAX_KEY_HASH - 1, plast - 1 - top_string); for (pHash = string_hash[iHash]; pHash; pHash = pHashPrev) { for (ic = 0; ic < sizeof(char *); ic++) u1.rgc[ic] = pHash[ic]; pHashPrev = u1.pc; pHash += sizeof(char *); if (top_string[sizeof(char *)] == pHash[0] && !strcmp(top_string + sizeof(char *) + 1, pHash + 1)) return pHash; } return str_dup(top_string + sizeof(char *)); } } } } void save_pfile(D_MOBILE *dMob) { char pName[20]; char pfile[256]; FILE *fp; int size, i; pName[0] = toupper(dMob->name[0]); size = strlen(dMob->name); for (i = 1; i < size; i++) pName[i] = tolower(dMob->name[i]); pName[i] = '\0'; /* open the pfile so we can write to it */ sprintf(pfile, "../players/%s.pfile", pName); if ((fp = fopen(pfile, "w")) == NULL) { bug("Unable to write to %s's pfile", dMob->name); return; } /* dump the players data into the file */ fprintf(fp, "Name %s~\n", dMob->name); fprintf(fp, "Level %d\n", dMob->level); fprintf(fp, "Password %s~\n", dMob->password); fprintf(fp, "Coordx %d\n", dMob->coordx); fprintf(fp, "Coordy %d\n", dMob->coordy); fprintf(fp, "Coordz %d\n", dMob->coordz); fprintf(fp, "Title %s~\n", dMob->title); #ifdef IMC imc_savechar( dMob, fp ); #endif /* terminate the file */ fprintf(fp, "%s\n", FILE_TERMINATOR); fclose(fp); } D_MOBILE *load_player(char *player) { FILE *fp; D_MOBILE *dMob = NULL; char pfile[256]; char pName[20]; char *word; bool done = FALSE, found; int i, size; pName[0] = toupper(player[0]); size = strlen(player); for (i = 1; i < size; i++) pName[i] = tolower(player[i]); pName[i] = '\0'; /* open the pfile so we can write to it */ sprintf(pfile, "../players/%s.pfile", pName); if ((fp = fopen(pfile, "r")) == NULL) return NULL; /* create new mobile data */ if (StackSize(dmobile_free) <= 0) { if ((dMob = malloc(sizeof(*dMob))) == NULL) { bug("Load_player: Cannot allocate memory."); abort(); } } else { dMob = (D_MOBILE *) PopStack(dmobile_free); } clear_mobile(dMob); #ifdef IMC imc_initchar( dMob ); #endif /* load data */ word = fread_word(fp); while (!done) { found = FALSE; switch (word[0]) { case 'C': if (compares(word, "Coordx")) { IREAD( "Coordx", dMob->coordx ); } if (compares(word, "Coordy")) { IREAD( "Coordy", dMob->coordy ); } if (compares(word, "Coordz")) { IREAD( "Coordz", dMob->coordz ); } break; case 'E': if (!strcasecmp(word, "EOF")) {done = TRUE; found = TRUE; break;} break; case 'I': #ifdef IMC if( ( found = imc_loadchar( dMob, fp, word ) ) ) break; #endif break; case 'L': IREAD( "Level", dMob->level ); break; case 'N': SREAD( "Name", dMob->name ); break; case 'P': SREAD( "Password", dMob->password ); break; case 'T': SREAD( "Title", dMob->title ); break; } if (!found) { bug("Load_player: unexpected '%s' in %s's pfile.", word, player); free_mobile(dMob); return NULL; } /* read one more */ if (!done) word = fread_word(fp); } fclose(fp); return dMob; } /* * This function loads a players profile, and stores * it in a mobile_data... DO NOT USE THIS DATA FOR * ANYTHING BUT CHECKING PASSWORDS OR SIMILAR. */ D_MOBILE *load_profile(char *player) { FILE *fp; D_MOBILE *dMob = NULL; char pfile[256]; char pName[20]; char *word; bool done = FALSE, found; int i, size; pName[0] = toupper(player[0]); size = strlen(player); for (i = 1; i < size; i++) pName[i] = tolower(player[i]); pName[i] = '\0'; /* open the pfile so we can write to it */ sprintf(pfile, "../players/%s.profile", pName); if ((fp = fopen(pfile, "r")) == NULL) return NULL; /* create new mobile data */ if (StackSize(dmobile_free) <= 0) { if ((dMob = malloc(sizeof(*dMob))) == NULL) { bug("Load_profile: Cannot allocate memory."); abort(); } } else { dMob = (D_MOBILE *) PopStack(dmobile_free); } clear_mobile(dMob); /* load data */ word = fread_word(fp); while (!done) { found = FALSE; switch (word[0]) { case 'E': if (!strcasecmp(word, "EOF")) {done = TRUE; found = TRUE; break;} break; case 'N': SREAD( "Name", dMob->name ); break; case 'P': SREAD( "Password", dMob->password ); break; } if (!found) { bug("Load_player: unexpected '%s' in %s's pfile.", word, player); free_mobile(dMob); return NULL; } /* read one more */ if (!done) word = fread_word(fp); } fclose(fp); return dMob; } /* * This file stores only data vital to load * the character, and check for things like * password and other such data. */ void save_profile(D_MOBILE *dMob) { char pfile[256]; char pName[20]; FILE *fp; int size, i; pName[0] = toupper(dMob->name[0]); size = strlen(dMob->name); for (i = 1; i < size; i++) pName[i] = tolower(dMob->name[i]); pName[i] = '\0'; /* open the pfile so we can write to it */ sprintf(pfile, "../players/%s.profile", pName); if ((fp = fopen(pfile, "w")) == NULL) { bug("Unable to write to %s's pfile", dMob->name); return; } /* dump the players data into the file */ fprintf(fp, "Name %s~\n", dMob->name); fprintf(fp, "Password %s~\n", dMob->password); /* terminate the file */ fprintf(fp, "%s\n", FILE_TERMINATOR); fclose(fp); }