ansi_terminal/test.c

239 lines
6.2 KiB
C

#include <stdlib.h>
#include <stdio.h>
#include "ansi.h"
#include "ansi_table.h"
#include "ansi_cs_table_defs.h"
#include "terminal.h"
const char test1[] = {ESC, '[', '?', '2', '3', ';', '2', '#', 'R'};
const char test2[] = "Hello, world!\r\n";
const char test3[] = {ESC, 'a', ESC, 'E', NEL};
const char test4[] = {
'0', '\r', '\n', '1', '\r', '\n', '2', '\r', '\n', '3', '\r', '\n', '4', '\r', '\n', '5', '\r', '\n',
'6', '\r', '\n', '7', '\r', '\n', '8', '\r', '\n', '9', '\r', '\n', '0', '\r', '\n', '1', '\r', '\n',
'2', '\r', '\n', '3', '\r', '\n', '4', '\r', '\n', '5', '\r', '\n', '6', '\r', '\n', '7', '\r', '\n',
'8', '\r', '\n', '9', '\r', '\n', '0', '\r', '\n', '1', '\r', '\n', '2', '\r', '\n', '3', '\r', '\n',
'4', '\r', '\n', '5', '\r', '\n', '6', '\r', '\n', '7', '\r', '\n', '8', '\r', '\n', '9', '\r', '\n',
'0', '\r', '\n', '1', '\r', '\n', '2', '\r', '\n', '3', '\r', '\n', '4', '\r', '\n', '5', '\r', '\n'
};
const char test5[] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
const char test6[] = "1\t2\t3\t4\t5\t6\t7\t8\t9\t10\t11";
const char test7[] = {
' ', '|', ' ', '|', ' ', CR, LF,
'-', '-', '-', '-', '-', CR, LF,
' ', '|', ' ', '|', ' ', CR, LF,
'-', '-', '-', '-', '-', CR, LF,
' ', '|', ' ', '|', ' ', CR, LF,
ESC, '[', 'A', ESC, '[', '4', 'A',
'X',
ESC, '[', '0', 'C',
'O',
ESC, '[', 'D', ESC, '[', '1', 'B', ESC, '[', 'B',
'X',
ESC, '[', '5', ';', '5', 'H',
'O',
ESC, '[', '5', 'f',
'X'
};
Terminal *term;
#define RUNTEST(_name) do { \
unsigned int i; \
printf("\n*** Running test %s\n", #_name); \
for (i = 0; i < sizeof _name; i++) { \
ansi_context_put(machine, _name[i]); \
} \
} while (0)
void print_function_id(struct function_id id)
{
int i, len, priv;
len = id.i_count_priv & 0x0F;
priv = !!(id.i_count_priv & 0x80);
if (priv) {
printf("P ");
}
for (i = 0; i < len; i++) {
printf("I%d=0x%02x ", i, id.intermediates[i]);
}
printf("F=0x%02x", id.final);
}
void graphic_fn(unsigned char ch)
{
Terminal_putGraphic(term, ch);
}
void control_fn(unsigned char ch)
{
switch (ch) {
case NUL:
break;
case BEL:
break;
case BS:
Terminal_backspace(term);
break;
case HT:
Terminal_horizontalTab(term, 1);
break;
case LF:
case VT:
case FF:
Terminal_lineFeed(term);
break;
case CR:
Terminal_carriageReturn(term);
break;
case IND: // Index
Terminal_cursorRel(term, DIR_DOWN, 1, 1);
break;
case NEL: // Next Line
Terminal_newLine(term);
break;
case HTS: // Horizontal Tab Set
Terminal_setTab(term);
break;
case RI: // Reverse Index
Terminal_cursorRel(term, DIR_UP, 1, 1);
break;
case SS2: // Single Shift 2
break;
case SS3: // Single Shift 3
break;
default:
printf("\\x%02x", ch);
break;
}
}
void esc_fn(struct function_id esc_id) {
printf("\nESC: ");
print_function_id(esc_id);
printf("\n");
}
void normalize_params(int in_c, unsigned int *in_v, int out_c, unsigned int *out_v)
{
int i;
for (i = 0; i < in_c && i < out_c; i++) {
if (in_v[i] != 0) {
out_v[i] = in_v[i];
}
}
}
void csi_fn(struct function_id csi_id, int paramc, unsigned int *paramv)
{
int i, icount;
unsigned int params[4];
Entry *e;
CE *ce;
icount = csi_id.i_count_priv & 0x7;
e = csi_table_lookup(&CS_Table, csi_id.i_count_priv, csi_id.intermediates, csi_id.final);
ce = (CE *)e;
if (ce) {
for (i = 0; i < ce->param_count; i++) {
params[i] = ce->param_defaults[i];
}
normalize_params(paramc, paramv, ce->param_count, params);
ce->function((void *)term, paramc, params);
}
printf("\nCSI: ");
print_function_id(csi_id);
for (i = 0; i < paramc; i++) {
printf(" P%d=%d", i, paramv[i]);
}
printf("\n");
}
void str_put(void *user_ctx, unsigned char ch)
{
(void)user_ctx;
printf("<%c> ", ch);
}
void str_fn(struct str_hook *hook, struct function_id id, int c, unsigned int *v)
{
hook->user_ctx = NULL;
hook->handler_fn = str_put;
int i;
printf("\nSTR: ");
print_function_id(id);
for (i = 0; i < c; i++) {
printf(" P%d=%d", i, v[i]);
}
printf(": ");
}
void osc_fn(struct osc_hook *hook)
{
hook->user_ctx = NULL;
hook->handler_fn = str_put;
printf("\nOSC: ");
}
int main(void) {
struct ansi_actions actions = {
graphic_fn,
control_fn,
esc_fn,
csi_fn,
str_fn,
osc_fn
};
struct ansi_context *machine = new_ansi_context(&actions);
term = Terminal_new();
RUNTEST(test1);
printf("---Terminal Buffer--------------\n");
Terminal_bufferDump(term);
printf("--------------------------------\n");
Terminal_init(term);
RUNTEST(test2);
printf("---Terminal Buffer--------------\n");
Terminal_bufferDump(term);
printf("--------------------------------\n");
Terminal_init(term);
RUNTEST(test3);
printf("---Terminal Buffer--------------\n");
Terminal_bufferDump(term);
printf("--------------------------------\n");
Terminal_init(term);
RUNTEST(test4);
printf("---Terminal Buffer--------------\n");
Terminal_bufferDump(term);
printf("--------------------------------\n");
Terminal_init(term);
RUNTEST(test5);
printf("---Terminal Buffer--------------\n");
Terminal_bufferDump(term);
printf("--------------------------------\n");
Terminal_init(term);
Terminal_setAutoWrap(term, 1);
RUNTEST(test5);
printf("---Terminal Buffer--------------\n");
Terminal_bufferDump(term);
printf("--------------------------------\n");
Terminal_init(term);
RUNTEST(test6);
printf("---Terminal Buffer--------------\n");
Terminal_bufferDump(term);
printf("--------------------------------\n");
Terminal_init(term);
RUNTEST(test7);
printf("---Terminal Buffer--------------\n");
Terminal_bufferDump(term);
printf("--------------------------------\n");
Terminal_init(term);
return 0;
}