/*
 * ansi.h
 */

#ifndef COM32_LIB_SYS_ANSI_H
#define COM32_LIB_SYS_ANSI_H

#include <inttypes.h>
#include <stdbool.h>
#include "vesa/video.h"

#define ANSI_MAX_PARMS	16

enum ansi_state {
    st_init,
    st_esc,
    st_csi,
    st_tbl,
    st_tblc,
};

struct curxy {
    uint8_t x, y;
} __attribute__ ((packed));

struct term_state {
    enum ansi_state state;
    int nparms;			/* Number of parameters seen */
    int parms[ANSI_MAX_PARMS];
    bool pvt;			/* Private code? */
    struct curxy xy;
    struct curxy saved_xy;
    attr_t cindex;		/* SOH color index */
    uint8_t fg;
    uint8_t bg;
    uint8_t intensity;
    bool vtgraphics;		/* VT graphics on/off */
    bool underline;
    bool blink;
    bool reverse;
    bool autocr;
    bool autowrap;
    bool cursor;
};

struct ansi_ops {
    void (*erase) (const struct term_state * st, int x0, int y0, int x1,
		   int y1);
    void (*write_char) (int x, int y, uint8_t ch, const struct term_state * st);
    void (*showcursor) (const struct term_state * st);
    void (*scroll_up) (const struct term_state * st);
    void (*set_cursor) (int x, int y, bool visible);
    void (*beep) (void);
};

struct term_info {
    int rows, cols;		/* Screen size */
    int disabled;
    struct term_state *ts;
    const struct ansi_ops *op;
};

void __ansi_init(const struct term_info *ti);
void __ansi_putchar(const struct term_info *ti, uint8_t ch);
void __ansicon_beep(void);

#endif /* COM32_LIB_SYS_ANSI_H */