/* $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 */