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