summaryrefslogtreecommitdiff
path: root/LibC/termcap.cpp
blob: 1fff6aea38969548ccd92391e09e91648e43889d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <termcap.h>
#include <assert.h>
#include <string.h>
#include <stdio.h>
#include <AK/HashMap.h>
#include <AK/String.h>

//#define TERMCAP_DEBUG

extern "C" {

char PC;
char* UP;
char* BC;

int tgetent(char* bp, const char* name)
{
#ifdef TERMCAP_DEBUG
    fprintf(stderr, "tgetent: bp=%p, name='%s'\n", bp, name);
#endif
    if (!strcmp(name, "ansi")) {
        PC = '\0';
        BC = const_cast<char*>("\033[D");
        UP = const_cast<char*>("\033[A");
        return 1;
    }
    assert(false);
}

static HashMap<String, const char*>* caps = nullptr;

void ensure_caps()
{
    if (caps)
        return;
    caps = new HashMap<String, const char*>;
    caps->set("DC", "\033[%p1%dP");
    caps->set("IC", "\033[%p1%d@");
    caps->set("ce", "\033[K");
    caps->set("cl", "\033[H\033[J");
    caps->set("cr", "\015");
    caps->set("dc", "\033[P");
    caps->set("ei", "");
    caps->set("ic", "");
    caps->set("im", "");
    caps->set("kd", "\033[B");
    caps->set("kl", "\033[D");
    caps->set("kr", "\033[C");
    caps->set("ku", "\033[A");
    caps->set("ks", "");
    caps->set("ke", "");
    caps->set("le", "\033[D");
    caps->set("mm", "");
    caps->set("mo", "");
    caps->set("pc", "");
    caps->set("up", "\033[A");
    caps->set("vb", "");
    caps->set("am", "");
    caps->set("@7", "");
    caps->set("kH", "");
    caps->set("kI", "\033[L");
    caps->set("kh", "\033[H");
    caps->set("vs", "");
    caps->set("ve", "");

    caps->set("co", "80");
    caps->set("li", "25");
}

char* tgetstr(char* id, char** area)
{
    ensure_caps();
#ifdef TERMCAP_DEBUG
    fprintf(stderr, "tgetstr: id='%s'\n", id);
#endif
    auto it = caps->find(id);
    if (it != caps->end()) {
        char* ret = *area;
        const char* val = (*it).value;
        strcpy(*area, val);
        *area += strlen(val) + 1;
        return ret;
    }
    fprintf(stderr, "tgetstr: missing cap id='%s'\n", id);
    return nullptr;
}

int tgetflag(char* id)
{
#ifdef TERMCAP_DEBUG
    fprintf(stderr, "tgetflag: '%s'\n", id);
#endif
    auto it = caps->find(id);
    if (it != caps->end())
        return 1;
    return 0;
}

int tgetnum(char* id)
{
#ifdef TERMCAP_DEBUG
    fprintf(stderr, "tgetnum: '%s'\n", id);
#endif
    auto it = caps->find(id);
    if (it != caps->end())
        return atoi((*it).value);
    assert(false);
}

char* tgoto(const char* cap, int col, int row)
{
    assert(false);
}

int tputs(const char* str, int affcnt, int (*putc)(int))
{
    printf("%s", str);
    return 0;
}

}