Mercurial > hg
annotate mcabber/src/hbuf.c @ 1381:40095d413da9
Fix compilation on OpenBSD
This patch fixes compilation on some BSD systems.
Thanks to "undet" for the suggestion regarding DATA_DIR.
author | Mikael Berthe <mikael@lilotux.net> |
---|---|
date | Sun, 02 Dec 2007 10:36:42 +0100 |
parents | ff1f6facdc0c |
children | 366ef500c522 |
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; |
1290
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1268
diff
changeset
|
41 unsigned mucnicklen; |
850
d0781ca2dd08
Use new status buffer window
Mikael Berthe <mikael@lilotux.net>
parents:
804
diff
changeset
|
42 guint flags; |
184 | 43 } prefix; |
71 | 44 } hbuf_block; |
45 | |
46 | |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
47 // do_wrap(p_hbuf, first_hbuf_elt, width) |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
48 // Wrap hbuf lines with the specified width. |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
49 // '\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
|
50 // are created). |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
51 // 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
|
52 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
|
53 unsigned int width) |
71 | 54 { |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
55 GList *curr_elt = first_hbuf_elt; |
942
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
56 |
71 | 57 // Let's add non-persistent blocs if necessary |
58 // - If there are '\n' in the string | |
59 // - If length > width (and width != 0) | |
942
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
60 while (curr_elt) { |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
61 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
|
62 char *c, *end; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
63 char *br = NULL; // break pointer |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
64 char *cr = NULL; // CR pointer |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
65 unsigned int cur_w = 0; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
66 |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
67 // 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
|
68 |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
69 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
|
70 hbuf_b_prev = hbuf_b_curr; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
71 c = hbuf_b_curr->ptr; |
71 | 72 |
942
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
73 while (*c && (!width || cur_w <= width)) { |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
74 if (*c == '\n') { |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
75 br = cr = c; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
76 *c = 0; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
77 break; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
78 } |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
79 if (iswblank(get_char(c))) |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
80 br = c; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
81 cur_w += get_char_width(c); |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
82 c = next_char(c); |
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 |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
85 if (cr || (*c && cur_w > width)) { |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
86 if (!br || br == hbuf_b_curr->ptr) |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
87 br = c; |
71 | 88 else |
942
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
89 br = next_char(br); |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
90 end = hbuf_b_curr->ptr_end; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
91 hbuf_b_curr->ptr_end = br; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
92 // Create another block |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
93 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
|
94 // 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
|
95 if (cr) { |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
96 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
|
97 hbuf_b_curr->flags = HBB_FLAG_PERSISTENT; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
98 } else { |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
99 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
|
100 hbuf_b_curr->flags = 0; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
101 } |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
102 hbuf_b_curr->ptr_end = end; |
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
103 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
|
104 // 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
|
105 *p_hbuf = g_list_insert_before(*p_hbuf, curr_elt->next, hbuf_b_curr); |
71 | 106 } |
942
c6bd42119c31
Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents:
932
diff
changeset
|
107 curr_elt = g_list_next(curr_elt); |
71 | 108 } |
109 } | |
110 | |
1141
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
111 // 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
|
112 // 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
|
113 // wrapped at this length. |
1141
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
114 // 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
|
115 // 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
|
116 // |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
117 // 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
|
118 // should be expanded before. |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
119 // Note 2: width does not include the ending \0. |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
120 void hbuf_add_line(GList **p_hbuf, const char *text, time_t timestamp, |
1290
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1268
diff
changeset
|
121 guint prefix_flags, guint width, guint maxhbufblocks, |
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1268
diff
changeset
|
122 unsigned mucnicklen) |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
123 { |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
124 GList *curr_elt; |
1141
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
125 char *line; |
1364
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
126 guint hbb_blocksize, textlen; |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
127 hbuf_block *hbuf_block_elt; |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
128 |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
129 if (!text) return; |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
130 |
1364
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
131 textlen = strlen(text); |
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
132 hbb_blocksize = MAX(textlen+1, HBB_BLOCKSIZE); |
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
133 |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
134 hbuf_block_elt = g_new0(hbuf_block, 1); |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
135 hbuf_block_elt->prefix.timestamp = timestamp; |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
136 hbuf_block_elt->prefix.flags = prefix_flags; |
1290
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1268
diff
changeset
|
137 hbuf_block_elt->prefix.mucnicklen = mucnicklen; |
1011
b5bcc223cf51
Fix a bug in hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents:
943
diff
changeset
|
138 if (!*p_hbuf) { |
1364
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
139 hbuf_block_elt->ptr = g_new(char, hbb_blocksize); |
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
140 if (!hbuf_block_elt->ptr) { |
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
141 g_free(hbuf_block_elt); |
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
142 return; |
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
143 } |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
144 hbuf_block_elt->flags = HBB_FLAG_ALLOC | HBB_FLAG_PERSISTENT; |
1364
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
145 hbuf_block_elt->ptr_end_alloc = hbuf_block_elt->ptr + hbb_blocksize; |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
146 } else { |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
147 hbuf_block *hbuf_b_prev; |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
148 // 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
|
149 // (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
|
150 *p_hbuf = g_list_last(*p_hbuf); |
b5bcc223cf51
Fix a bug in hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents:
943
diff
changeset
|
151 hbuf_b_prev = (*p_hbuf)->data; |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
152 hbuf_block_elt->ptr = hbuf_b_prev->ptr_end; |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
153 hbuf_block_elt->flags = HBB_FLAG_PERSISTENT; |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
154 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
|
155 } |
1011
b5bcc223cf51
Fix a bug in hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents:
943
diff
changeset
|
156 *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
|
157 |
1364
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
158 if (hbuf_block_elt->ptr + textlen >= hbuf_block_elt->ptr_end_alloc) { |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
159 // Too long for the current allocated bloc, we need another one |
1364
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
160 if (!maxhbufblocks || textlen >= HBB_BLOCKSIZE) { |
1141
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
161 // No limit, let's allocate a new block |
1364
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
162 // If the message text is big, we won't bother to reuse an old block |
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
163 // as well (it could be too small and cause a segfault). |
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
164 hbuf_block_elt->ptr = g_new0(char, hbb_blocksize); |
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
165 hbuf_block_elt->ptr_end_alloc = hbuf_block_elt->ptr + hbb_blocksize; |
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
166 // XXX We should check the return value. |
1141
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
167 } else { |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
168 GList *hbuf_head, *hbuf_elt; |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
169 hbuf_block *hbuf_b_elt; |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
170 guint n = 0; |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
171 hbuf_head = g_list_first(*p_hbuf); |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
172 // We need at least 2 allocated blocks |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
173 if (maxhbufblocks == 1) |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
174 maxhbufblocks = 2; |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
175 // Let's count the number of allocated areas |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
176 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
|
177 hbuf_b_elt = (hbuf_block*)(hbuf_elt->data); |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
178 if (hbuf_b_elt->flags & HBB_FLAG_ALLOC) |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
179 n++; |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
180 } |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
181 // 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
|
182 if (n < maxhbufblocks) { |
1364
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
183 hbuf_block_elt->ptr = g_new0(char, hbb_blocksize); |
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
184 hbuf_block_elt->ptr_end_alloc = hbuf_block_elt->ptr + hbb_blocksize; |
1141
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
185 } else { |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
186 // 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
|
187 char *allocated_block = NULL; |
1364
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
188 char *end_of_allocated_block = NULL; |
1141
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
189 while (n >= maxhbufblocks) { |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
190 int start_of_block = 1; |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
191 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
|
192 hbuf_b_elt = (hbuf_block*)(hbuf_elt->data); |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
193 if (hbuf_b_elt->flags & HBB_FLAG_ALLOC) { |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
194 if (start_of_block-- == 0) |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
195 break; |
1364
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
196 if (n == maxhbufblocks) { |
1141
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
197 allocated_block = hbuf_b_elt->ptr; |
1364
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
198 end_of_allocated_block = hbuf_b_elt->ptr_end_alloc; |
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
199 } else { |
1141
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
200 g_free(hbuf_b_elt->ptr); |
1364
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
201 } |
1141
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
202 } |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
203 g_free(hbuf_b_elt); |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
204 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
|
205 } |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
206 n--; |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
207 } |
1364
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
208 memset(allocated_block, 0, end_of_allocated_block-allocated_block); |
1141
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
209 hbuf_block_elt->ptr = allocated_block; |
1364
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
210 hbuf_block_elt->ptr_end_alloc = end_of_allocated_block; |
1141
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
211 } |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1011
diff
changeset
|
212 } |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
213 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
|
214 } |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
215 |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
216 line = hbuf_block_elt->ptr; |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
217 // Ok, now we can copy the text.. |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
218 strcpy(line, text); |
1364
ff1f6facdc0c
Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents:
1290
diff
changeset
|
219 hbuf_block_elt->ptr_end = line + textlen + 1; |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
220 |
1011
b5bcc223cf51
Fix a bug in hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents:
943
diff
changeset
|
221 curr_elt = g_list_last(*p_hbuf); |
943
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
222 |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
223 // Wrap lines and handle CRs ('\n') |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
224 do_wrap(p_hbuf, curr_elt, width); |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
225 } |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
226 |
71 | 227 // hbuf_free() |
228 // Destroys all hbuf list. | |
229 void hbuf_free(GList **p_hbuf) | |
230 { | |
231 hbuf_block *hbuf_b_elt; | |
232 GList *hbuf_elt; | |
233 GList *first_elt = g_list_first(*p_hbuf); | |
234 | |
235 for (hbuf_elt = first_elt; hbuf_elt; hbuf_elt = g_list_next(hbuf_elt)) { | |
236 hbuf_b_elt = (hbuf_block*)(hbuf_elt->data); | |
237 if (hbuf_b_elt->flags & HBB_FLAG_ALLOC) { | |
238 g_free(hbuf_b_elt->ptr); | |
239 } | |
390 | 240 g_free(hbuf_b_elt); |
71 | 241 } |
242 | |
893
92aaf2af786b
Fix a small memory leak in /buffer purge
Mikael Berthe <mikael@lilotux.net>
parents:
852
diff
changeset
|
243 g_list_free(first_elt); |
71 | 244 *p_hbuf = NULL; |
245 } | |
246 | |
247 // hbuf_rebuild() | |
248 // Rebuild all hbuf list, with the new width. | |
249 // If width == 0, lines are not wrapped. | |
250 void hbuf_rebuild(GList **p_hbuf, unsigned int width) | |
251 { | |
252 GList *first_elt, *curr_elt, *next_elt; | |
253 hbuf_block *hbuf_b_curr, *hbuf_b_next; | |
254 | |
150 | 255 // *p_hbuf needs to be the head of the list |
256 first_elt = *p_hbuf = g_list_first(*p_hbuf); | |
71 | 257 |
258 // #1 Remove non-persistent blocks (ptr_end should be updated!) | |
259 curr_elt = first_elt; | |
260 while (curr_elt) { | |
261 next_elt = g_list_next(curr_elt); | |
262 // Last element? | |
263 if (!next_elt) | |
264 break; | |
265 hbuf_b_curr = (hbuf_block*)(curr_elt->data); | |
266 hbuf_b_next = (hbuf_block*)(next_elt->data); | |
267 // Is next line not-persistent? | |
268 if (!(hbuf_b_next->flags & HBB_FLAG_PERSISTENT)) { | |
269 hbuf_b_curr->ptr_end = hbuf_b_next->ptr_end; | |
390 | 270 g_free(hbuf_b_next); |
790
5d4ad1d77da4
Kill a few gcc4 warnings
Mikael Berthe <mikael@lilotux.net>
parents:
733
diff
changeset
|
271 curr_elt = g_list_delete_link(curr_elt, next_elt); |
393 | 272 } else |
71 | 273 curr_elt = next_elt; |
274 } | |
275 // #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
|
276 if (width) |
9ac0d166a85b
hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents:
942
diff
changeset
|
277 do_wrap(p_hbuf, first_elt, width); |
71 | 278 } |
279 | |
189 | 280 // hbuf_previous_persistent() |
281 // Returns the previous persistent block (line). If the given line is | |
282 // persistent, then it is returned. | |
283 // This function is used for example when resizing a buffer. If the top of the | |
284 // screen is on a non-persistent block, then a screen resize could destroy this | |
285 // line... | |
286 GList *hbuf_previous_persistent(GList *l_line) | |
287 { | |
288 hbuf_block *hbuf_b_elt; | |
289 | |
290 while (l_line) { | |
291 hbuf_b_elt = (hbuf_block*)l_line->data; | |
292 if (hbuf_b_elt->flags & HBB_FLAG_PERSISTENT) | |
293 return l_line; | |
294 l_line = g_list_previous(l_line); | |
295 } | |
296 | |
297 return NULL; | |
298 } | |
299 | |
368
da50f08ea058
Update hbuf_get_lines() comment
Mikael Berthe <mikael@lilotux.net>
parents:
197
diff
changeset
|
300 // hbuf_get_lines(hbuf, n) |
370
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
301 // Returns an array of n hbb_line pointers |
71 | 302 // (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
|
303 // 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
|
304 // text pointers after use. |
184 | 305 hbb_line **hbuf_get_lines(GList *hbuf, unsigned int n) |
71 | 306 { |
307 unsigned int i; | |
729
39f67cade02c
Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
308 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
|
309 guint last_persist_prefixflags = 0; |
733
c502bfe67c31
Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
310 GList *last_persist; // last persistent flags |
852
a3b8956db7bc
hbuf: minor fixes and typos
Mikael Berthe <mikael@lilotux.net>
parents:
850
diff
changeset
|
311 hbb_line **array, **array_elt; |
729
39f67cade02c
Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
312 |
733
c502bfe67c31
Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
313 // 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
|
314 // 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
|
315 // line of the message. |
729
39f67cade02c
Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
316 last_persist = hbuf_previous_persistent(hbuf); |
733
c502bfe67c31
Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
317 while (last_persist) { |
c502bfe67c31
Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
318 blk = (hbuf_block*)last_persist->data; |
c502bfe67c31
Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
319 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
|
320 last_persist_prefixflags = blk->prefix.flags; |
c502bfe67c31
Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
321 break; |
c502bfe67c31
Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
322 } |
c502bfe67c31
Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
323 last_persist = g_list_previous(last_persist); |
729
39f67cade02c
Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
324 } |
71 | 325 |
852
a3b8956db7bc
hbuf: minor fixes and typos
Mikael Berthe <mikael@lilotux.net>
parents:
850
diff
changeset
|
326 array = g_new0(hbb_line*, n); |
a3b8956db7bc
hbuf: minor fixes and typos
Mikael Berthe <mikael@lilotux.net>
parents:
850
diff
changeset
|
327 array_elt = array; |
71 | 328 |
852
a3b8956db7bc
hbuf: minor fixes and typos
Mikael Berthe <mikael@lilotux.net>
parents:
850
diff
changeset
|
329 for (i = 0 ; i < n ; i++) { |
71 | 330 if (hbuf) { |
331 int maxlen; | |
729
39f67cade02c
Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
332 blk = (hbuf_block*)(hbuf->data); |
71 | 333 maxlen = blk->ptr_end - blk->ptr; |
184 | 334 *array_elt = (hbb_line*)g_new(hbb_line, 1); |
1290
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1268
diff
changeset
|
335 (*array_elt)->timestamp = blk->prefix.timestamp; |
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1268
diff
changeset
|
336 (*array_elt)->flags = blk->prefix.flags; |
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1268
diff
changeset
|
337 (*array_elt)->mucnicklen = blk->prefix.mucnicklen; |
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1268
diff
changeset
|
338 (*array_elt)->text = g_strndup(blk->ptr, maxlen); |
184 | 339 |
733
c502bfe67c31
Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
340 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
|
341 last_persist_prefixflags = blk->prefix.flags; |
39f67cade02c
Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
342 } 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
|
343 // 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
|
344 (*array_elt)->flags |= last_persist_prefixflags & |
1268
dbc907b2d92f
Add configurable colors for info and incoming messages (Michal 'vorner' Vaner)
Mikael Berthe <mikael@lilotux.net>
parents:
1241
diff
changeset
|
345 (HBB_PREFIX_HLIGHT_OUT | HBB_PREFIX_HLIGHT | |
dbc907b2d92f
Add configurable colors for info and incoming messages (Michal 'vorner' Vaner)
Mikael Berthe <mikael@lilotux.net>
parents:
1241
diff
changeset
|
346 HBB_PREFIX_INFO | HBB_PREFIX_IN); |
dbc907b2d92f
Add configurable colors for info and incoming messages (Michal 'vorner' Vaner)
Mikael Berthe <mikael@lilotux.net>
parents:
1241
diff
changeset
|
347 //Continuation of a message - omit the prefix |
dbc907b2d92f
Add configurable colors for info and incoming messages (Michal 'vorner' Vaner)
Mikael Berthe <mikael@lilotux.net>
parents:
1241
diff
changeset
|
348 (*array_elt)->flags |= HBB_PREFIX_CONT; |
1290
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1268
diff
changeset
|
349 (*array_elt)->mucnicklen = 0;//The nick is in the first one |
729
39f67cade02c
Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
350 } |
39f67cade02c
Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
351 |
71 | 352 hbuf = g_list_next(hbuf); |
353 } else | |
184 | 354 break; |
355 | |
356 array_elt++; | |
71 | 357 } |
358 | |
359 return array; | |
360 } | |
361 | |
370
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
362 // hbuf_search(hbuf, direction, string) |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
363 // 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
|
364 // 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
|
365 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
|
366 { |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
367 hbuf_block *blk; |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
368 |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
369 for (;;) { |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
370 if (direction > 0) |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
371 hbuf = g_list_next(hbuf); |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
372 else |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
373 hbuf = g_list_previous(hbuf); |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
374 |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
375 if (!hbuf) break; |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
376 |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
377 blk = (hbuf_block*)(hbuf->data); |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
378 // 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
|
379 // not be after ptr_end. We should check that... |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
380 if (strcasestr(blk->ptr, string)) |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
381 break; |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
382 } |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
383 |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
384 return hbuf; |
dd9e2eb52916
Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents:
368
diff
changeset
|
385 } |
462 | 386 |
464 | 387 // hbuf_jump_date(hbuf, t) |
388 // Return a pointer to the first line after date t in the history buffer | |
389 GList *hbuf_jump_date(GList *hbuf, time_t t) | |
390 { | |
391 hbuf_block *blk; | |
392 | |
393 hbuf = g_list_first(hbuf); | |
394 | |
395 for ( ; hbuf && g_list_next(hbuf); hbuf = g_list_next(hbuf)) { | |
396 blk = (hbuf_block*)(hbuf->data); | |
397 if (blk->prefix.timestamp >= t) break; | |
398 } | |
399 | |
400 return hbuf; | |
401 } | |
402 | |
462 | 403 // hbuf_jump_percent(hbuf, pc) |
404 // Return a pointer to the line at % pc of the history buffer | |
405 GList *hbuf_jump_percent(GList *hbuf, int pc) | |
406 { | |
407 guint hlen; | |
408 | |
409 hbuf = g_list_first(hbuf); | |
410 hlen = g_list_length(hbuf); | |
411 | |
412 return g_list_nth(hbuf, pc*hlen/100); | |
413 } | |
576 | 414 |
1227
79c396678f1b
Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
415 #ifdef DEBUG_ENABLE |
79c396678f1b
Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
416 // hbuf_get_blocks_number() |
79c396678f1b
Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
417 // Returns the number of allocated hbuf_block's. |
79c396678f1b
Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
418 guint hbuf_get_blocks_number(GList *hbuf) |
79c396678f1b
Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
419 { |
79c396678f1b
Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
420 hbuf_block *hbuf_b_elt; |
79c396678f1b
Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
421 guint count = 0U; |
79c396678f1b
Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
422 |
79c396678f1b
Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
423 for (hbuf = g_list_first(hbuf); hbuf; hbuf = g_list_next(hbuf)) { |
79c396678f1b
Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
424 hbuf_b_elt = (hbuf_block*)(hbuf->data); |
79c396678f1b
Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
425 if (hbuf_b_elt->flags & HBB_FLAG_ALLOC) |
79c396678f1b
Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
426 count++; |
79c396678f1b
Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
427 } |
79c396678f1b
Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
428 return count; |
79c396678f1b
Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
429 } |
79c396678f1b
Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
430 #endif |
79c396678f1b
Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset
|
431 |
580 | 432 /* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ |