2 #include "wvstreamsdebugger.h"
3 #include "wvlinklist.h"
8 static set<WvStreamsDebugger*> *debuggers;
11 WvStreamsDebugger::CommandMap *WvStreamsDebugger::commands;
19 WvStreamsDebugger::add_command(
"help",
20 0, &WvStreamsDebugger::help_run_cb, 0);
24 assert(!debuggers || debuggers->empty());
26 if (WvStreamsDebugger::commands)
28 delete WvStreamsDebugger::commands;
29 WvStreamsDebugger::commands = NULL;
42 void *WvStreamsDebugger::get_command_data(WvStringParm cmd, Command *command)
46 CommandMap::iterator it = commands->find(cmd);
47 if (it == commands->end())
49 command = &it->second;
53 CommandDataMap::iterator it = command_data.find(cmd);
54 if (it == command_data.end())
59 cd = command->init_cb(cmd);
63 command_data[cmd] = cd;
72 WvStreamsDebugger::WvStreamsDebugger()
75 debuggers =
new set<WvStreamsDebugger*>;
76 debuggers->insert(
this);
79 CommandMap::iterator it;
80 for (it = commands->begin(); it != commands->end(); ++it)
81 get_command_data(it->first, &it->second);
85 WvStreamsDebugger::~WvStreamsDebugger()
88 CommandDataMap::iterator it;
89 for (it = command_data.begin(); it != command_data.end(); ++it)
91 CommandMap::iterator it2 = commands->find(it->first);
92 if (it2 != commands->end() && it2->second.cleanup_cb)
93 it2->second.cleanup_cb(it->first, it->second);
97 debuggers->erase(
this);
102 ResultCallback result_cb)
104 CommandMap::iterator it = commands->find(cmd);
105 if (it == commands->end())
106 return "No such command";
107 Command *command = &it->second;
109 return command->run_cb(cmd, args, result_cb,
110 get_command_data(cmd, command));
114 bool WvStreamsDebugger::add_command(WvStringParm cmd,
115 InitCallback init_cb,
117 CleanupCallback cleanup_cb)
120 commands =
new CommandMap;
122 return commands->insert(
123 std::make_pair(cmd, Command(init_cb, run_cb, cleanup_cb))).second;
127 bool WvStreamsDebugger::foreach(WvStringParm cmd, ForeachCallback foreach_cb)
129 CommandMap::iterator it = commands->find(cmd);
131 if (it == commands->end())
136 set<WvStreamsDebugger*>::iterator it2;
137 for (it2 = debuggers->begin(); it2 != debuggers->end(); ++it2)
139 void *cd = (*it2)->get_command_data(cmd, &it->second);
148 WvString WvStreamsDebugger::help_run_cb(WvStringParm cmd,
150 ResultCallback result_cb,
void *)
153 cmd_list.append(
"Commands available:");
154 CommandMap::iterator it;
155 for (it = commands->begin(); it != commands->end(); ++it)
156 cmd_list.append(it->first);
157 result_cb(cmd, cmd_list);
158 return WvString::null;