/* $Header: stringutil.c,v 1.4 90/05/02 20:25:32 lachesis Exp $
* $Log: stringutil.c,v $
* Revision 1.4 90/05/02 20:25:32 lachesis
* Converted gender substitution code to read properties,
* changed page to provide a message, too.
*
* Revision 1.3 90/04/24 14:46:34 lachesis
* Fixed the @odrop on rooms to links.
*
* Revision 1.2 90/04/21 17:20:50 lachesis
* Added property lists.
*
* Revision 1.1 90/04/14 14:56:54 lachesis
* Initial revision
*
*/
#include "copyright.h"
/* String utilities */
#include <ctype.h>
#include "externs.h"
#define DOWNCASE(x) (isupper(x) ? tolower(x) : (x))
int string_compare(const char *s1, const char *s2)
{
while(*s1 && *s2 && DOWNCASE(*s1) == DOWNCASE(*s2)) s1++, s2++;
return(DOWNCASE(*s1) - DOWNCASE(*s2));
}
int string_prefix(const char *string, const char *prefix)
{
while(*string && *prefix && DOWNCASE(*string) == DOWNCASE(*prefix))
string++, prefix++;
return *prefix == '\0';
}
/* accepts only nonempty matches starting at the beginning of a word */
const char *string_match(const char *src, const char *sub)
{
if(*sub != '\0') {
while(*src) {
if(string_prefix(src, sub)) return src;
/* else scan to beginning of next word */
while(*src && isalnum(*src)) src++;
while(*src && !isalnum(*src)) src++;
}
}
return 0;
}
#ifdef GENDER
/*
* pronoun_substitute()
*
* %-type substitutions for pronouns
*
* %s/%S for subjective pronouns (he/she/it, He/She/It)
* %o/%O for objective pronouns (him/her/it, Him/Her/It)
* %p/%P for possessive pronouns (his/her/its, His/Her/Its)
* %n for the player's name.
*/
void pronoun_substitute(char *result, dbref player, const char *str, int prepend)
{
char c;
char prn[3];
const char *self_sub; /* self substitution code */
static const char *subjective[4] = { "", "it", "she", "he" };
static const char *possessive[4] = { "", "its", "her", "his" };
static const char *objective[4] = { "", "it", "her", "him" };
prn[0] = '%';
prn[2] = '\0';
#ifdef COMPRESS
str = uncompress(str);
#endif /* COMPRESS */
if (prepend) {
(void) strcpy(result, db[player].name);
result += strlen(result);
*result++ = ' ';
}
while (*str) {
if(*str == '%') {
*result = '\0';
prn[1] = c = *(++str);
self_sub = get_property_class(player, prn);
if (self_sub)
{
strcat(result, self_sub);
result += strlen(result);
str++;
}
else if (genderof(player) == GENDER_UNASSIGNED) {
switch(c) {
case 'n':
case 'N':
case 'o':
case 'O':
case 's':
case 'S':
strcat(result, db[player].name);
break;
case 'p':
case 'P':
strcat(result, db[player].name);
strcat(result, "'s");
break;
default:
result[0] = *str;
result[1] = 0;
break;
}
str++;
result += strlen(result);
} else {
switch (c) {
case 's':
case 'S':
strcat(result, subjective[genderof(player)]);
break;
case 'p':
case 'P':
strcat(result, possessive[genderof(player)]);
break;
case 'o':
case 'O':
strcat(result, objective[genderof(player)]);
break;
case 'n':
case 'N':
strcat(result, db[player].name);
break;
default:
*result = *str;
result[1] = '\0';
break;
}
if(isupper(c) && islower(*result)) {
*result = toupper(*result);
}
result += strlen(result);
str++;
}
} else {
*result++ = *str++;
}
}
*result = '\0';
}
#endif /* GENDER */