annotate mcabber/src/hbuf.c @ 1461:8fa24a6d1a93

Improve Remote Controlling Clients The XEP recommends adding the node to the IQ response. Some clients seem not to understand the answer when it is omitted. Problem reported by Rhaamo and js (thanks to js for spotting the node issue!).
author Mikael Berthe <mikael@lilotux.net>
date Sat, 12 Apr 2008 13:35:03 +0200
parents bb1cc8902d0e
children 0121b6f3047c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
1 /*
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
2 * hbuf.c -- History buffer implementation
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 392
diff changeset
3 *
1414
366ef500c522 Update copyrights
Mikael Berthe <mikael@lilotux.net>
parents: 1364
diff changeset
4 * Copyright (C) 2005-2008 Mikael Berthe <mikael@lilotux.net>
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
5 *
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
6 * This program is free software; you can redistribute it and/or modify
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
7 * it under the terms of the GNU General Public License as published by
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or (at
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
9 * your option) any later version.
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
10 *
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
11 * This program is distributed in the hope that it will be useful, but
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
14 * General Public License for more details.
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
15 *
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
17 * along with this program; if not, write to the Free Software
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
19 * USA
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
20 */
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
21
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
22 #include <string.h>
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
23
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
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
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
27
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
28
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
29 /* This is a private structure type */
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
30
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
31 typedef struct {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
32 char *ptr;
182
f7b03201877a [/trunk] Changeset 194 by mikael
mikael
parents: 153
diff changeset
33 char *ptr_end; // beginning of the block
f7b03201877a [/trunk] Changeset 194 by mikael
mikael
parents: 153
diff changeset
34 char *ptr_end_alloc; // end of the current persistent block
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
35 guchar flags;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
36
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
37 // XXX This should certainly be a pointer, and be allocated only when needed
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
38 // (for ex. when HBB_FLAG_PERSISTENT is set).
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
39 struct { // hbuf_line_info
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
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
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
43 } prefix;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
44 } hbuf_block;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
45
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
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
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
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
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
57 // Let's add non-persistent blocs if necessary
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
58 // - If there are '\n' in the string
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
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
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
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
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
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
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
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
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
108 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
109 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
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
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
227 // hbuf_free()
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
228 // Destroys all hbuf list.
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
229 void hbuf_free(GList **p_hbuf)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
230 {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
231 hbuf_block *hbuf_b_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
232 GList *hbuf_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
233 GList *first_elt = g_list_first(*p_hbuf);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
234
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
235 for (hbuf_elt = first_elt; hbuf_elt; hbuf_elt = g_list_next(hbuf_elt)) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
236 hbuf_b_elt = (hbuf_block*)(hbuf_elt->data);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
237 if (hbuf_b_elt->flags & HBB_FLAG_ALLOC) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
238 g_free(hbuf_b_elt->ptr);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
239 }
390
468c9cac2798 Minor changes to hbuf.c
Mikael Berthe <mikael@lilotux.net>
parents: 370
diff changeset
240 g_free(hbuf_b_elt);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
241 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
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
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
244 *p_hbuf = NULL;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
245 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
246
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
247 // hbuf_rebuild()
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
248 // Rebuild all hbuf list, with the new width.
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
249 // If width == 0, lines are not wrapped.
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
250 void hbuf_rebuild(GList **p_hbuf, unsigned int width)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
251 {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
252 GList *first_elt, *curr_elt, *next_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
253 hbuf_block *hbuf_b_curr, *hbuf_b_next;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
254
150
5647381a7dfb [/trunk] Changeset 162 by mikael
mikael
parents: 83
diff changeset
255 // *p_hbuf needs to be the head of the list
5647381a7dfb [/trunk] Changeset 162 by mikael
mikael
parents: 83
diff changeset
256 first_elt = *p_hbuf = g_list_first(*p_hbuf);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
257
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
258 // #1 Remove non-persistent blocks (ptr_end should be updated!)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
259 curr_elt = first_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
260 while (curr_elt) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
261 next_elt = g_list_next(curr_elt);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
262 // Last element?
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
263 if (!next_elt)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
264 break;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
265 hbuf_b_curr = (hbuf_block*)(curr_elt->data);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
266 hbuf_b_next = (hbuf_block*)(next_elt->data);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
267 // Is next line not-persistent?
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
268 if (!(hbuf_b_next->flags & HBB_FLAG_PERSISTENT)) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
269 hbuf_b_curr->ptr_end = hbuf_b_next->ptr_end;
390
468c9cac2798 Minor changes to hbuf.c
Mikael Berthe <mikael@lilotux.net>
parents: 370
diff changeset
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
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 392
diff changeset
272 } else
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
273 curr_elt = next_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
274 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
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
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
278 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
279
189
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
280 // hbuf_previous_persistent()
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
281 // Returns the previous persistent block (line). If the given line is
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
282 // persistent, then it is returned.
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
283 // This function is used for example when resizing a buffer. If the top of the
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
284 // screen is on a non-persistent block, then a screen resize could destroy this
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
285 // line...
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
286 GList *hbuf_previous_persistent(GList *l_line)
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
287 {
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
288 hbuf_block *hbuf_b_elt;
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
289
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
290 while (l_line) {
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
291 hbuf_b_elt = (hbuf_block*)l_line->data;
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
292 if (hbuf_b_elt->flags & HBB_FLAG_PERSISTENT)
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
293 return l_line;
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
294 l_line = g_list_previous(l_line);
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
295 }
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
296
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
297 return NULL;
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
298 }
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
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
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
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
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
305 hbb_line **hbuf_get_lines(GList *hbuf, unsigned int n)
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
306 {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
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
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
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
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
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
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
330 if (hbuf) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
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
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
333 maxlen = blk->ptr_end - blk->ptr;
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
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
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
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
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
352 hbuf = g_list_next(hbuf);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
353 } else
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
354 break;
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
355
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
356 array_elt++;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
357 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
358
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
359 return array;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
360 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
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
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
386
464
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
387 // hbuf_jump_date(hbuf, t)
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
388 // Return a pointer to the first line after date t in the history buffer
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
389 GList *hbuf_jump_date(GList *hbuf, time_t t)
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
390 {
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
391 hbuf_block *blk;
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
392
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
393 hbuf = g_list_first(hbuf);
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
394
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
395 for ( ; hbuf && g_list_next(hbuf); hbuf = g_list_next(hbuf)) {
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
396 blk = (hbuf_block*)(hbuf->data);
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
397 if (blk->prefix.timestamp >= t) break;
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
398 }
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
399
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
400 return hbuf;
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
401 }
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
402
462
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
403 // hbuf_jump_percent(hbuf, pc)
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
404 // Return a pointer to the line at % pc of the history buffer
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
405 GList *hbuf_jump_percent(GList *hbuf, int pc)
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
406 {
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
407 guint hlen;
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
408
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
409 hbuf = g_list_first(hbuf);
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
410 hlen = g_list_length(hbuf);
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
411
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
412 return g_list_nth(hbuf, pc*hlen/100);
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
413 }
576
8b3db0b555a1 Add Vim modelines
Mikael Berthe <mikael@lilotux.net>
parents: 502
diff changeset
414
1227
79c396678f1b Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
415 // hbuf_get_blocks_number()
79c396678f1b Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
416 // 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
417 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
418 {
79c396678f1b Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
419 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
420 guint count = 0U;
79c396678f1b Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
421
79c396678f1b Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
422 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
423 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
424 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
425 count++;
79c396678f1b Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
426 }
79c396678f1b Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
427 return count;
79c396678f1b Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
428 }
79c396678f1b Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
429
580
fed6d1e4d7a9 Fix modelines
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
430 /* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */