/
teeny/db/
teeny/dbm/
teeny/docs/
teeny/includes/
teeny/misc/
teeny/news/
teeny/text/
/* pronoun.c */

#include "copyright.h"
#include "config.h"

#include <stdio.h>
#ifdef STRING_H
#include <string.h>
#else
#include <strings.h>
#endif                                  /* STRING_H */
#include <ctype.h>

#include "teeny.h"

/*
 * pronoun_sub() 
 *
 * %-type substitutions for pronouns 
 *
 * %a/%A for absolute possessive (his/hers/its, His/Hers/Its) %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) %r/%R for reflexive pronouns (himself/herself/itself,
 * Himself/Herself/Itself) %n    for the player's name. 
 */
char           *
pronoun_sub(player, str)
  int             player;
  char           *str;
{
  char            c;
  char           *p, *name, *name_pwd, *result;
  int             gender, count;
  char            name_buff[65];
  static char     pronoun_buffer[BUFFSIZ + 100];

  static char    *subjective[4] = {"", "it", "she", "he"};
  static char    *objective[4] = {"", "it", "her", "him"};
  static char    *possessive[4] = {"", "its", "her", "his"};
  static char    *reflexive[4] = {"", "itself", "herself", "himself"};
  static char    *absolute[4] = {"", "its", "hers", "his"};

  if (get_str_elt(player, NAME, &name_pwd) == -1)
  {
    warning("pronoun_sub", "bad player name or gender ref.");
    return (char *) 0;
  }
  for (p = name_buff; *name_pwd && name_pwd && (p - name_buff) < 65
       && (*name_pwd != ' '); *p++ = *name_pwd++);
  *p = '\0';
  name = name_buff;

  if ((gender = genderof(player)) == -1)
  {
    warning("pronoun_sub", "bad gender ref on player");
    return (char *) 0;
  }

  for (count = 0, result = pronoun_buffer; *str && count < BUFFSIZ; count++)
  {
    if (*str == '%')
    {
      *result = '\0';
      c = *(++str);
      if (gender == 0)
      {
	switch (c)
	{
	case 'n':
	case 'N':
	case 'o':
	case 'O':
	case 's':
	case 'S':
	case 'r':
	case 'R':
	  strcat(result, name);
	  count += (strlen(name) - 2);
	  break;
	case 'p':
	case 'P':
	case 'a':
	case 'A':
	  strcat(result, name);
	  strcat(result, "'s");
	  count += strlen(name);
	  break;
	default:
	  result[0] = c;
	  result[1] = '\0';
	  break;
	}
	if (isupper(c) && islower(*result))
	{
	  *result = toupper(*result);
	}
	str++;
	result += strlen(result);
      } else
      {
	switch (c)
	{
	case 's':
	case 'S':
	  strcat(result, subjective[gender]);
	  count += (strlen(subjective[gender]) - 2);
	  break;
	case 'o':
	case 'O':
	  strcat(result, objective[gender]);
	  count += (strlen(objective[gender]) - 2);
	  break;
	case 'p':
	case 'P':
	  strcat(result, possessive[gender]);
	  count += (strlen(possessive[gender]) - 2);
	  break;
	case 'r':
	case 'R':
	  strcat(result, reflexive[gender]);
	  count += (strlen(reflexive[gender]) - 2);
	  break;
	case 'a':
	case 'A':
	  strcat(result, absolute[gender]);
	  count += (strlen(absolute[gender]) - 2);
	  break;
	case 'n':
	case 'N':
	  strcat(result, name);
	  count += (strlen(name) - 2);
	  break;
	default:
	  *result = c;
	  result[1] = '\0';
	  break;
	}
	if (isupper(c) && islower(*result))
	{
	  *result = toupper(*result);
	}
	result += strlen(result);
	str++;
      }
    } else
    {
      *result++ = *str++;
    }
  }
  *result = '\0';

  return pronoun_buffer;
}

int 
genderof(player)
  int             player;
{
  char           *gender;

  if (get_str_elt(player, GENDER, &gender) == -1)
    return (-1);

  /* Figure out what gender the player is using a switch */

  if (gender == NULL)
    return (0);
  else
  {
    switch (gender[0])
    {
    case 'N':
    case 'n':			/* neuter */
    case 'I':
    case 'i':			/* it */
      return (1);
    case 'F':
    case 'f':			/* female */
      return (2);
    case 'M':
    case 'm':			/* male */
      return (3);
    default:			/* pervert */
      return (0);
    }
  }
}