1 /** \file
2  *  \brief Header: text keep buffer for WEdit
3  */
4 
5 #ifndef MC__EDIT_BUFFER_H
6 #define MC__EDIT_BUFFER_H
7 
8 /*** typedefs(not structures) and defined constants **********************************************/
9 
10 /*** enums ***************************************************************************************/
11 
12 /*** structures declarations (and typedefs of structures)*****************************************/
13 
14 typedef struct edit_buffer_struct
15 {
16     off_t curs1;                /* position of the cursor from the beginning of the file. */
17     off_t curs2;                /* position from the end of the file */
18     GPtrArray *b1;              /* all data up to curs1 */
19     GPtrArray *b2;              /* all data from end of file down to curs2 */
20     off_t size;                 /* file size */
21     long lines;                 /* total lines in the file */
22     long curs_line;             /* line number of the cursor. */
23 } edit_buffer_t;
24 
25 typedef struct edit_buffer_read_file_status_msg_struct
26 {
27     simple_status_msg_t status_msg;     /* base class */
28 
29     gboolean first;
30     edit_buffer_t *buf;
31     off_t loaded;
32 } edit_buffer_read_file_status_msg_t;
33 
34 /*** global variables defined in .c file *********************************************************/
35 
36 /*** declarations of public functions ************************************************************/
37 
38 void edit_buffer_init (edit_buffer_t * buf, off_t size);
39 void edit_buffer_clean (edit_buffer_t * buf);
40 
41 int edit_buffer_get_byte (const edit_buffer_t * buf, off_t byte_index);
42 #ifdef HAVE_CHARSET
43 int edit_buffer_get_utf (const edit_buffer_t * buf, off_t byte_index, int *char_length);
44 int edit_buffer_get_prev_utf (const edit_buffer_t * buf, off_t byte_index, int *char_length);
45 #endif
46 long edit_buffer_count_lines (const edit_buffer_t * buf, off_t first, off_t last);
47 off_t edit_buffer_get_bol (const edit_buffer_t * buf, off_t current);
48 off_t edit_buffer_get_eol (const edit_buffer_t * buf, off_t current);
49 GString *edit_buffer_get_word_from_pos (const edit_buffer_t * buf, off_t start_pos, off_t * start,
50                                         gsize * cut);
51 gboolean edit_buffer_find_word_start (const edit_buffer_t * buf, off_t * word_start,
52                                       gsize * word_len);
53 
54 void edit_buffer_insert (edit_buffer_t * buf, int c);
55 void edit_buffer_insert_ahead (edit_buffer_t * buf, int c);
56 int edit_buffer_delete (edit_buffer_t * buf);
57 int edit_buffer_backspace (edit_buffer_t * buf);
58 
59 off_t edit_buffer_get_forward_offset (const edit_buffer_t * buf, off_t current, long lines,
60                                       off_t upto);
61 off_t edit_buffer_get_backward_offset (const edit_buffer_t * buf, off_t current, long lines);
62 
63 off_t edit_buffer_read_file (edit_buffer_t * buf, int fd, off_t size,
64                              edit_buffer_read_file_status_msg_t * sm, gboolean * aborted);
65 off_t edit_buffer_write_file (edit_buffer_t * buf, int fd);
66 
67 int edit_buffer_calc_percent (const edit_buffer_t * buf, off_t offset);
68 
69 /*** inline functions ****************************************************************************/
70 
71 static inline int
edit_buffer_get_current_byte(const edit_buffer_t * buf)72 edit_buffer_get_current_byte (const edit_buffer_t * buf)
73 {
74     return edit_buffer_get_byte (buf, buf->curs1);
75 }
76 
77 /* --------------------------------------------------------------------------------------------- */
78 
79 static inline int
edit_buffer_get_previous_byte(const edit_buffer_t * buf)80 edit_buffer_get_previous_byte (const edit_buffer_t * buf)
81 {
82     return edit_buffer_get_byte (buf, buf->curs1 - 1);
83 }
84 
85 /* --------------------------------------------------------------------------------------------- */
86 /**
87  * Get "begin-of-line" offset of current line
88  *
89  * @param buf editor buffer
90  *
91  * @return index of first char of current line
92  */
93 
94 static inline off_t
edit_buffer_get_current_bol(const edit_buffer_t * buf)95 edit_buffer_get_current_bol (const edit_buffer_t * buf)
96 {
97     return edit_buffer_get_bol (buf, buf->curs1);
98 }
99 
100 /* --------------------------------------------------------------------------------------------- */
101 /**
102  * Get "end-of-line" offset of current line
103  *
104  * @param buf editor buffer
105  *
106  * @return index of first char of current line + 1
107  */
108 
109 static inline off_t
edit_buffer_get_current_eol(const edit_buffer_t * buf)110 edit_buffer_get_current_eol (const edit_buffer_t * buf)
111 {
112     return edit_buffer_get_eol (buf, buf->curs1);
113 }
114 
115 /* --------------------------------------------------------------------------------------------- */
116 
117 #endif /* MC__EDIT_BUFFER_H */
118