1) stat.
[jth@www src]$ make stat
bbs project statistics
------------------------
26 c++ source files.
17 c++ header files.
4118 total lines code.
2) vi
vi editor基本实现了,同时保留类似notepad操作的text editor
vi调用实例:
if (event.type == EV_INIT) {
user.setIntProperty("max_width", 80);
user.setIntProperty("max_height", 23);
}
int response = vi_action(user, event);
notepad调用实例:
if (event.type == EV_INIT) {
user.setIntProperty("max_width", 80);
user.setIntProperty("max_height", 23);
user.put("\n");
}
int response = edit_text_action(user, event);
以后可以实现emacs_action等,用户可以选择default editor
int response = default_editor_action(user, event)
|
+---------------+------------+-------+
vi notepad emacs ..
vi的EV_KEY_ESC处理方法:
改变socket层中接受用户输入操作和process(user_input_buffer)
iterating users {
if (user->input_idx) {
for (user->process_idx = 0; user->process_idx < user->input_idx;
user->process_idx++) {
user->process(user->inputbuf[user->process_idx]);
}
user->flush();
user->input_idx = 0;
user->process_idx = -1;
timeout.tv_sec = 0;
continue;
}
}
*注:inputbuf的获取:Read(user->socket, user->inputbuf, MAX_INPUTBUF)
这样,可以判断正processing本次用户输入buffer的位置
增加一个用户接口:
bool user.processingLastEvent()
{
return (process_idx == input_idx - 1);
}
这样,在分析ESC, ESC[A的事件时就:
switch (telnet_state) {
case TS_DATA:
switch (c) {
case IAC:
telnet_state = TS_IAC
return Event(EV_NOP);
case 27:
if (processingLastEvenet()) {
return Event(EV_KEY_ESC);
}
.....
EV_KEY_UP解释方法不变
3) flush operation
在处理完一组用户的输入数据(由select等待输入,并Read进 user.inputbuf)后
然后对反馈数据进行flush:
while (has user_to_server_data) {
process(user_to_server_data);
}
flush(server_to_user_data)
由于通常会有screen_refresh等操作,也就是整个屏幕都刷新一遍,这类操作可以优化,如果不优化,flush(server_to_user_data)中会有大量的冗余数据:
只在user.processingLastEvent()时候才真正refresh这是设计vi_editor, otepad_editor时候很重要的
...
--
FROM 61.235.136.251