dbm/
misc/
old-docs/
/* 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           *name, *result;
  int             gender, count;
  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) == -1) {
    warning("pronoun_sub", "bad player name or gender ref.");
    return (char *) 0;
  }
  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;
{
  if (isneuter(player))
    return (1);
  else if (isfemale(player))
    return (2);
  else if (ismale(player))
    return (3);
  else
    return (0);
}