annotate mcabber/mcabber/hbuf.c @ 2223:965e0282c128

Backed out changeset fa516ef22145 Turns out that in this hash the value pointer is the same as the key pointer, so there's no need to free both the key and the value.
author Mikael Berthe <mikael@lilotux.net>
date Fri, 06 Nov 2015 22:31:40 +0100
parents f740c4128f76
children f5402d705f67
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 *
1729
e6e89b1d7831 Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents: 1668
diff changeset
4 * Copyright (C) 2005-2010 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>
1485
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
23 #include <sys/types.h>
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
24 #include <sys/stat.h>
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
25 #include <unistd.h>
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
26
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
27 #include "hbuf.h"
804
339c76ed5c0d Remove a warning on Cygwin (implicit strcasestr() declaration)
Mikael Berthe <mikael@lilotux.net>
parents: 790
diff changeset
28 #include "utils.h"
930
a75f7a13df7b UTF-8 terminal support (Reimar Döffinger)
Mikael Berthe <mikael@lilotux.net>
parents: 924
diff changeset
29 #include "utf8.h"
1485
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
30 #include "screen.h"
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
31
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
32
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
33 /* This is a private structure type */
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
34
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
35 typedef struct {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
36 char *ptr;
182
f7b03201877a [/trunk] Changeset 194 by mikael
mikael
parents: 153
diff changeset
37 char *ptr_end; // beginning of the block
f7b03201877a [/trunk] Changeset 194 by mikael
mikael
parents: 153
diff changeset
38 char *ptr_end_alloc; // end of the current persistent block
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
39 guchar flags;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
40
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
41 // XXX This should certainly be a pointer, and be allocated only when needed
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
42 // (for ex. when HBB_FLAG_PERSISTENT is set).
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
43 struct { // hbuf_line_info
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
44 time_t timestamp;
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1268
diff changeset
45 unsigned mucnicklen;
850
d0781ca2dd08 Use new status buffer window
Mikael Berthe <mikael@lilotux.net>
parents: 804
diff changeset
46 guint flags;
1602
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1599
diff changeset
47 gpointer xep184;
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
48 } prefix;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
49 } hbuf_block;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
50
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
51
943
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
52 // do_wrap(p_hbuf, first_hbuf_elt, width)
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
53 // Wrap hbuf lines with the specified width.
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
54 // '\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
55 // are created).
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
56 // 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
57 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
58 unsigned int width)
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
59 {
943
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
60 GList *curr_elt = first_hbuf_elt;
942
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
61
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
62 // Let's add non-persistent blocs if necessary
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
63 // - If there are '\n' in the string
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
64 // - If length > width (and width != 0)
942
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
65 while (curr_elt) {
943
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
66 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
67 char *c, *end;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
68 char *br = NULL; // break pointer
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
69 char *cr = NULL; // CR pointer
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
70 unsigned int cur_w = 0;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
71
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
72 // 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
73
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
74 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
75 hbuf_b_prev = hbuf_b_curr;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
76 c = hbuf_b_curr->ptr;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
77
942
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
78 while (*c && (!width || cur_w <= width)) {
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
79 if (*c == '\n') {
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
80 br = cr = c;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
81 *c = 0;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
82 break;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
83 }
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
84 if (iswblank(get_char(c)))
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
85 br = c;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
86 cur_w += get_char_width(c);
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
87 c = next_char(c);
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
88 }
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
89
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
90 if (cr || (*c && cur_w > width)) {
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
91 if (!br || br == hbuf_b_curr->ptr)
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
92 br = c;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
93 else
942
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
94 br = next_char(br);
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
95 end = hbuf_b_curr->ptr_end;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
96 hbuf_b_curr->ptr_end = br;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
97 // Create another block
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
98 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
99 // 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
100 if (cr) {
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
101 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
102 hbuf_b_curr->flags = HBB_FLAG_PERSISTENT;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
103 } else {
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
104 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
105 hbuf_b_curr->flags = 0;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
106 }
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
107 hbuf_b_curr->ptr_end = end;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
108 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
109 // 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
110 *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
111 }
942
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
112 curr_elt = g_list_next(curr_elt);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
113 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
114 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
115
1141
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
116 // 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
117 // 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
118 // wrapped at this length.
1141
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
119 // 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
120 // 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
121 //
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
122 // 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
123 // should be expanded before.
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
124 // Note 2: width does not include the ending \0.
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
125 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
126 guint prefix_flags, guint width, guint maxhbufblocks,
1602
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1599
diff changeset
127 unsigned mucnicklen, gpointer xep184)
943
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 GList *curr_elt;
1141
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
130 char *line;
1364
ff1f6facdc0c Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
131 guint hbb_blocksize, textlen;
943
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
132 hbuf_block *hbuf_block_elt;
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
133
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
134 if (!text) return;
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
135
1602
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1599
diff changeset
136 prefix_flags |= (xep184 ? HBB_PREFIX_RECEIPT : 0);
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1599
diff changeset
137
1364
ff1f6facdc0c Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
138 textlen = strlen(text);
ff1f6facdc0c Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
139 hbb_blocksize = MAX(textlen+1, HBB_BLOCKSIZE);
ff1f6facdc0c Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
140
943
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
141 hbuf_block_elt = g_new0(hbuf_block, 1);
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
142 hbuf_block_elt->prefix.timestamp = timestamp;
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
143 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
144 hbuf_block_elt->prefix.mucnicklen = mucnicklen;
1602
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1599
diff changeset
145 hbuf_block_elt->prefix.xep184 = xep184;
1011
b5bcc223cf51 Fix a bug in hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents: 943
diff changeset
146 if (!*p_hbuf) {
1364
ff1f6facdc0c Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
147 hbuf_block_elt->ptr = g_new(char, hbb_blocksize);
ff1f6facdc0c Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
148 if (!hbuf_block_elt->ptr) {
ff1f6facdc0c Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
149 g_free(hbuf_block_elt);
ff1f6facdc0c Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
150 return;
ff1f6facdc0c Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
151 }
943
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
152 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
153 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
154 } else {
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
155 hbuf_block *hbuf_b_prev;
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
156 // 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
157 // (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
158 *p_hbuf = g_list_last(*p_hbuf);
b5bcc223cf51 Fix a bug in hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents: 943
diff changeset
159 hbuf_b_prev = (*p_hbuf)->data;
943
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
160 hbuf_block_elt->ptr = hbuf_b_prev->ptr_end;
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
161 hbuf_block_elt->flags = HBB_FLAG_PERSISTENT;
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
162 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
163 }
1011
b5bcc223cf51 Fix a bug in hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents: 943
diff changeset
164 *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
165
1364
ff1f6facdc0c Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
166 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
167 // 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
168 if (!maxhbufblocks || textlen >= HBB_BLOCKSIZE) {
1141
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
169 // No limit, let's allocate a new block
1364
ff1f6facdc0c Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
170 // 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
171 // 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
172 hbuf_block_elt->ptr = g_new0(char, hbb_blocksize);
ff1f6facdc0c Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
173 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
174 // XXX We should check the return value.
1141
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
175 } else {
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
176 GList *hbuf_head, *hbuf_elt;
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
177 hbuf_block *hbuf_b_elt;
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
178 guint n = 0;
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
179 hbuf_head = g_list_first(*p_hbuf);
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
180 // We need at least 2 allocated blocks
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
181 if (maxhbufblocks == 1)
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
182 maxhbufblocks = 2;
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
183 // Let's count the number of allocated areas
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
184 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
185 hbuf_b_elt = (hbuf_block*)(hbuf_elt->data);
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
186 if (hbuf_b_elt->flags & HBB_FLAG_ALLOC)
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
187 n++;
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
188 }
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
189 // 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
190 if (n < maxhbufblocks) {
1364
ff1f6facdc0c Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
191 hbuf_block_elt->ptr = g_new0(char, hbb_blocksize);
ff1f6facdc0c Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
192 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
193 } else {
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
194 // 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
195 char *allocated_block = NULL;
1364
ff1f6facdc0c Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
196 char *end_of_allocated_block = NULL;
1141
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
197 while (n >= maxhbufblocks) {
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
198 int start_of_block = 1;
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
199 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
200 hbuf_b_elt = (hbuf_block*)(hbuf_elt->data);
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
201 if (hbuf_b_elt->flags & HBB_FLAG_ALLOC) {
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
202 if (start_of_block-- == 0)
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
203 break;
1364
ff1f6facdc0c Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
204 if (n == maxhbufblocks) {
1141
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
205 allocated_block = hbuf_b_elt->ptr;
1364
ff1f6facdc0c Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
206 end_of_allocated_block = hbuf_b_elt->ptr_end_alloc;
ff1f6facdc0c Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
207 } else {
1141
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
208 g_free(hbuf_b_elt->ptr);
1364
ff1f6facdc0c Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
209 }
1141
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
210 }
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
211 g_free(hbuf_b_elt);
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
212 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
213 }
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
214 n--;
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
215 }
1364
ff1f6facdc0c Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
216 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
217 hbuf_block_elt->ptr = allocated_block;
1364
ff1f6facdc0c Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
218 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
219 }
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
220 }
943
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
221 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
222 }
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
223
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
224 line = hbuf_block_elt->ptr;
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
225 // Ok, now we can copy the text..
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
226 strcpy(line, text);
1364
ff1f6facdc0c Allow dynamic HBB sizes
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
227 hbuf_block_elt->ptr_end = line + textlen + 1;
943
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
228
1011
b5bcc223cf51 Fix a bug in hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents: 943
diff changeset
229 curr_elt = g_list_last(*p_hbuf);
943
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
230
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
231 // Wrap lines and handle CRs ('\n')
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
232 do_wrap(p_hbuf, curr_elt, width);
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
233 }
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
234
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
235 // hbuf_free()
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
236 // Destroys all hbuf list.
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
237 void hbuf_free(GList **p_hbuf)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
238 {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
239 hbuf_block *hbuf_b_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
240 GList *hbuf_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
241 GList *first_elt = g_list_first(*p_hbuf);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
242
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
243 for (hbuf_elt = first_elt; hbuf_elt; hbuf_elt = g_list_next(hbuf_elt)) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
244 hbuf_b_elt = (hbuf_block*)(hbuf_elt->data);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
245 if (hbuf_b_elt->flags & HBB_FLAG_ALLOC) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
246 g_free(hbuf_b_elt->ptr);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
247 }
390
468c9cac2798 Minor changes to hbuf.c
Mikael Berthe <mikael@lilotux.net>
parents: 370
diff changeset
248 g_free(hbuf_b_elt);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
249 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
250
893
92aaf2af786b Fix a small memory leak in /buffer purge
Mikael Berthe <mikael@lilotux.net>
parents: 852
diff changeset
251 g_list_free(first_elt);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
252 *p_hbuf = NULL;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
253 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
254
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
255 // hbuf_rebuild()
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
256 // Rebuild all hbuf list, with the new width.
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
257 // If width == 0, lines are not wrapped.
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
258 void hbuf_rebuild(GList **p_hbuf, unsigned int width)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
259 {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
260 GList *first_elt, *curr_elt, *next_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
261 hbuf_block *hbuf_b_curr, *hbuf_b_next;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
262
150
5647381a7dfb [/trunk] Changeset 162 by mikael
mikael
parents: 83
diff changeset
263 // *p_hbuf needs to be the head of the list
5647381a7dfb [/trunk] Changeset 162 by mikael
mikael
parents: 83
diff changeset
264 first_elt = *p_hbuf = g_list_first(*p_hbuf);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
265
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
266 // #1 Remove non-persistent blocks (ptr_end should be updated!)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
267 curr_elt = first_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
268 while (curr_elt) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
269 next_elt = g_list_next(curr_elt);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
270 // Last element?
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
271 if (!next_elt)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
272 break;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
273 hbuf_b_curr = (hbuf_block*)(curr_elt->data);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
274 hbuf_b_next = (hbuf_block*)(next_elt->data);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
275 // Is next line not-persistent?
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
276 if (!(hbuf_b_next->flags & HBB_FLAG_PERSISTENT)) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
277 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
278 g_free(hbuf_b_next);
790
5d4ad1d77da4 Kill a few gcc4 warnings
Mikael Berthe <mikael@lilotux.net>
parents: 733
diff changeset
279 curr_elt = g_list_delete_link(curr_elt, next_elt);
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 392
diff changeset
280 } else
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
281 curr_elt = next_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
282 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
283 // #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
284 if (width)
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
285 do_wrap(p_hbuf, first_elt, width);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
286 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
287
189
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
288 // hbuf_previous_persistent()
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
289 // Returns the previous persistent block (line). If the given line is
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
290 // persistent, then it is returned.
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
291 // 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
292 // 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
293 // line...
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
294 GList *hbuf_previous_persistent(GList *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 hbuf_block *hbuf_b_elt;
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
297
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
298 while (l_line) {
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
299 hbuf_b_elt = (hbuf_block*)l_line->data;
1966
88dafee4ee49 Hopefully fix previous commit
Mikael Berthe <mikael@lilotux.net>
parents: 1965
diff changeset
300 if (hbuf_b_elt->flags & HBB_FLAG_PERSISTENT &&
88dafee4ee49 Hopefully fix previous commit
Mikael Berthe <mikael@lilotux.net>
parents: 1965
diff changeset
301 (hbuf_b_elt->flags & ~HBB_PREFIX_READMARK))
189
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
302 return l_line;
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
303 l_line = g_list_previous(l_line);
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
304 }
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
305
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
306 return NULL;
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
307 }
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
308
368
da50f08ea058 Update hbuf_get_lines() comment
Mikael Berthe <mikael@lilotux.net>
parents: 197
diff changeset
309 // hbuf_get_lines(hbuf, n)
370
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
310 // Returns an array of n hbb_line pointers
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
311 // (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
312 // 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
313 // text pointers after use.
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
314 hbb_line **hbuf_get_lines(GList *hbuf, unsigned int n)
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
315 {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
316 unsigned int i;
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
317 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
318 guint last_persist_prefixflags = 0;
733
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
319 GList *last_persist; // last persistent flags
852
a3b8956db7bc hbuf: minor fixes and typos
Mikael Berthe <mikael@lilotux.net>
parents: 850
diff changeset
320 hbb_line **array, **array_elt;
1948
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
321 hbb_line *prev_array_elt = NULL;
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
322
733
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
323 // 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
324 // we need to look at the last non-null prefix, which should be the first
1970
10eead2ba1b7 Fix another readmark issue with line wrapping
Mikael Berthe <mikael@lilotux.net>
parents: 1967
diff changeset
325 // line of the message. We also need to check if there's a readmark flag
10eead2ba1b7 Fix another readmark issue with line wrapping
Mikael Berthe <mikael@lilotux.net>
parents: 1967
diff changeset
326 // somewhere in the message.
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
327 last_persist = hbuf_previous_persistent(hbuf);
733
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
328 while (last_persist) {
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
329 blk = (hbuf_block*)last_persist->data;
1970
10eead2ba1b7 Fix another readmark issue with line wrapping
Mikael Berthe <mikael@lilotux.net>
parents: 1967
diff changeset
330 if ((blk->flags & HBB_FLAG_PERSISTENT) && blk->prefix.flags) {
10eead2ba1b7 Fix another readmark issue with line wrapping
Mikael Berthe <mikael@lilotux.net>
parents: 1967
diff changeset
331 // This can be either the beginning of the message,
10eead2ba1b7 Fix another readmark issue with line wrapping
Mikael Berthe <mikael@lilotux.net>
parents: 1967
diff changeset
332 // or a persistent line with a readmark flag (or both).
10eead2ba1b7 Fix another readmark issue with line wrapping
Mikael Berthe <mikael@lilotux.net>
parents: 1967
diff changeset
333 if (blk->prefix.flags & ~HBB_PREFIX_READMARK) { // First message line
10eead2ba1b7 Fix another readmark issue with line wrapping
Mikael Berthe <mikael@lilotux.net>
parents: 1967
diff changeset
334 last_persist_prefixflags |= blk->prefix.flags;
10eead2ba1b7 Fix another readmark issue with line wrapping
Mikael Berthe <mikael@lilotux.net>
parents: 1967
diff changeset
335 break;
10eead2ba1b7 Fix another readmark issue with line wrapping
Mikael Berthe <mikael@lilotux.net>
parents: 1967
diff changeset
336 } else { // Not the first line, but we need to keep the readmark flag
10eead2ba1b7 Fix another readmark issue with line wrapping
Mikael Berthe <mikael@lilotux.net>
parents: 1967
diff changeset
337 last_persist_prefixflags = blk->prefix.flags;
10eead2ba1b7 Fix another readmark issue with line wrapping
Mikael Berthe <mikael@lilotux.net>
parents: 1967
diff changeset
338 }
733
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
339 }
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
340 last_persist = g_list_previous(last_persist);
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
341 }
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
342
852
a3b8956db7bc hbuf: minor fixes and typos
Mikael Berthe <mikael@lilotux.net>
parents: 850
diff changeset
343 array = g_new0(hbb_line*, n);
a3b8956db7bc hbuf: minor fixes and typos
Mikael Berthe <mikael@lilotux.net>
parents: 850
diff changeset
344 array_elt = array;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
345
852
a3b8956db7bc hbuf: minor fixes and typos
Mikael Berthe <mikael@lilotux.net>
parents: 850
diff changeset
346 for (i = 0 ; i < n ; i++) {
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
347 if (hbuf) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
348 int maxlen;
1485
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
349
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
350 blk = (hbuf_block*)(hbuf->data);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
351 maxlen = blk->ptr_end - blk->ptr;
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
352 *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
353 (*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
354 (*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
355 (*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
356 (*array_elt)->text = g_strndup(blk->ptr, maxlen);
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
357
1965
ec737f5f1d6f Couple of readmark-related bugfixes
Mikael Berthe <mikael@lilotux.net>
parents: 1961
diff changeset
358 if ((blk->flags & HBB_FLAG_PERSISTENT) &&
ec737f5f1d6f Couple of readmark-related bugfixes
Mikael Berthe <mikael@lilotux.net>
parents: 1961
diff changeset
359 (blk->prefix.flags & ~HBB_PREFIX_READMARK)) {
ec737f5f1d6f Couple of readmark-related bugfixes
Mikael Berthe <mikael@lilotux.net>
parents: 1961
diff changeset
360 // This is a new message: persistent block flag and no prefix flag
ec737f5f1d6f Couple of readmark-related bugfixes
Mikael Berthe <mikael@lilotux.net>
parents: 1961
diff changeset
361 // (except a possible readmark flag)
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
362 last_persist_prefixflags = blk->prefix.flags;
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
363 } 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
364 // 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
365 (*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
366 (HBB_PREFIX_HLIGHT_OUT | HBB_PREFIX_HLIGHT |
1948
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
367 HBB_PREFIX_INFO | HBB_PREFIX_IN |
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
368 HBB_PREFIX_READMARK);
1485
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
369 // Continuation of a message - omit the prefix
1268
dbc907b2d92f Add configurable colors for info and incoming messages (Michal 'vorner' Vaner)
Mikael Berthe <mikael@lilotux.net>
parents: 1241
diff changeset
370 (*array_elt)->flags |= HBB_PREFIX_CONT;
1485
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
371 (*array_elt)->mucnicklen = 0; // The nick is in the first one
1970
10eead2ba1b7 Fix another readmark issue with line wrapping
Mikael Berthe <mikael@lilotux.net>
parents: 1967
diff changeset
372
10eead2ba1b7 Fix another readmark issue with line wrapping
Mikael Berthe <mikael@lilotux.net>
parents: 1967
diff changeset
373 // If there is a readmark on this line, update last_persist_prefixflags
10eead2ba1b7 Fix another readmark issue with line wrapping
Mikael Berthe <mikael@lilotux.net>
parents: 1967
diff changeset
374 if (blk->flags & HBB_FLAG_PERSISTENT)
10eead2ba1b7 Fix another readmark issue with line wrapping
Mikael Berthe <mikael@lilotux.net>
parents: 1967
diff changeset
375 last_persist_prefixflags |= blk->prefix.flags & HBB_PREFIX_READMARK;
1948
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
376 // Remove readmark flag from the previous line
1966
88dafee4ee49 Hopefully fix previous commit
Mikael Berthe <mikael@lilotux.net>
parents: 1965
diff changeset
377 if (prev_array_elt && last_persist_prefixflags & HBB_PREFIX_READMARK)
1948
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
378 prev_array_elt->flags &= ~HBB_PREFIX_READMARK;
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
379 }
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
380
1948
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
381 prev_array_elt = *array_elt;
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
382
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
383 hbuf = g_list_next(hbuf);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
384 } else
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
385 break;
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
386
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
387 array_elt++;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
388 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
389
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
390 return array;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
391 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
392
370
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
393 // hbuf_search(hbuf, direction, string)
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
394 // 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
395 // 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
396 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
397 {
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
398 hbuf_block *blk;
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
399
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
400 for (;;) {
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
401 if (direction > 0)
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
402 hbuf = g_list_next(hbuf);
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
403 else
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
404 hbuf = g_list_previous(hbuf);
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
405
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
406 if (!hbuf) break;
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
407
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
408 blk = (hbuf_block*)(hbuf->data);
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
409 // 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
410 // not be after ptr_end. We should check that...
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
411 if (strcasestr(blk->ptr, string))
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
412 break;
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
413 }
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
414
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
415 return hbuf;
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
416 }
462
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
417
464
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
418 // hbuf_jump_date(hbuf, t)
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
419 // 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
420 GList *hbuf_jump_date(GList *hbuf, time_t t)
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
421 {
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
422 hbuf_block *blk;
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
423
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
424 hbuf = g_list_first(hbuf);
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
425
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
426 for ( ; hbuf && g_list_next(hbuf); hbuf = g_list_next(hbuf)) {
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
427 blk = (hbuf_block*)(hbuf->data);
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
428 if (blk->prefix.timestamp >= t) break;
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
429 }
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
430
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
431 return hbuf;
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
432 }
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
433
462
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
434 // hbuf_jump_percent(hbuf, pc)
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
435 // 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
436 GList *hbuf_jump_percent(GList *hbuf, int pc)
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
437 {
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
438 guint hlen;
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
439
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
440 hbuf = g_list_first(hbuf);
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
441 hlen = g_list_length(hbuf);
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
442
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
443 return g_list_nth(hbuf, pc*hlen/100);
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
444 }
576
8b3db0b555a1 Add Vim modelines
Mikael Berthe <mikael@lilotux.net>
parents: 502
diff changeset
445
1956
f309f343070c Add command /buffer readmark
Mikael Berthe <mikael@lilotux.net>
parents: 1948
diff changeset
446 // hbuf_jump_readmark(hbuf)
f309f343070c Add command /buffer readmark
Mikael Berthe <mikael@lilotux.net>
parents: 1948
diff changeset
447 // Return a pointer to the line following the readmark
f309f343070c Add command /buffer readmark
Mikael Berthe <mikael@lilotux.net>
parents: 1948
diff changeset
448 // or NULL if no mark was found.
f309f343070c Add command /buffer readmark
Mikael Berthe <mikael@lilotux.net>
parents: 1948
diff changeset
449 GList *hbuf_jump_readmark(GList *hbuf)
f309f343070c Add command /buffer readmark
Mikael Berthe <mikael@lilotux.net>
parents: 1948
diff changeset
450 {
f309f343070c Add command /buffer readmark
Mikael Berthe <mikael@lilotux.net>
parents: 1948
diff changeset
451 hbuf_block *blk;
1967
f016c9c9d992 Update hbuf_jump_readmark()
Mikael Berthe <mikael@lilotux.net>
parents: 1966
diff changeset
452 GList *r = NULL;
1956
f309f343070c Add command /buffer readmark
Mikael Berthe <mikael@lilotux.net>
parents: 1948
diff changeset
453
f309f343070c Add command /buffer readmark
Mikael Berthe <mikael@lilotux.net>
parents: 1948
diff changeset
454 hbuf = g_list_last(hbuf);
f309f343070c Add command /buffer readmark
Mikael Berthe <mikael@lilotux.net>
parents: 1948
diff changeset
455 for ( ; hbuf; hbuf = g_list_previous(hbuf)) {
f309f343070c Add command /buffer readmark
Mikael Berthe <mikael@lilotux.net>
parents: 1948
diff changeset
456 blk = (hbuf_block*)(hbuf->data);
f309f343070c Add command /buffer readmark
Mikael Berthe <mikael@lilotux.net>
parents: 1948
diff changeset
457 if (blk->prefix.flags & HBB_PREFIX_READMARK)
1967
f016c9c9d992 Update hbuf_jump_readmark()
Mikael Berthe <mikael@lilotux.net>
parents: 1966
diff changeset
458 return r;
f016c9c9d992 Update hbuf_jump_readmark()
Mikael Berthe <mikael@lilotux.net>
parents: 1966
diff changeset
459 if ((blk->flags & HBB_FLAG_PERSISTENT) &&
f016c9c9d992 Update hbuf_jump_readmark()
Mikael Berthe <mikael@lilotux.net>
parents: 1966
diff changeset
460 (blk->prefix.flags & ~HBB_PREFIX_READMARK))
f016c9c9d992 Update hbuf_jump_readmark()
Mikael Berthe <mikael@lilotux.net>
parents: 1966
diff changeset
461 r = hbuf;
1956
f309f343070c Add command /buffer readmark
Mikael Berthe <mikael@lilotux.net>
parents: 1948
diff changeset
462 }
f309f343070c Add command /buffer readmark
Mikael Berthe <mikael@lilotux.net>
parents: 1948
diff changeset
463
f309f343070c Add command /buffer readmark
Mikael Berthe <mikael@lilotux.net>
parents: 1948
diff changeset
464 return NULL;
f309f343070c Add command /buffer readmark
Mikael Berthe <mikael@lilotux.net>
parents: 1948
diff changeset
465 }
f309f343070c Add command /buffer readmark
Mikael Berthe <mikael@lilotux.net>
parents: 1948
diff changeset
466
1485
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
467 // hbuf_dump_to_file(hbuf, filename)
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
468 // Save the buffer to a file.
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
469 void hbuf_dump_to_file(GList *hbuf, const char *filename)
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
470 {
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
471 hbuf_block *blk;
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
472 hbb_line line;
1547
922e454a8187 Initialize variable
Mikael Berthe <mikael@lilotux.net>
parents: 1487
diff changeset
473 guint last_persist_prefixflags = 0;
1486
f83a51eaa5ed Fix multiline output in /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1485
diff changeset
474 guint prefixwidth;
1485
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
475 char pref[96];
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
476 FILE *fp;
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
477 struct stat statbuf;
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
478
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
479 if (!stat(filename, &statbuf)) {
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
480 scr_LogPrint(LPRINT_NORMAL, "The file already exists.");
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
481 return;
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
482 }
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
483 fp = fopen(filename, "w");
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
484 if (!fp) {
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
485 scr_LogPrint(LPRINT_NORMAL, "Unable to open the file.");
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
486 return;
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
487 }
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
488
1487
f61ed2466f7c Minor style upgrade
Mikael Berthe <mikael@lilotux.net>
parents: 1486
diff changeset
489 prefixwidth = scr_getprefixwidth();
1486
f83a51eaa5ed Fix multiline output in /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1485
diff changeset
490 prefixwidth = MIN(prefixwidth, sizeof pref);
f83a51eaa5ed Fix multiline output in /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1485
diff changeset
491
1485
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
492 for (hbuf = g_list_first(hbuf); hbuf; hbuf = g_list_next(hbuf)) {
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
493 int maxlen;
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
494
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
495 blk = (hbuf_block*)(hbuf->data);
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
496 maxlen = blk->ptr_end - blk->ptr;
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
497
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
498 memset(&line, 0, sizeof(line));
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
499 line.timestamp = blk->prefix.timestamp;
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
500 line.flags = blk->prefix.flags;
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
501 line.mucnicklen = blk->prefix.mucnicklen;
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
502 line.text = g_strndup(blk->ptr, maxlen);
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
503
1966
88dafee4ee49 Hopefully fix previous commit
Mikael Berthe <mikael@lilotux.net>
parents: 1965
diff changeset
504 if ((blk->flags & HBB_FLAG_PERSISTENT) &&
88dafee4ee49 Hopefully fix previous commit
Mikael Berthe <mikael@lilotux.net>
parents: 1965
diff changeset
505 (blk->prefix.flags & ~HBB_PREFIX_READMARK)) {
1485
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
506 last_persist_prefixflags = blk->prefix.flags;
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
507 } else {
1966
88dafee4ee49 Hopefully fix previous commit
Mikael Berthe <mikael@lilotux.net>
parents: 1965
diff changeset
508 // Propagate necessary highlighting flags
1485
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
509 line.flags |= last_persist_prefixflags &
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
510 (HBB_PREFIX_HLIGHT_OUT | HBB_PREFIX_HLIGHT |
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
511 HBB_PREFIX_INFO | HBB_PREFIX_IN);
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
512 // Continuation of a message - omit the prefix
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
513 line.flags |= HBB_PREFIX_CONT;
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
514 line.mucnicklen = 0; // The nick is in the first one
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
515 }
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
516
1486
f83a51eaa5ed Fix multiline output in /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1485
diff changeset
517 scr_line_prefix(&line, pref, prefixwidth);
1485
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
518 fprintf(fp, "%s%s\n", pref, line.text);
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
519 }
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
520
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
521 fclose(fp);
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
522 return;
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
523 }
0121b6f3047c New command: /buffer save
Mikael Berthe <mikael@lilotux.net>
parents: 1424
diff changeset
524
1602
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1599
diff changeset
525 // hbuf_remove_receipt(hbuf, xep184)
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1599
diff changeset
526 // Remove the Receipt Flag for the message with the given xep184 id
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1599
diff changeset
527 // Returns TRUE if it was found and removed, otherwise FALSE
2032
f740c4128f76 Fix receipts handling according to recent XEP updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1970
diff changeset
528 gboolean hbuf_remove_receipt(GList *hbuf, gconstpointer xep184)
1602
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1599
diff changeset
529 {
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1599
diff changeset
530 hbuf_block *blk;
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1599
diff changeset
531
1817
fb6d20a17584 Improve hbuf_remove_receipt() efficiency
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
532 hbuf = g_list_last(hbuf);
1602
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1599
diff changeset
533
1817
fb6d20a17584 Improve hbuf_remove_receipt() efficiency
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
534 for ( ; hbuf; hbuf = g_list_previous(hbuf)) {
1602
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1599
diff changeset
535 blk = (hbuf_block*)(hbuf->data);
2032
f740c4128f76 Fix receipts handling according to recent XEP updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1970
diff changeset
536 if (!g_strcmp0(blk->prefix.xep184, xep184)) {
f740c4128f76 Fix receipts handling according to recent XEP updates
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1970
diff changeset
537 g_free(blk->prefix.xep184);
1602
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1599
diff changeset
538 blk->prefix.xep184 = NULL;
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1599
diff changeset
539 blk->prefix.flags ^= HBB_PREFIX_RECEIPT;
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1599
diff changeset
540 return TRUE;
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1599
diff changeset
541 }
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1599
diff changeset
542 }
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1599
diff changeset
543 return FALSE;
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1599
diff changeset
544 }
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1599
diff changeset
545
1948
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
546 // hbuf_set_readmark(hbuf, action)
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
547 // Set/Reset the readmark Flag
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
548 // If action is TRUE, set a mark to the latest line,
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
549 // if action is FALSE, remove a previous readmark flag.
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
550 void hbuf_set_readmark(GList *hbuf, gboolean action)
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
551 {
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
552 hbuf_block *blk;
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
553
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
554 if (!hbuf) return;
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
555
1965
ec737f5f1d6f Couple of readmark-related bugfixes
Mikael Berthe <mikael@lilotux.net>
parents: 1961
diff changeset
556 hbuf = hbuf_previous_persistent(g_list_last(hbuf));
1948
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
557
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
558 if (action) {
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
559 // Add a readmark flag
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
560 blk = (hbuf_block*)(hbuf->data);
1965
ec737f5f1d6f Couple of readmark-related bugfixes
Mikael Berthe <mikael@lilotux.net>
parents: 1961
diff changeset
561 blk->prefix.flags |= HBB_PREFIX_READMARK;
ec737f5f1d6f Couple of readmark-related bugfixes
Mikael Berthe <mikael@lilotux.net>
parents: 1961
diff changeset
562
1948
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
563 // Shift hbuf in order to remove previous flags
1956
f309f343070c Add command /buffer readmark
Mikael Berthe <mikael@lilotux.net>
parents: 1948
diff changeset
564 // (maybe it can be optimized out, if there's no risk
1948
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
565 // we have several marks)
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
566 hbuf = g_list_previous(hbuf);
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
567 }
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
568
1956
f309f343070c Add command /buffer readmark
Mikael Berthe <mikael@lilotux.net>
parents: 1948
diff changeset
569 // Remove old mark
1948
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
570 for ( ; hbuf; hbuf = g_list_previous(hbuf)) {
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
571 blk = (hbuf_block*)(hbuf->data);
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
572 if (blk->prefix.flags & HBB_PREFIX_READMARK) {
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
573 blk->prefix.flags &= ~HBB_PREFIX_READMARK;
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
574 break;
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
575 }
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
576 }
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
577 }
e8cebf5fd36c Add readmark support
Mikael Berthe <mikael@lilotux.net>
parents: 1817
diff changeset
578
1961
39021fd6b0e1 Try to improve readmarks in some cases
Mikael Berthe <mikael@lilotux.net>
parents: 1956
diff changeset
579 // hbuf_remove_trailing_readmark(hbuf)
39021fd6b0e1 Try to improve readmarks in some cases
Mikael Berthe <mikael@lilotux.net>
parents: 1956
diff changeset
580 // Unset the buffer readmark if it is on the last line
39021fd6b0e1 Try to improve readmarks in some cases
Mikael Berthe <mikael@lilotux.net>
parents: 1956
diff changeset
581 void hbuf_remove_trailing_readmark(GList *hbuf)
39021fd6b0e1 Try to improve readmarks in some cases
Mikael Berthe <mikael@lilotux.net>
parents: 1956
diff changeset
582 {
39021fd6b0e1 Try to improve readmarks in some cases
Mikael Berthe <mikael@lilotux.net>
parents: 1956
diff changeset
583 hbuf_block *blk;
39021fd6b0e1 Try to improve readmarks in some cases
Mikael Berthe <mikael@lilotux.net>
parents: 1956
diff changeset
584
39021fd6b0e1 Try to improve readmarks in some cases
Mikael Berthe <mikael@lilotux.net>
parents: 1956
diff changeset
585 if (!hbuf) return;
39021fd6b0e1 Try to improve readmarks in some cases
Mikael Berthe <mikael@lilotux.net>
parents: 1956
diff changeset
586
39021fd6b0e1 Try to improve readmarks in some cases
Mikael Berthe <mikael@lilotux.net>
parents: 1956
diff changeset
587 hbuf = g_list_last(hbuf);
39021fd6b0e1 Try to improve readmarks in some cases
Mikael Berthe <mikael@lilotux.net>
parents: 1956
diff changeset
588 blk = (hbuf_block*)(hbuf->data);
39021fd6b0e1 Try to improve readmarks in some cases
Mikael Berthe <mikael@lilotux.net>
parents: 1956
diff changeset
589 blk->prefix.flags &= ~HBB_PREFIX_READMARK;
39021fd6b0e1 Try to improve readmarks in some cases
Mikael Berthe <mikael@lilotux.net>
parents: 1956
diff changeset
590 }
39021fd6b0e1 Try to improve readmarks in some cases
Mikael Berthe <mikael@lilotux.net>
parents: 1956
diff changeset
591
1227
79c396678f1b Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
592 // hbuf_get_blocks_number()
79c396678f1b Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
593 // 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
594 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
595 {
79c396678f1b Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
596 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
597 guint count = 0U;
79c396678f1b Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
598
79c396678f1b Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
599 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
600 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
601 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
602 count++;
79c396678f1b Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
603 }
79c396678f1b Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
604 return count;
79c396678f1b Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
605 }
79c396678f1b Make buffer list display the number of allocated HBB blocks
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
606
1811
e6d355e50d7a Update Vim modelines
Mikael Berthe <mikael@lilotux.net>
parents: 1729
diff changeset
607 /* vim: set expandtab cindent cinoptions=>2\:2(0 sw=2 ts=2: For Vim users... */