void Library::LookupData(const string &str, TSearchResultList& res_list) { std::vector<gchar *> drl[ndicts()]; if (!Libs::LookupData(str.c_str(), drl)) return; for (int idict=0; idict<ndicts(); ++idict) for (std::vector<gchar *>::size_type j=0; j<drl[idict].size(); ++j) { SimpleLookup(drl[idict][j], res_list); g_free(drl[idict][j]); } }
void Library::LookupWithRule(const string &str, TSearchResultList& res_list) { std::vector<gchar *> match_res((MAX_MATCH_ITEM_PER_LIB) * ndicts()); gint nfound=Libs::LookupWithRule(str.c_str(), &match_res[0]); if (!nfound) return; for (gint i=0; i<nfound; ++i) { SimpleLookup(match_res[i], res_list); g_free(match_res[i]); } }
void Library::LookupWithFuzzy(const string &str, TSearchResultList& res_list) { static const int MAXFUZZY=10; gchar *fuzzy_res[MAXFUZZY]; if (!Libs::LookupWithFuzzy(str.c_str(), fuzzy_res, MAXFUZZY)) return; for (gchar **p=fuzzy_res, **end=fuzzy_res+MAXFUZZY; p!=end && *p; ++p) { SimpleLookup(*p, res_list); g_free(*p); } }
bool ExprResolveEnum(struct xkb_context *ctx, const ExprDef *expr, unsigned int *val_rtrn, const LookupEntry *values) { if (expr->expr.op != EXPR_IDENT) { log_err(ctx, "Found a %s where an enumerated value was expected\n", expr_op_type_to_string(expr->expr.op)); return false; } if (!SimpleLookup(ctx, values, expr->ident.ident, EXPR_TYPE_INT, val_rtrn)) { log_err(ctx, "Illegal identifier %s; expected one of:\n", xkb_atom_text(ctx, expr->ident.ident)); while (values && values->name) { log_err(ctx, "\t%s\n", values->name); values++; } return false; } return true; }
bool Library::process_phrase(const char *loc_str, read_line &io, bool force, bool json) { if (NULL==loc_str) return true; std::string query; analyze_query(loc_str, query); if (!query.empty()) io.add_to_history(query.c_str()); gsize bytes_read; gsize bytes_written; GError *err=NULL; char *str=NULL; if (!utf8_input) str=g_locale_to_utf8(loc_str, -1, &bytes_read, &bytes_written, &err); else str=g_strdup(loc_str); if (NULL==str) { fprintf(stderr, _("Can not convert %s to utf8.\n"), loc_str); fprintf(stderr, "%s\n", err->message); g_error_free(err); return false; } if (str[0]=='\0') return true; TSearchResultList res_list; switch (analyze_query(str, query)) { case qtFUZZY: LookupWithFuzzy(query, res_list); break; case qtREGEXP: LookupWithRule(query, res_list); break; case qtSIMPLE: SimpleLookup(str, res_list); if (res_list.empty()) LookupWithFuzzy(str, res_list); break; case qtDATA: LookupData(query, res_list); break; default: /*nothing*/; } if (!res_list.empty()) { /* try to be more clever, if there are one or zero results per dictionary show all */ bool show_all_results=true; typedef std::map< string, int, std::less<string> > DictResMap; if (!force) { DictResMap res_per_dict; for(TSearchResultList::iterator ptr=res_list.begin(); ptr!=res_list.end(); ++ptr){ std::pair<DictResMap::iterator, DictResMap::iterator> r = res_per_dict.equal_range(ptr->bookname); DictResMap tmp(r.first, r.second); if (tmp.empty()) //there are no yet such bookname in map res_per_dict.insert(DictResMap::value_type(ptr->bookname, 1)); else { ++((tmp.begin())->second); if (tmp.begin()->second>1) { show_all_results=false; break; } } } }//if (!force) if (!show_all_results && !force) { printf(_("Found %d items, similar to %s.\n"), res_list.size(), utf8_output ? str : utf8_to_locale_ign_err(str).c_str()); for (size_t i=0; i<res_list.size(); ++i) { string loc_bookname, loc_def; loc_bookname=utf8_to_locale_ign_err(res_list[i].bookname); loc_def=utf8_to_locale_ign_err(res_list[i].def); printf("%d)%s-->%s\n", i, utf8_output ? res_list[i].bookname.c_str() : loc_bookname.c_str(), utf8_output ? res_list[i].def.c_str() : loc_def.c_str()); } int choise; for (;;) { string str_choise; printf(_("Your choice[-1 to abort]: ")); if(!stdio_getline(stdin, str_choise)){ putchar('\n'); exit(EXIT_SUCCESS); } sscanf(str_choise.c_str(), "%d", &choise); if (choise>=0 && choise<int(res_list.size())) { sdcv_pager pager; print_search_result(pager.get_stream(), res_list[choise]); break; } else if (choise==-1) break; else printf(_("Invalid choise.\nIt must be from 0 to %d or -1.\n"), res_list.size()-1); } } else { sdcv_pager pager(force); if (!json) { fprintf(pager.get_stream(), _("Found %d items, similar to %s.\n"), res_list.size(), utf8_output ? str : utf8_to_locale_ign_err(str).c_str()); for (PSearchResult ptr=res_list.begin(); ptr!=res_list.end(); ++ptr) print_search_result(pager.get_stream(), *ptr); } else { char *out; cJSON *root,*fld; root=cJSON_CreateArray(); for (PSearchResult ptr=res_list.begin(); ptr!=res_list.end(); ++ptr) { const TSearchResult & res = *ptr; string loc_bookname, loc_def, loc_exp; if(!utf8_output){ loc_bookname=utf8_to_locale_ign_err(res.bookname); loc_def=utf8_to_locale_ign_err(res.def); loc_exp=utf8_to_locale_ign_err(res.exp); } cJSON_AddItemToArray(root,fld=cJSON_CreateObject()); cJSON_AddStringToObject(fld, "dict", utf8_output ? res.bookname.c_str() : loc_bookname.c_str()); cJSON_AddStringToObject(fld, "word", utf8_output ? res.def.c_str() : loc_def.c_str()); cJSON_AddStringToObject(fld, "definition", utf8_output ? res.exp.c_str() : loc_exp.c_str()); } out=cJSON_Print(root); cJSON_Delete(root); fprintf(pager.get_stream(), "%s", out); free(out); } } } else { string loc_str; if (!utf8_output) loc_str=utf8_to_locale_ign_err(str); printf(_("Nothing similar to %s, sorry :(\n"), utf8_output ? str : loc_str.c_str()); } g_free(str); return true; }