/* 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);
}