aboutsummaryrefslogtreecommitdiff
path: root/sayeth.h
blob: dea73c9c2f7b368b6a58eb9856e4c9c09a874de5 (plain) (blame)
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
#ifndef SAYETH_SAYETH_H
#define SAYETH_SAYETH_H
#include <stdlib.h>

// Maximum length of input text
#define INPUT_BUFSIZ 4096

// Maximum length of art data
#define DATA_BUFSIZ 8192

// Seed global driver array with n records
#define DRIVERS_ALLOC_DEFAULT 128

struct Driver {
    char *name;            // Driver name (passed to '-d' argument)
    size_t box_indent;     // Shift box n columns to the right
    char *box_elements;    // Border characters
                           // top left, top, top right, sides, bottom left, bottom, bottom right
                           // e.g. "/-\|\-/'
                           /*
                            * /--------\
                            * |        |
                            * \--------/
                            */
    size_t caret_pos;      // Above or below the box
    size_t caret_indent;   // Shift caret n columns to the right
    size_t caret_attached; // Inject a new line *after* art data, or not?
    char *caret;           // Caret characters
                           // e.g. "\n \  |\n  \ |\n   \|\n"
                           /*
                            * \  |
                            *  \ |
                            *   \|
                            */
    size_t data_indent;    // Shift art data n columns to the right
    char *data;            // Art data (up to size: DATA_BUFSIZ - 1)
};

void repchar(char ch, size_t limit);
size_t get_longest_line(char *s);

struct Driver *driver_load(char *filename);
struct Driver *driver_lookup(char *name);
int driver_register(struct Driver *driver);
void driver_run(struct Driver *driver, char *input);
void drivers_free(void);

void box_draw_top(size_t y, size_t longest);
void box_draw_bottom(size_t y, size_t longest);
void box_draw_next_line(size_t y);
void box_draw_end_line(size_t longest, size_t len);
int box_printf(const char *fmt, ...);

void caret_draw(char *data, size_t indent, size_t attached);
void data_draw(char *data, size_t indent);
#endif //SAYETH_SAYETH_H