void Eliza::preProcessResponse() { if(is_template(m_sResponse)) { findSymbol(m_sResponse); if(m_sKeyWord == m_sInput) { m_sSuffix = m_sInput; } else if(!m_bMemoryRecall){ extract_suffix(); } else { m_bMemoryRecall = 0; } if(m_sSuffix.length() == 0) { while(is_template(m_sResponse) && response_list.size() > 1) { response_list.erase(response_list.begin()); m_sResponse = response_list[0]; } if(is_template(m_sResponse)) { response_list = topicChanger; select_response(); } } if(m_sSuffix.length() > 0 && m_sSymbol != "%") { transpose_sentence(m_sSuffix); correct_sentence(m_sSuffix); trimRight(m_sSuffix, ' '); m_sSuffix.insert(0, " "); } replace(m_sResponse, m_sSymbol, m_sSuffix); } if(m_sUserName != "USER") { replace(m_sResponse, "USER", m_sUserName); } }
void Eliza::save_user_name() { if(m_sKeyWord == "MY NAME IS" || m_sKeyWord == "YOU CAN CALL ME") { extract_suffix(); m_sUserName = m_sSuffix; trimLR(m_sUserName, " "); } }
void ofxEliza::find_response() { find_keyword(); std::string tempStr = m_sKeyWord; tempStr.insert(0, " "); tempStr.append(" "); if(tempStr.find(" MY ") != std::string::npos || tempStr.find(" I'M ") != std::string::npos || tempStr.find(" I ") != std::string::npos) { m_sSymbol = "@"; extract_suffix(); memory.push(m_sSuffix); } save_user_name(); if(!bot_understand()) { handle_unknown_sentence(); } }
/* Extract from the stream the longest string of characters which are neither whitespace nor brackets (except for an optional bracketed n-char_sequence directly following nan or @nan@ independently of case). The user must free the returned string. */ static char * extract_string (FILE *stream) { int c; size_t nread = 0; size_t strsize = 100; char *str = mpc_alloc_str (strsize); size_t lenstr; c = getc (stream); while (c != EOF && c != '\n' && !isspace ((unsigned char) c) && c != '(' && c != ')') { str [nread] = (char) c; nread++; if (nread == strsize) { str = mpc_realloc_str (str, strsize, 2 * strsize); strsize *= 2; } c = getc (stream); } str = mpc_realloc_str (str, strsize, nread + 1); strsize = nread + 1; str [nread] = '\0'; if (nread == 0) return str; lenstr = nread; if (c == '(') { size_t n; char *suffix; int ret; /* (n-char-sequence) only after a NaN */ if ((nread != 3 || tolower ((unsigned char) (str[0])) != 'n' || tolower ((unsigned char) (str[1])) != 'a' || tolower ((unsigned char) (str[2])) != 'n') && (nread != 5 || str[0] != '@' || tolower ((unsigned char) (str[1])) != 'n' || tolower ((unsigned char) (str[2])) != 'a' || tolower ((unsigned char) (str[3])) != 'n' || str[4] != '@')) { ungetc (c, stream); return str; } suffix = extract_suffix (stream); nread += strlen (suffix) + 1; if (nread >= strsize) { str = mpc_realloc_str (str, strsize, nread + 1); strsize = nread + 1; } /* Warning: the sprintf does not allow overlap between arguments. */ ret = sprintf (str + lenstr, "(%s", suffix); MPC_ASSERT (ret >= 0); n = lenstr + (size_t) ret; MPC_ASSERT (n == nread); c = getc (stream); if (c == ')') { str = mpc_realloc_str (str, strsize, nread + 2); strsize = nread + 2; str [nread] = (char) c; str [nread+1] = '\0'; nread++; } else if (c != EOF) ungetc (c, stream); mpc_free_str (suffix); } else if (c != EOF) ungetc (c, stream); return str; }
void Eliza::memorise_input() { m_sSymbol = "@"; extract_suffix(); memory.push(m_sSuffix); }