#ifndef __GRAMSCII_H__ #define __GRAMSCII_H__ #define _POSIX_C_SOURCE 200112L #include #include #include /** constants **/ /* modes */ #define MOVE 0x00 #define BOX 0x01 #define ARROW 0x02 #define TEXT 0x04 #define DEL 0x08 #define VIS 0x10 #define PAR 0x20 #define REM 0x40 #define TRP 0x80 /**/ /* directions */ #define DIR_N 0x00 #define DIR_R 0x01 #define DIR_U 0x02 #define DIR_D 0x04 #define DIR_L 0x08 #define DIR_HOR (DIR_R | DIR_L) #define DIR_VER (DIR_D | DIR_U) /**/ /** box style **/ /* rectangular box */ #define BOX_RECT 0x00 /* parallelograms */ #define BOX_PAR 0x10 /* parallelogram (leaning right) */ #define BOX_PARR 0x11 /* parallelogram (leaning left) */ #define BOX_PARL 0x12 /* trapezium */ #define BOX_TRAP 0x20 #define BOX_TRAP_U 0x24 #define BOX_TRAP_D 0x28 #define BOX_TRAP_R 0x21 #define BOX_TRAP_C 0x22 #define BOX_TRAP_L 0x23 #define BOX_TRAP_UR 0x25 #define BOX_TRAP_UC 0x26 #define BOX_TRAP_UL 0x27 #define BOX_TRAP_DL 0x29 #define BOX_TRAP_DC 0x2a #define BOX_TRAP_DR 0x2b #define STYLE_IS(x, y) (((x) & (y) ) == y) /**/ #define NOFIX 0x0 #define FIX 0x1 /* markers */ #define BG ' ' #define PTR '+' #define UND '_' #define ARR_L '<' #define ARR_R '>' #define ARR_U '^' #define ARR_D 'v' /**/ /* global positions */ #define HOME 0x01 #define END 0x02 #define MIDDLE 0x04 /**/ /* video modes */ #define VIDEO_NRM 0 #define VIDEO_REV 7 /**/ /* undo buffer elem types */ #define PRV_STATE 0x01 #define NEW_STATE 0x02 /**/ /* file types */ #define FFILE 0x01 #define FPIPE 0x02 /** types **/ typedef struct{ int sz;/* allocated size */ int n;/* line number */ int lst;/* last visible char (before the first \0) */ char *s; } line_t; typedef struct{ int sz;/* allocated size */ int num;/* number of lines stored */ line_t *l; } lineset_t; typedef struct{ int x; int y; } pos_t; /** MACROS **/ #define MIN(x,y) (x) < (y) ? (x) : (y) #define MAX(x,y) (x) > (y) ? (x) : (y) #define progr_x(d) ((d) == DIR_L ? -1 : (d) == DIR_R ? 1 : 0) #define progr_y(d) ((d) == DIR_U ? -1 : (d) == DIR_D ? 1 : 0) /** screen-related functions **/ void reset_styles(); void redraw(); int move_around(char c, FILE *fc, char global); void check_bound(int *x, int *y); void status_bar(); void show_cursor(); void set_cur(char c); void update_current(); void set_xy(int _x, int _y, char c); void draw_xy(int x, int y, char c); char get_mark(char dir); void set_video(int v); char get_key(FILE *fc, char *msg); void get_string(FILE *fc, char *msg, char *s, int sz); void erase_box(int x1, int y1, char c); int is_yes(char c); void init_screen(); void erase_line(int i); void erase_screen(); void go_to(int where); void crop_to_nonblank(); void crop_to_rect(); void erase_blank_lines(int y1, int y2); int _isblank(int c); void mark_pos(FILE *fc); /**/ /** drawing-related functions **/ int change_style(char c); void get_text(FILE *fc); void get_box(FILE *fc, char st); void get_arrow(FILE *fc); void erase(FILE *fc); void visual_box(FILE *fc); void paste(); void undo_change(); void redo_change(); void get_comment(FILE *fc); /**/ /** file-related functions **/ void write_file(FILE *fc); void check_modified(FILE *fc); void load_file(FILE *fc); void new_file(FILE *fc); void read_file_at(FILE *fc, int xl, int yl); /**/ /** line-related functions **/ void dump_lines(lineset_t ls, FILE *f); void alloc_line(line_t *l); void ensure_line_length(line_t *l, int len); void ensure_num_lines(lineset_t *ls, int n); void yank_region(int x1, int y1, int x2, int y2); void paste_region(int x1, int y1); void copy_lines_to_ring(int y1, int y2, int which); void invalidate_undo(); /**/ void cleanup(int); #endif