gramscii.h - gramscii - A simple editor for ASCII box-and-arrow charts DIR Log DIR Files DIR Refs DIR Tags DIR README DIR LICENSE --- gramscii.h (3758B) --- 1 #ifndef __GRAMSCII_H__ 2 #define __GRAMSCII_H__ 3 4 #define _POSIX_C_SOURCE 200112L 5 6 #include <stdio.h> 7 #include <termios.h> 8 #include <unistd.h> 9 10 11 12 /** constants **/ 13 14 /* modes */ 15 #define MOVE 0x00 16 #define BOX 0x01 17 #define ARROW 0x02 18 #define TEXT 0x04 19 #define DEL 0x08 20 #define VIS 0x10 21 #define PAR 0x20 22 #define REM 0x40 23 #define TRP 0x80 24 /**/ 25 26 /* directions */ 27 #define DIR_N 0x00 28 #define DIR_R 0x01 29 #define DIR_U 0x02 30 #define DIR_D 0x04 31 #define DIR_L 0x08 32 33 #define DIR_HOR (DIR_R | DIR_L) 34 #define DIR_VER (DIR_D | DIR_U) 35 /**/ 36 37 /** box style **/ 38 /* rectangular box */ 39 #define BOX_RECT 0x00 40 /* parallelograms */ 41 #define BOX_PAR 0x10 42 /* parallelogram (leaning right) */ 43 #define BOX_PARR 0x11 44 /* parallelogram (leaning left) */ 45 #define BOX_PARL 0x12 46 /* trapezium */ 47 #define BOX_TRAP 0x20 48 #define BOX_TRAP_U 0x24 49 #define BOX_TRAP_D 0x28 50 #define BOX_TRAP_R 0x21 51 #define BOX_TRAP_C 0x22 52 #define BOX_TRAP_L 0x23 53 #define BOX_TRAP_UR 0x25 54 #define BOX_TRAP_UC 0x26 55 #define BOX_TRAP_UL 0x27 56 #define BOX_TRAP_DL 0x29 57 #define BOX_TRAP_DC 0x2a 58 #define BOX_TRAP_DR 0x2b 59 #define STYLE_IS(x, y) (((x) & (y) ) == y) 60 /**/ 61 62 #define NOFIX 0x0 63 #define FIX 0x1 64 65 /* markers */ 66 #define BG ' ' 67 #define PTR '+' 68 #define UND '_' 69 #define ARR_L '<' 70 #define ARR_R '>' 71 #define ARR_U '^' 72 #define ARR_D 'v' 73 /**/ 74 75 /* global positions */ 76 #define HOME 0x01 77 #define END 0x02 78 #define MIDDLE 0x04 79 /**/ 80 81 /* video modes */ 82 #define VIDEO_NRM 0 83 #define VIDEO_REV 7 84 /**/ 85 86 /* undo buffer elem types */ 87 #define PRV_STATE 0x01 88 #define NEW_STATE 0x02 89 /**/ 90 91 /* file types */ 92 #define FFILE 0x01 93 #define FPIPE 0x02 94 95 /** types **/ 96 97 typedef struct{ 98 int sz;/* allocated size */ 99 int n;/* line number */ 100 int lst;/* last visible char (before the first \0) */ 101 char *s; 102 } line_t; 103 104 typedef struct{ 105 int sz;/* allocated size */ 106 int num;/* number of lines stored */ 107 line_t *l; 108 } lineset_t; 109 110 typedef struct{ 111 int x; 112 int y; 113 } pos_t; 114 115 116 /** MACROS **/ 117 118 #define MIN(x,y) (x) < (y) ? (x) : (y) 119 #define MAX(x,y) (x) > (y) ? (x) : (y) 120 121 #define progr_x(d) ((d) == DIR_L ? -1 : (d) == DIR_R ? 1 : 0) 122 #define progr_y(d) ((d) == DIR_U ? -1 : (d) == DIR_D ? 1 : 0) 123 124 125 /** screen-related functions **/ 126 void reset_styles(); 127 void redraw(); 128 int move_around(char c, FILE *fc, char global); 129 void check_bound(int *x, int *y); 130 void status_bar(); 131 void show_cursor(); 132 void set_cur(char c); 133 void update_current(); 134 void set_xy(int _x, int _y, char c); 135 void draw_xy(int x, int y, char c); 136 char get_mark(char dir); 137 void set_video(int v); 138 char get_key(FILE *fc, char *msg); 139 void get_string(FILE *fc, char *msg, char *s, int sz); 140 void erase_box(int x1, int y1, char c); 141 int is_yes(char c); 142 void init_screen(); 143 void erase_line(int i); 144 void erase_screen(); 145 void go_to(int where); 146 void crop_to_nonblank(); 147 void crop_to_rect(); 148 void erase_blank_lines(int y1, int y2); 149 int _isblank(int c); 150 void mark_pos(FILE *fc); 151 /**/ 152 153 /** drawing-related functions **/ 154 int change_style(char c); 155 void get_text(FILE *fc); 156 void get_box(FILE *fc, char st); 157 void get_arrow(FILE *fc); 158 void erase(FILE *fc); 159 void visual_box(FILE *fc); 160 void paste(); 161 void undo_change(); 162 void redo_change(); 163 void get_comment(FILE *fc); 164 /**/ 165 166 /** file-related functions **/ 167 void write_file(FILE *fc); 168 void check_modified(FILE *fc); 169 void load_file(FILE *fc); 170 void new_file(FILE *fc); 171 void read_file_at(FILE *fc, int xl, int yl); 172 /**/ 173 174 /** line-related functions **/ 175 void dump_lines(lineset_t ls, FILE *f); 176 void alloc_line(line_t *l); 177 void ensure_line_length(line_t *l, int len); 178 void ensure_num_lines(lineset_t *ls, int n); 179 void yank_region(int x1, int y1, int x2, int y2); 180 void paste_region(int x1, int y1); 181 void copy_lines_to_ring(int y1, int y2, int which); 182 void invalidate_undo(); 183 /**/ 184 185 void cleanup(int); 186 187 #endif