/* $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 "os.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 */