/***** * envcompleter.cc * Andy Hammerlindl 2006/07/31 * * Implements a text completion function for readline based on symbols in the * environment. *****/ #include #include "table.h" #include "envcompleter.h" namespace trans { bool basicListLoaded=false; envCompleter::symbol_list basicList; static void loadBasicList() { assert(basicListLoaded==false); #define ADD(word) basicList.push_back(symbol::literalTrans(#word)) #include "keywords.h" #undef ADD basicListLoaded=true; } void envCompleter::basicCompletions(symbol_list &l, string start) { if (!basicListLoaded) loadBasicList(); for (symbol_list::iterator p = basicList.begin(); p != basicList.end(); ++p) if (prefix(start, *p)) l.push_back(*p); } void envCompleter::makeList(const char *text) { l.clear(); basicCompletions(l, text); e.completions(l, text); index=l.begin(); } char *envCompleter::operator () (const char *text, int state) { if (state==0) makeList(text); if (index==l.end()) return 0; else { symbol name=*index; ++index; return StrdupMalloc((string)name); } } } // namespace trans