Mercurial > hg
annotate mcabber/src/hbuf.c @ 1216:8645b5166040
Use Mercurial changeset by default
This is advised for entity capabilities to be more efficient.
author | Mikael Berthe <mikael@lilotux.net> |
---|---|
date | Tue, 08 May 2007 10:14:57 +0200 |
parents | 2de8f8ba1f34 |
children | 79c396678f1b |
rev | line source |
---|---|
71 | 1 /* |
2 * hbuf.c -- History buffer implementation | |
393 | 3 * |
1205 | 4 * Copyright (C) 2005-2007 Mikael Berthe <mikael@lilotux.net> |
71 | 5 * |
6 * This program is free software; you can redistribute it and/or modify | |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or (at | |
9 * your option) any later version. | |
10 * | |
11 * This program is distributed in the hope that it will be useful, but | |
12 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 * General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License | |
17 * along with this program; if not, write to the Free Software | |
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 | |
19 * USA | |
20 */ | |
21 | |
22 #include <string.h> | |
23 | |
24 #include "hbuf.h" | |
804
339c76ed5c0d
Remove a warning on Cygwin (implicit strcasestr() declaration)
Mikael Berthe <mikael@lilotux.net>
parents:
790
diff
changeset
|
25 #include "utils.h" |
930
a75f7a13df7b
UTF-8 terminal support (Reimar Döffinger)
Mikael Berthe <mikael@lilotux.net>
parents:
924
diff
changeset
|
26 #include "utf8.h" |
71 | 27 |
28 | |
29 /* This is a private structure type */ | |
30 | |
31 typedef struct { | |
32 char *ptr; | |
182 | 33 char *ptr_end; // beginning of the block |
34 char *ptr_end_alloc; // end of the current persistent block | |
71 | 35 guchar flags; |
36 | |
37 // XXX This should certainly be a pointer, and be allocated only when needed | |
38 // (for ex. when HBB_FLAG_PERSISTENT is set). | |
39 struct { // hbuf_line_info | |
184 | 40 time_t timestamp; |
850
d0781ca2dd08
Use new status buffer window
Mikael Berthe <mikael@lilotux.net>
parents:
804
diff
changeset
|
41 guint flags; |
184 | 42 } prefix; |
71 | 43 } hbuf_block; |
44 | |
45 | |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
46 // do_wrap(p_hbuf, first_hbuf_elt, width) |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
47 // Wrap hbuf lines with the specified width. |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
48 // '\n' are handled by this routine (they are removed and persistent lines |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
49 // are created). |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
50 // All hbuf elements are processed, starting from first_hbuf_elt. |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
51 static inline void do_wrap(GList **p_hbuf, GList *first_hbuf_elt, |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
52 unsigned int width) |
71 | 53 { |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
54 GList *curr_elt = first_hbuf_elt; |
942
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
55 |
71 | 56 // Let's add non-persistent blocs if necessary |
57 // - If there are '\n' in the string | |
58 // - If length > width (and width != 0) | |
942
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
59 while (curr_elt) { |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
60 hbuf_block *hbuf_b_curr, *hbuf_b_prev; |
942
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
61 char *c, *end; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
62 char *br = NULL; // break pointer |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
63 char *cr = NULL; // CR pointer |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
64 unsigned int cur_w = 0; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
65 |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
66 // We want to break where we can find a space char or a CR |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
67 |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
68 hbuf_b_curr = (hbuf_block*)(curr_elt->data); |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
69 hbuf_b_prev = hbuf_b_curr; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
70 c = hbuf_b_curr->ptr; |
71 | 71 |
942
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
72 while (*c && (!width || cur_w <= width)) { |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
73 if (*c == '\n') { |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
74 br = cr = c; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
75 *c = 0; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
76 break; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
77 } |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
78 if (iswblank(get_char(c))) |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
79 br = c; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
80 cur_w += get_char_width(c); |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
81 c = next_char(c); |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
82 } |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
83 |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
84 if (cr || (*c && cur_w > width)) { |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
85 if (!br || br == hbuf_b_curr->ptr) |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
86 br = c; |
71 | 87 else |
942
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
88 br = next_char(br); |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
89 end = hbuf_b_curr->ptr_end; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
90 hbuf_b_curr->ptr_end = br; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
91 // Create another block |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
92 hbuf_b_curr = g_new0(hbuf_block, 1); |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
93 // The block must be persistent after a CR |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
94 if (cr) { |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
95 hbuf_b_curr->ptr = hbuf_b_prev->ptr_end + 1; // == cr+1 |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
96 hbuf_b_curr->flags = HBB_FLAG_PERSISTENT; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
97 } else { |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
98 hbuf_b_curr->ptr = hbuf_b_prev->ptr_end; // == br |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
99 hbuf_b_curr->flags = 0; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
100 } |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
101 hbuf_b_curr->ptr_end = end; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
102 hbuf_b_curr->ptr_end_alloc = hbuf_b_prev->ptr_end_alloc; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
103 // This is OK because insert_before(NULL) == append(): |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
104 *p_hbuf = g_list_insert_before(*p_hbuf, curr_elt->next, hbuf_b_curr); |
71 | 105 } |
942
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
106 curr_elt = g_list_next(curr_elt); |
71 | 107 } |
108 } | |
109 | |
1141
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
110 // hbuf_add_line(p_hbuf, text, prefix_flags, width, maxhbufblocks) |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
111 // Add a line to the given buffer. If width is not null, then lines are |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
112 // wrapped at this length. |
1141
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
113 // maxhbufblocks is the maximum number of hbuf blocks we can allocate. If |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
114 // null, there is no limit. If non-null, it should be >= 2. |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
115 // |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
116 // Note 1: Splitting according to width won't work if there are tabs; they |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
117 // should be expanded before. |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
118 // Note 2: width does not include the ending \0. |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
119 void hbuf_add_line(GList **p_hbuf, const char *text, time_t timestamp, |
1141
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
120 guint prefix_flags, guint width, guint maxhbufblocks) |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
121 { |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
122 GList *curr_elt; |
1141
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
123 char *line; |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
124 hbuf_block *hbuf_block_elt; |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
125 |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
126 if (!text) return; |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
127 |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
128 hbuf_block_elt = g_new0(hbuf_block, 1); |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
129 hbuf_block_elt->prefix.timestamp = timestamp; |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
130 hbuf_block_elt->prefix.flags = prefix_flags; |
1011
b5bcc223cf51
Fix a bug in hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents:
943
diff
changeset
|
131 if (!*p_hbuf) { |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
132 hbuf_block_elt->ptr = g_new(char, HBB_BLOCKSIZE); |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
133 hbuf_block_elt->flags = HBB_FLAG_ALLOC | HBB_FLAG_PERSISTENT; |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
134 hbuf_block_elt->ptr_end_alloc = hbuf_block_elt->ptr + HBB_BLOCKSIZE; |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
135 } else { |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
136 hbuf_block *hbuf_b_prev; |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
137 // Set p_hbuf to the end of the list, to speed up history loading |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
138 // (or CPU time will be used by g_list_last() for each line) |
1011
b5bcc223cf51
Fix a bug in hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents:
943
diff
changeset
|
139 *p_hbuf = g_list_last(*p_hbuf); |
b5bcc223cf51
Fix a bug in hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents:
943
diff
changeset
|
140 hbuf_b_prev = (*p_hbuf)->data; |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
141 hbuf_block_elt->ptr = hbuf_b_prev->ptr_end; |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
142 hbuf_block_elt->flags = HBB_FLAG_PERSISTENT; |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
143 hbuf_block_elt->ptr_end_alloc = hbuf_b_prev->ptr_end_alloc; |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
144 } |
1011
b5bcc223cf51
Fix a bug in hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents:
943
diff
changeset
|
145 *p_hbuf = g_list_append(*p_hbuf, hbuf_block_elt); |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
146 |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
147 if (strlen(text) >= HBB_BLOCKSIZE) { |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
148 // Too long |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
149 text = "[ERR:LINE_TOO_LONG]"; |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
150 hbuf_block_elt->prefix.flags |= HBB_PREFIX_INFO; |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
151 } |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
152 if (hbuf_block_elt->ptr + strlen(text) >= hbuf_block_elt->ptr_end_alloc) { |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
153 // Too long for the current allocated bloc, we need another one |
1141
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
154 if (!maxhbufblocks) { |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
155 // No limit, let's allocate a new block |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
156 hbuf_block_elt->ptr = g_new0(char, HBB_BLOCKSIZE); |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
157 } else { |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
158 GList *hbuf_head, *hbuf_elt; |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
159 hbuf_block *hbuf_b_elt; |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
160 guint n = 0; |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
161 hbuf_head = g_list_first(*p_hbuf); |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
162 // We need at least 2 allocated blocks |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
163 if (maxhbufblocks == 1) |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
164 maxhbufblocks = 2; |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
165 // Let's count the number of allocated areas |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
166 for (hbuf_elt = hbuf_head; hbuf_elt; hbuf_elt = g_list_next(hbuf_elt)) { |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
167 hbuf_b_elt = (hbuf_block*)(hbuf_elt->data); |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
168 if (hbuf_b_elt->flags & HBB_FLAG_ALLOC) |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
169 n++; |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
170 } |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
171 // If we can't allocate a new area, reuse the previous block(s) |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
172 if (n < maxhbufblocks) { |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
173 hbuf_block_elt->ptr = g_new0(char, HBB_BLOCKSIZE); |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
174 } else { |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
175 // Let's use an old block, and free the extra blocks if needed |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
176 char *allocated_block = NULL; |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
177 while (n >= maxhbufblocks) { |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
178 /* --- */ |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
179 int start_of_block = 1; |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
180 for (hbuf_elt = hbuf_head; hbuf_elt; hbuf_elt = hbuf_head) { |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
181 hbuf_b_elt = (hbuf_block*)(hbuf_elt->data); |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
182 if (hbuf_b_elt->flags & HBB_FLAG_ALLOC) { |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
183 if (start_of_block-- == 0) |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
184 break; |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
185 if (n == maxhbufblocks) |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
186 allocated_block = hbuf_b_elt->ptr; |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
187 else |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
188 g_free(hbuf_b_elt->ptr); |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
189 } |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
190 g_free(hbuf_b_elt); |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
191 hbuf_head = *p_hbuf = g_list_delete_link(hbuf_head, hbuf_elt); |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
192 } |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
193 n--; |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
194 /* --- */ |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
195 } |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
196 memset(allocated_block, 0, HBB_BLOCKSIZE); |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
197 hbuf_block_elt->ptr = allocated_block; |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
198 } |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
199 } |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
200 hbuf_block_elt->flags = HBB_FLAG_ALLOC | HBB_FLAG_PERSISTENT; |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
201 hbuf_block_elt->ptr_end_alloc = hbuf_block_elt->ptr + HBB_BLOCKSIZE; |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
202 } |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
203 |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
204 line = hbuf_block_elt->ptr; |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
205 // Ok, now we can copy the text.. |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
206 strcpy(line, text); |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
207 hbuf_block_elt->ptr_end = line + strlen(line) + 1; |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
208 |
1011
b5bcc223cf51
Fix a bug in hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents:
943
diff
changeset
|
209 curr_elt = g_list_last(*p_hbuf); |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
210 |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
211 // Wrap lines and handle CRs ('\n') |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
212 do_wrap(p_hbuf, curr_elt, width); |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
213 } |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
214 |
71 | 215 // hbuf_free() |
216 // Destroys all hbuf list. | |
217 void hbuf_free(GList **p_hbuf) | |
218 { | |
219 hbuf_block *hbuf_b_elt; | |
220 GList *hbuf_elt; | |
221 GList *first_elt = g_list_first(*p_hbuf); | |
222 | |
223 for (hbuf_elt = first_elt; hbuf_elt; hbuf_elt = g_list_next(hbuf_elt)) { | |
224 hbuf_b_elt = (hbuf_block*)(hbuf_elt->data); | |
225 if (hbuf_b_elt->flags & HBB_FLAG_ALLOC) { | |
226 g_free(hbuf_b_elt->ptr); | |
227 } | |
390 | 228 g_free(hbuf_b_elt); |
71 | 229 } |
230 | |
893
92aaf2af786b
Fix a small memory leak in /buffer purge
Mikael Berthe <mikael@lilotux.net>
parents:
852
diff
changeset
|
231 g_list_free(first_elt); |
71 | 232 *p_hbuf = NULL; |
233 } | |
234 | |
235 // hbuf_rebuild() | |
236 // Rebuild all hbuf list, with the new width. | |
237 // If width == 0, lines are not wrapped. | |
238 void hbuf_rebuild(GList **p_hbuf, unsigned int width) | |
239 { | |
240 GList *first_elt, *curr_elt, *next_elt; | |
241 hbuf_block *hbuf_b_curr, *hbuf_b_next; | |
242 | |
150 | 243 // *p_hbuf needs to be the head of the list |
244 first_elt = *p_hbuf = g_list_first(*p_hbuf); | |
71 | 245 |
246 // #1 Remove non-persistent blocks (ptr_end should be updated!) | |
247 curr_elt = first_elt; | |
248 while (curr_elt) { | |
249 next_elt = g_list_next(curr_elt); | |
250 // Last element? | |
251 if (!next_elt) | |
252 break; | |
253 hbuf_b_curr = (hbuf_block*)(curr_elt->data); | |
254 hbuf_b_next = (hbuf_block*)(next_elt->data); | |
255 // Is next line not-persistent? | |
256 if (!(hbuf_b_next->flags & HBB_FLAG_PERSISTENT)) { | |
257 hbuf_b_curr->ptr_end = hbuf_b_next->ptr_end; | |
390 | 258 g_free(hbuf_b_next); |
790
5d4ad1d77da4
Kill a few gcc4 warnings
Mikael Berthe <mikael@lilotux.net>
parents:
733
diff
changeset
|
259 curr_elt = g_list_delete_link(curr_elt, next_elt); |
393 | 260 } else |
71 | 261 curr_elt = next_elt; |
262 } | |
263 // #2 Go back to head and create non-persistent blocks when needed | |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
264 if (width) |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
265 do_wrap(p_hbuf, first_elt, width); |
71 | 266 } |
267 | |
189 | 268 // hbuf_previous_persistent() |
269 // Returns the previous persistent block (line). If the given line is | |
270 // persistent, then it is returned. | |
271 // This function is used for example when resizing a buffer. If the top of the | |
272 // screen is on a non-persistent block, then a screen resize could destroy this | |
273 // line... | |
274 GList *hbuf_previous_persistent(GList *l_line) | |
275 { | |
276 hbuf_block *hbuf_b_elt; | |
277 | |
278 while (l_line) { | |
279 hbuf_b_elt = (hbuf_block*)l_line->data; | |
280 if (hbuf_b_elt->flags & HBB_FLAG_PERSISTENT) | |
281 return l_line; | |
282 l_line = g_list_previous(l_line); | |
283 } | |
284 | |
285 return NULL; | |
286 } | |
287 | |
368
da50f08ea058
Update hbuf_get_lines() comment
Mikael Berthe <mikael@lilotux.net>
parents:
197
diff
changeset
|
288 // hbuf_get_lines(hbuf, n) |
370
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
289 // Returns an array of n hbb_line pointers |
71 | 290 // (The first line will be the line currently pointed by hbuf) |
898
c65b71dcda94
Fix memory leak in scr_UpdateWindow()
Mikael Berthe <mikael@lilotux.net>
parents:
893
diff
changeset
|
291 // Note: The caller should free the array, the hbb_line pointers and the |
c65b71dcda94
Fix memory leak in scr_UpdateWindow()
Mikael Berthe <mikael@lilotux.net>
parents:
893
diff
changeset
|
292 // text pointers after use. |
184 | 293 hbb_line **hbuf_get_lines(GList *hbuf, unsigned int n) |
71 | 294 { |
295 unsigned int i; | |
729
39f67cade02c
Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
296 hbuf_block *blk; |
1204
e802ec0c02d2
Basic support for nick highlighting in MUC rooms (the whole line is colored)
Mikael Berthe <mikael@lilotux.net>
parents:
1141
diff
changeset
|
297 guint last_persist_prefixflags = 0; |
733
c502bfe67c31
Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
298 GList *last_persist; // last persistent flags |
852
a3b8956db7bc
hbuf: minor fixes and typos
Mikael Berthe <mikael@lilotux.net>
parents:
850
diff
changeset
|
299 hbb_line **array, **array_elt; |
729
39f67cade02c
Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
300 |
733
c502bfe67c31
Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
301 // To be able to correctly highlight multi-line messages, |
c502bfe67c31
Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
302 // we need to look at the last non-null prefix, which should be the first |
c502bfe67c31
Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
303 // line of the message. |
729
39f67cade02c
Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
304 last_persist = hbuf_previous_persistent(hbuf); |
733
c502bfe67c31
Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
305 while (last_persist) { |
c502bfe67c31
Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
306 blk = (hbuf_block*)last_persist->data; |
c502bfe67c31
Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
307 if ((blk->flags & HBB_FLAG_PERSISTENT) && blk->prefix.flags) { |
c502bfe67c31
Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
308 last_persist_prefixflags = blk->prefix.flags; |
c502bfe67c31
Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
309 break; |
c502bfe67c31
Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
310 } |
c502bfe67c31
Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
311 last_persist = g_list_previous(last_persist); |
729
39f67cade02c
Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
312 } |
71 | 313 |
852
a3b8956db7bc
hbuf: minor fixes and typos
Mikael Berthe <mikael@lilotux.net>
parents:
850
diff
changeset
|
314 array = g_new0(hbb_line*, n); |
a3b8956db7bc
hbuf: minor fixes and typos
Mikael Berthe <mikael@lilotux.net>
parents:
850
diff
changeset
|
315 array_elt = array; |
71 | 316 |
852
a3b8956db7bc
hbuf: minor fixes and typos
Mikael Berthe <mikael@lilotux.net>
parents:
850
diff
changeset
|
317 for (i = 0 ; i < n ; i++) { |
71 | 318 if (hbuf) { |
319 int maxlen; | |
729
39f67cade02c
Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
320 blk = (hbuf_block*)(hbuf->data); |
71 | 321 maxlen = blk->ptr_end - blk->ptr; |
184 | 322 *array_elt = (hbb_line*)g_new(hbb_line, 1); |
323 (*array_elt)->timestamp = blk->prefix.timestamp; | |
324 (*array_elt)->flags = blk->prefix.flags; | |
325 (*array_elt)->text = g_strndup(blk->ptr, maxlen); | |
326 | |
733
c502bfe67c31
Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
327 if ((blk->flags & HBB_FLAG_PERSISTENT) && blk->prefix.flags) { |
729
39f67cade02c
Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
328 last_persist_prefixflags = blk->prefix.flags; |
39f67cade02c
Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
329 } else { |
1204
e802ec0c02d2
Basic support for nick highlighting in MUC rooms (the whole line is colored)
Mikael Berthe <mikael@lilotux.net>
parents:
1141
diff
changeset
|
330 // Propagate highlighting flags |
e802ec0c02d2
Basic support for nick highlighting in MUC rooms (the whole line is colored)
Mikael Berthe <mikael@lilotux.net>
parents:
1141
diff
changeset
|
331 (*array_elt)->flags |= last_persist_prefixflags & |
e802ec0c02d2
Basic support for nick highlighting in MUC rooms (the whole line is colored)
Mikael Berthe <mikael@lilotux.net>
parents:
1141
diff
changeset
|
332 (HBB_PREFIX_HLIGHT_OUT | HBB_PREFIX_HLIGHT); |
729
39f67cade02c
Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
333 } |
39f67cade02c
Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
334 |
71 | 335 hbuf = g_list_next(hbuf); |
336 } else | |
184 | 337 break; |
338 | |
339 array_elt++; | |
71 | 340 } |
341 | |
342 return array; | |
343 } | |
344 | |
370
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
345 // hbuf_search(hbuf, direction, string) |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
346 // Look backward/forward for a line containing string in the history buffer |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
347 // Search starts at hbuf, and goes forward if direction == 1, backward if -1 |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
348 GList *hbuf_search(GList *hbuf, int direction, const char *string) |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
349 { |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
350 hbuf_block *blk; |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
351 |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
352 for (;;) { |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
353 if (direction > 0) |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
354 hbuf = g_list_next(hbuf); |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
355 else |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
356 hbuf = g_list_previous(hbuf); |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
357 |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
358 if (!hbuf) break; |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
359 |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
360 blk = (hbuf_block*)(hbuf->data); |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
361 // XXX blk->ptr is (maybe) not really correct, because the match should |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
362 // not be after ptr_end. We should check that... |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
363 if (strcasestr(blk->ptr, string)) |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
364 break; |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
365 } |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
366 |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
367 return hbuf; |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
368 } |
462 | 369 |
464 | 370 // hbuf_jump_date(hbuf, t) |
371 // Return a pointer to the first line after date t in the history buffer | |
372 GList *hbuf_jump_date(GList *hbuf, time_t t) | |
373 { | |
374 hbuf_block *blk; | |
375 | |
376 hbuf = g_list_first(hbuf); | |
377 | |
378 for ( ; hbuf && g_list_next(hbuf); hbuf = g_list_next(hbuf)) { | |
379 blk = (hbuf_block*)(hbuf->data); | |
380 if (blk->prefix.timestamp >= t) break; | |
381 } | |
382 | |
383 return hbuf; | |
384 } | |
385 | |
462 | 386 // hbuf_jump_percent(hbuf, pc) |
387 // Return a pointer to the line at % pc of the history buffer | |
388 GList *hbuf_jump_percent(GList *hbuf, int pc) | |
389 { | |
390 guint hlen; | |
391 | |
392 hbuf = g_list_first(hbuf); | |
393 hlen = g_list_length(hbuf); | |
394 | |
395 return g_list_nth(hbuf, pc*hlen/100); | |
396 } | |
576 | 397 |
580 | 398 /* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ |