无头vt100仿真器
项目描述
vt100仿真器
vt100-emulator
是一个无头vt100仿真器,就像您可能每天使用的任何终端(如urxvt、xterm等)一样,但您使用的那些不是无头的,它们有图形界面与您(人类)交互)。在这里,vt100-emulator
只是实际仿真器的底层C
和Python
API,因此您可以使用它做任何您想做的事情,例如通过TCP、HTTP进行接口,在无头终端运行top
时自动测试您的malloc
实现与top
的交互, whatever pleases you。
有关版权信息,请参阅本目录或源代码树中的文件LICENSE。
安装
Python模块
pip install hl-vt100
从源安装Python模块
最简单的方法是在repo内部运行pip install .
,但如果您想构建工件,您可以使用以下方法在一个隔离的环境中构建
pip install build
python -m build
或者快速创建一个sdist
:n python setup.py sdist
在两种情况下,它都会在dist/
目录中提供一个构建工件,您也可以使用它进行pip install
。
使用Python包装器(C中的相同方法)的使用方法
import hl_vt100
def dump(vt100):
print("╭" + "─" * vt100.width + "╮")
for line in vt100.getlines():
print(f"│{line:{vt100.width}}│")
print("╰" + "─" * vt100.width + "╯")
def main():
vt100 = hl_vt100.vt100_headless()
vt100.changed_callback = lambda: dump(vt100)
vt100.fork('top', ['top'])
vt100.main_loop()
if __name__ == '__main__':
main()
使用C库的使用方法
#include <stdio.h>
#include <stdlib.h>
#include "hl_vt100.h"
void changed(struct vt100_headless *vt100)
{
const char **lines;
lines = vt100_headless_getlines(vt100);
for (unsigned int y = 0; y < vt100->term->height; ++y)
{
write(1, "|", 1);
write(1, lines[y], vt100->term->width);
write(1, "|\n", 2);
}
write(1, "\n", 1);
}
int main(int ac, char **av)
{
struct vt100_headless *vt100;
char *argv[] = {"top", NULL};
vt100 = new_vt100_headless();
vt100_headless_fork(vt100, argv[0], argv);
vt100->changed = changed;
vt100_headless_main_loop(vt100);
return EXIT_SUCCESS;
}
代码概述
lw_terminal_parser、lw_terminal_vt100和hl_vt100是三个用于仿真vt100终端的模块
-------------
| |
| Your Code |
| |
-------------
| ^
vt100 = vt100_headless_init() | |
vt100->changed = changed; | | hl_vt100 raises 'changed'
vt100_headless_fork(vt100, ... | | when the screen has changed.
| | You get the content of the screen
| | calling vt100_headless_getlines.
V |
------------- -------------
Read from PTY master and write | | | PTY | |
to lw_terminal_vt100_read_str | | hl_vt100 |<------------>| Program |
V | |Master Slave| |
------------- -------------
| |^ hl_vt100 gets lw_terminal_vt100's
| || lines by calling
| || lw_terminal_vt100_getlines
| ||
| ||
V V|
----------------------
Got data from | | | Recieve data from callbacks
lw_terminal_vt100_read_str | | lw_terminal_vt100 | And store an in-memory
give it to | | | state of the vt100 terminal
lw_terminal_parser_read_strV ----------------------
| ^
| |
| |
| |
| |
| | Callbacks
| |
| |
| |
| |
| |
V |
----------------------
Got data from | |
lw_terminal_pasrser_read_str | lw_terminal_parser |
parses, and call callbacks | |
----------------------
lw_terminal_parser
lw_terminal_parser
解析终端转义序列,在成功解析序列时调用回调,读取example/parse.c
。
提供
struct lw_terminal *lw_terminal_parser_init(void);
void lw_terminal_parser_destroy(struct lw_terminal* this);
void lw_terminal_parser_default_unimplemented(struct lw_terminal* this, char *seq, char chr);
void lw_terminal_parser_read(struct lw_terminal *this, char c);
void lw_terminal_parser_read_str(struct lw_terminal *this, char *c);
lw_terminal_vt100
连接到 lw_terminal_parser
并保持 vt100 屏幕的内存状态。
提供
struct lw_terminal_vt100 *lw_terminal_vt100_init(void *user_data, void (*unimplemented)(struct lw_terminal* term_emul, char *seq, char chr));
char lw_terminal_vt100_get(struct lw_terminal_vt100 *vt100, unsigned int x, unsigned int y);
const char **lw_terminal_vt100_getlines(struct lw_terminal_vt100 *vt100);
void lw_terminal_vt100_destroy(struct lw_terminal_vt100 *this);
void lw_terminal_vt100_read_str(struct lw_terminal_vt100 *this, char *buffer);
hl_vt100
通过 lw_terminal_vt100
演示一个程序,将它的 I/O 连接到伪终端,并模拟 vt100。
提供
void vt100_headless_fork(struct vt100_headless *this, const char *progname, char *const argv[]);
struct vt100_headless *vt100_headless_init(void);
const char **vt100_headless_getlines(struct vt100_headless *this);
项目详情
关闭
hl_vt100-0.2.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 12e60205b6bed9419b03e13e8a3f9c19a760136aceb1ebe8f703779429f56c64 |
|
MD5 | af19321cad0ddc6be80fc2026d16f98a |
|
BLAKE2b-256 | 72dfc89e98bb1d0c4dbf76d506f5c512de31455415ad8d7c13b9893b417dd3da |