No credit wanted or needed, not at fault if this wrecks your stuff.
Replace your do_say with this first:

ACMD(do_say)
{

    int face = 0;
    int state;
    char buf[MAX_INPUT_LENGTH];
    char buf2[MAX_INPUT_LENGTH];

        skip_spaces(&argument);

        if (!*argument) {
                send_to_char(ch, "What do you want to say?\r\n");
                return;
        }

        sprintf(buf, "$n");
        sprintf(buf2, "You");

        if (strstr(argument, ":)") != NULL) {
                face = 1;
        }

        else if (strstr(argument, ";)") != NULL) {
                face = 2;
        }

        else if (strstr(argument, ";(") != NULL) {
                face = 3;
        }

        else if (strstr(argument, ":(") != NULL) {
                face = 3;
        }

        else if (strstr(argument, ":O") != NULL) {
                face = 4;
        }

        else if (strstr(argument, ":P") != NULL) {
                face = 5;
        }


        search_replace(argument, " :)", "");
        search_replace(argument, " ;)", "");
        search_replace(argument, " ;(", "");
        search_replace(argument, " :(", "");
        search_replace(argument, " :O", "");
        search_replace(argument, " :P", "");
        search_replace(argument, ":)", "");
        search_replace(argument, ";)", "");
        search_replace(argument, ";(", "");
        search_replace(argument, ":(", "");
        search_replace(argument, ":O", "");
        search_replace(argument, ":P", "");


        if (!*argument) {
                send_to_char(ch, "What do you wish to say?\r\n");
                return;
        }

        if (argument[strlen(argument)-1] != '.' && argument[strlen(argument)-1]$
           && argument[strlen(argument)-1] != '!')
                 strcat(argument, ".");

        if(strstr(argument, "?") != NULL)
                state = 1;
        else if(strstr(argument, "!") != NULL)
                state = 2;
        else
                state = 0;

        switch(face) {
        case 0:
                sprintf(buf + strlen(buf), " ");
                sprintf(buf2 + strlen(buf2), " ");
                break;
        case 1:  // :)
                sprintf(buf + strlen(buf), " smiles and ");
                sprintf(buf2 + strlen(buf2), " smile and ");
                break;
        case 2:  // ;)
                sprintf(buf + strlen(buf), " winks and ");
                sprintf(buf2 + strlen(buf2), " wink and ");
                break;
        case 3: // :( or ;(
                sprintf(buf + strlen(buf), " frowns and ");
                sprintf(buf2 + strlen(buf2), " frown and ");
                break;
        case 4: // :O
                sprintf(buf + strlen(buf), " looks shocked and ");
                sprintf(buf2 + strlen(buf2), " look shocked and ");
                break;
        case 5: // :P
                sprintf(buf + strlen(buf), " laugh and ");
                sprintf(buf2 + strlen(buf2), " laugh and ");
                break;

        default:
                break;
        }

        switch(state) {
        case 1:
                sprintf(buf + strlen(buf), "asks, \"%s\"", CAP(argument));
                sprintf(buf2 + strlen(buf2), "ask, \"%s\"", CAP(argument));
                break;
        case 2:
                sprintf(buf + strlen(buf), "exclaims, \"%s\"", CAP(argument));
                sprintf(buf2 + strlen(buf2), "exclaim, \"%s\"", CAP(argument));
                break;
        case 0:
                sprintf(buf + strlen(buf), "says, \"%s\"", CAP(argument));
                sprintf(buf2 + strlen(buf2), "say, \"%s\"", CAP(argument));
                break;
        default:
                break;
        } else {
    msg = act(buf, FALSE, ch, 0, 0, TO_ROOM | DG_NO_TRIG);


    for (vict = world[IN_ROOM(ch)].people; vict; vict = vict->next_in_room)
      if (vict != ch && GET_POS(vict) > POS_SLEEPING)
        add_history(vict, msg, HIST_SAY);

  if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_NOREPEAT))
    send_to_char(ch, "Ok.\r\n");
  else {
    act(buf2, FALSE, ch, 0, argument, TO_CHAR);
     add_history(ch, msg, HIST_SAY);



  }
  speech_mtrigger(ch, argument);
  speech_wtrigger(ch, argument);

} 


Ok now at the bottom of utils.c or where you feel inclined to do so in the file

Code:

void search_replace(char *string, const char *find, const char *replace)
{
        char final[MAX_INPUT_LENGTH], temp[2];
        size_t start, end, i;

        while (strstr(string, find) != NULL) {

                final[0] = '\0';
                start = strstr(string, find) - string;
                end = start + strlen(find);

                temp[1] = '\0';

                strncat(final, string, start);

                strcat(final, replace);

                for (i = end; string[i] != '\0'; i++) {
                        temp[0] = string[i];
                        strcat(final, temp);
                }

                sprintf(string, final);

        }
        return;
}