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