00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "builtins.h"
00011 #include "editline.h"
00012 #include <string>
00013 #include <vector>
00014 #include <map>
00015
00016
00017 typedef std::vector<ElBuiltin_t*> BuiltinVec_t;
00018 typedef std::map<std::string, ElBuiltin_t> BuiltinMap_t;
00019
00020
00021
00022
00023 BuiltinMap_t&
00024 el_internal_builtins() {
00025 static BuiltinMap_t el_builtins;
00026 return el_builtins;
00027 }
00028
00029
00030 void
00031 el_builtins_init() {
00032
00033 if (0 == el_internal_builtins().size()) {
00034 el_register_function("el-bind", map_bind, "Bind keyboard commands.");
00035 el_register_function("el-echotc", term_echotc, "???");
00036 el_register_function("el-edit", el_editmode, "Toggle line-editing mode on and off.");
00037 el_register_function("el-history", hist_list, "Show command history.");
00038 el_register_function("el-telltc", term_telltc, "???");
00039 el_register_function("el-settc", term_settc, "???");
00040 el_register_function("el-setty", tty_stty, "???");
00041 el_register_function("el-help", el_func_show_function_list, "Shows list of built-in functions.");
00042 el_register_function("el-rl-reset", el_func_readline_reinit, "Re-initializes readline compatibility layer.");
00043 }
00044 }
00045
00046
00047 int el_builtins_bogo_register = (el_builtins_init(), 0);
00048
00049
00050 void
00051 el_register_function(const char* name, ElBuiltin_t::handler_func f, const char* help) {
00052 el_internal_builtins()[name] = ElBuiltin_t(name, f, help);
00053 }
00054
00055
00056 BuiltinVec_t el_builtins_vec;
00057 ElBuiltin_t**
00058 el_builtins_list(int* count) {
00059 BuiltinMap_t::iterator it = el_internal_builtins().begin();
00060 BuiltinMap_t::iterator et = el_internal_builtins().end();
00061 el_builtins_vec.clear();
00062 *count = 0;
00063
00064 for ( ; et != it; ++it) {
00065 el_builtins_vec.push_back(&(*it).second);
00066 ++*count;
00067 }
00068
00069 return &el_builtins_vec[0];
00070 }
00071
00072
00073
00074
00075
00076
00077 int
00078 el_func_readline_reinit(EditLine_t* el, int, const char**) {
00079 fprintf(el->fOutFile,
00080 "Reinitializing readline compatibility interface.\n");
00081 int ret = rl_initialize();
00082 return ret;
00083 }
00084
00085
00086
00087
00088
00089 int
00090 el_func_show_function_list(EditLine_t* el, int, const char**) {
00091 fprintf(el->fOutFile, "List of libeditline builtin functions:\n");
00092 BuiltinMap_t::iterator it = el_internal_builtins().begin();
00093 BuiltinMap_t::iterator et = el_internal_builtins().end();
00094 ElBuiltin_t* bi = 0;
00095
00096 for ( ; et != it; ++it) {
00097 bi = &((*it).second);
00098 fprintf(el->fOutFile,
00099 "%-32s\t\t%s\n",
00100 (bi->fName),
00101 ((NULL != bi->fHelp) ? bi->fHelp : "")
00102 );
00103 }
00104 return 0;
00105 }
00106
00107
00108 ElBuiltin_t*
00109 el_builtin_by_name(const char* name) {
00110 BuiltinMap_t::iterator it = el_internal_builtins().find(name);
00111 BuiltinMap_t::iterator et = el_internal_builtins().end();
00112
00113 if (et == it) {
00114 return NULL;
00115 }
00116 return &(*it).second;
00117 }