/****************************************************************************
* *
* dutil.c (c) by Georg Essl in 1992 *
* *
****************************************************************************/
/*** INCLUDES ***/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "dutil.h"
int strnccmp(char *wstr1, char *wstr2,int wint)
{
int i;
for (i = 0; (*(wstr1 + i) || *(wstr2 + i)) && (wint>0); i++, wint--)
if (tolower(*(wstr1 + i)) - tolower(*(wstr2 + i)))
return (1);
return(0);
}
/* Ask for Yes or No */
int AskYesNo(char *wstr)
{
char wstr2[255];
gets(wstr2);
if((*wstr2!='\0')&&(!strnccmp(wstr,wstr2,strlen(wstr2))))
return(1);
else
return(0);
}
/* read and allocate space for a '~'-terminated string from a given file */
char *fread_string(FILE *fl)
{
char *buf, tmp[500];
char *rslt;
register char *point;
int flag;
if((buf=malloc(MAX_STRING_LENGTH))==NULL)
return(buf);
buf[0]='\0';
buf[1]='\0';
do
{
if (!fgets(tmp, MAX_STRING_LENGTH, fl))
{
perror("fread_str");
exit(0);
}
if (strlen(tmp) + strlen(buf) > MAX_STRING_LENGTH)
{
printf("***ERROR: fread_string: string too large \n");
exit(0);
}
else
strcat(buf, tmp);
for (point = buf + strlen(buf) - 2; point >= buf && isspace(*point);
point--);
if (flag = (*point == '~'))
if (*(buf + strlen(buf) - 3) == '\n')
{
*(buf + strlen(buf) - 2) = '\r';
*(buf + strlen(buf) - 1) = '\0';
}
else
*(buf + strlen(buf) -2) = '\0';
else
{
*(buf + strlen(buf) + 1) = '\0';
*(buf + strlen(buf)) = '\r';
}
}
while (!flag);
/* do the allocate boogie */
if (strlen(buf) > 0)
{
CREATE(rslt, char, strlen(buf) + 1);
strcpy(rslt, buf);
}
else
rslt = 0;
free(buf);
return(rslt);
}
/* generate index table for object or monster file */
struct index_data *generate_indices(FILE *fl, int *top)
{
int i = 0;
struct index_data *index;
long pos,tmp2,tmp3,otmp3;
char buf[82];
rewind(fl);
tmp3=0;
for (;;)
{
tmp2=ftell(fl);
if (fgets(buf, 81, fl))
{
otmp3=tmp3;
tmp3+=strlen(buf);
if (*buf == '#')
{
/* allocate new cell */
if (!i) /* first cell */
CREATE(index, struct index_data, 1);
else
if (!(index =
(struct index_data*) realloc(index,
(i + 1) * sizeof(struct index_data))))
{
perror("load indices");
exit(0);
}
/***** WARNING!!! NOT LIKE IN ORIGINAL DIKUMUD CODE !!! ****/
index[i].pos = tmp2;
index[i].cpos= otmp3;
sscanf(buf, "#%d", &index[i].virtual);
i++;
}
else
{
if (*buf == '$') /* EOF */
break;
}
}
else
{
perror("Unexpected end of db-file while generating indices");
exit(0);
}
}
*top = i - 2;
return(index);
}
/* string to file */
void fwrite_string(FILE *wfile,char *wstr)
{
char *tempstr;
int i,j;
if(wstr!=NULL)
{
CREATE(tempstr,char ,strlen(wstr)+1);
j=0;
for(i=0;i<=strlen(wstr);i++)
{
if(wstr[i]!='\r')
{
tempstr[j]=wstr[i];
j++;
}
}
fprintf(wfile,"%s~\n",tempstr);
free(tempstr);
}
else
fprintf(wfile,"~\n");
}
/* Writes out multi-line strings with new lines in position 'space'. */
/* Used in e.g. print_room, print_obj and print_mob */
void write_string(char *wstr, int space)
{
int i,k;
char *lastc;
lastc = wstr;
if(wstr!=NULL)
{
for(i=0;i<=strlen(wstr);i++)
{
if (*lastc == '\n')
for (k=0;k<space;k++)
printf(" ");
if(wstr[i]!='\r')
putchar(wstr[i]);
lastc = &wstr[i];
}
printf("\n");
}
else
printf("\n");
}
/* Read multi-line strings (adopted from fread_string()) */
char *read_multi_string(void)
{
char buf[MAX_STRING_LENGTH], tmp[500];
char *rslt;
register char *point;
int flag;
buf[0]='\0';
buf[1]='\0';
do
{
gets(tmp);
if (strlen(tmp) + strlen(buf) > MAX_STRING_LENGTH)
{
printf("***ERROR: fread_string: string too large\n");
exit(0);
}
else
strcat(buf, tmp);
strcat(buf, "\n");
for (point = buf + strlen(buf) - 2; point >= buf && isspace(*point);
point--);
if (flag = (*point == '~'))
if (*(buf + strlen(buf) - 3) == '\n')
{
*(buf + strlen(buf) - 2) = '\r';
*(buf + strlen(buf) - 1) = '\0';
}
else
*(buf + strlen(buf) -2) = '\0';
else
{
*(buf + strlen(buf) + 1) = '\0';
*(buf + strlen(buf)) = '\r';
}
}
while (!flag);
/* do the allocate boogie */
if (strlen(buf) > 0)
{
CREATE(rslt, char, strlen(buf) + 1);
strcpy(rslt, buf);
}
else
rslt = 0;
return(rslt);
}
/* Get and free *.DEF-files */
int GetADef(FILE *a_file,char *a_fname,char *dbpath,char ***a_str,int *a_max)
{
int i;
char *wstr;
CREATE(wstr, char, strlen(dbpath)+strlen(a_fname)+1);
strcpy(wstr,dbpath);
strcat(wstr,a_fname);
if(!(a_file=fopen(wstr,"r")))
{
free(wstr);
return(DU_ERR_CANTOPEN);
}
free(wstr);
fscanf(a_file,"%d\n",a_max);
*a_str=malloc(sizeof(char *)* (*a_max+1));
for(i=0;i<=*a_max;i++)
{
(*a_str)[i]=fread_string(a_file);
}
fclose(a_file);
return(DU_ERR_NOERROR);
}
void FreeADef(char **a_str,int a_max)
{
int i;
for(i=0;i<=a_max;i++)
{
free(a_str[i]);
}
free(a_str);
}