annotate mcabber/src/hbuf.c @ 1197:6f602d3270a4

Add /pgp [-]force With this command it becomes possible to enforce PGP encryption without checking if the remote client has PGP support. It can be used to send encrypted offline messages too.
author Mikael Berthe <mikael@lilotux.net>
date Fri, 27 Apr 2007 00:37:57 +0200
parents 5be2408a6534
children e802ec0c02d2
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 *
699
ee03b56b93ee Update Copyright (2006)
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
4 * Copyright (C) 2005, 2006 Mikael Berthe <bmikael@lists.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;
850
d0781ca2dd08 Use new status buffer window
Mikael Berthe <mikael@lilotux.net>
parents: 804
diff changeset
41 guint flags;
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
42 } prefix;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
43 } hbuf_block;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
44
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
45
943
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
46 // do_wrap(p_hbuf, first_hbuf_elt, width)
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
47 // Wrap hbuf lines with the specified width.
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
48 // '\n' are handled by this routine (they are removed and persistent lines
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
49 // are created).
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
50 // All hbuf elements are processed, starting from first_hbuf_elt.
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
51 static inline void do_wrap(GList **p_hbuf, GList *first_hbuf_elt,
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
52 unsigned int width)
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
53 {
943
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
54 GList *curr_elt = first_hbuf_elt;
942
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
55
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
56 // Let's add non-persistent blocs if necessary
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
57 // - If there are '\n' in the string
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
58 // - If length > width (and width != 0)
942
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
59 while (curr_elt) {
943
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
60 hbuf_block *hbuf_b_curr, *hbuf_b_prev;
942
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
61 char *c, *end;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
62 char *br = NULL; // break pointer
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
63 char *cr = NULL; // CR pointer
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
64 unsigned int cur_w = 0;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
65
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
66 // We want to break where we can find a space char or a CR
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
67
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
68 hbuf_b_curr = (hbuf_block*)(curr_elt->data);
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
69 hbuf_b_prev = hbuf_b_curr;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
70 c = hbuf_b_curr->ptr;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
71
942
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
72 while (*c && (!width || cur_w <= width)) {
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
73 if (*c == '\n') {
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
74 br = cr = c;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
75 *c = 0;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
76 break;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
77 }
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
78 if (iswblank(get_char(c)))
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
79 br = c;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
80 cur_w += get_char_width(c);
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
81 c = next_char(c);
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
82 }
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
83
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
84 if (cr || (*c && cur_w > width)) {
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
85 if (!br || br == hbuf_b_curr->ptr)
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
86 br = c;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
87 else
942
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
88 br = next_char(br);
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
89 end = hbuf_b_curr->ptr_end;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
90 hbuf_b_curr->ptr_end = br;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
91 // Create another block
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
92 hbuf_b_curr = g_new0(hbuf_block, 1);
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
93 // The block must be persistent after a CR
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
94 if (cr) {
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
95 hbuf_b_curr->ptr = hbuf_b_prev->ptr_end + 1; // == cr+1
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
96 hbuf_b_curr->flags = HBB_FLAG_PERSISTENT;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
97 } else {
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
98 hbuf_b_curr->ptr = hbuf_b_prev->ptr_end; // == br
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
99 hbuf_b_curr->flags = 0;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
100 }
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
101 hbuf_b_curr->ptr_end = end;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
102 hbuf_b_curr->ptr_end_alloc = hbuf_b_prev->ptr_end_alloc;
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
103 // This is OK because insert_before(NULL) == append():
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
104 *p_hbuf = g_list_insert_before(*p_hbuf, curr_elt->next, hbuf_b_curr);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
105 }
942
c6bd42119c31 Make hbuf_add_line() UTF-8 aware
Mikael Berthe <mikael@lilotux.net>
parents: 932
diff changeset
106 curr_elt = g_list_next(curr_elt);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
107 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
108 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
109
1141
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
110 // hbuf_add_line(p_hbuf, text, prefix_flags, width, maxhbufblocks)
943
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
111 // Add a line to the given buffer. If width is not null, then lines are
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
112 // wrapped at this length.
1141
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
113 // maxhbufblocks is the maximum number of hbuf blocks we can allocate. If
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
114 // null, there is no limit. If non-null, it should be >= 2.
943
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
115 //
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
116 // Note 1: Splitting according to width won't work if there are tabs; they
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
117 // should be expanded before.
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
118 // Note 2: width does not include the ending \0.
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
119 void hbuf_add_line(GList **p_hbuf, const char *text, time_t timestamp,
1141
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
120 guint prefix_flags, guint width, guint maxhbufblocks)
943
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
121 {
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
122 GList *curr_elt;
1141
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
123 char *line;
943
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
124 hbuf_block *hbuf_block_elt;
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
125
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
126 if (!text) return;
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
127
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
128 hbuf_block_elt = g_new0(hbuf_block, 1);
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
129 hbuf_block_elt->prefix.timestamp = timestamp;
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
130 hbuf_block_elt->prefix.flags = prefix_flags;
1011
b5bcc223cf51 Fix a bug in hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents: 943
diff changeset
131 if (!*p_hbuf) {
943
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
132 hbuf_block_elt->ptr = g_new(char, HBB_BLOCKSIZE);
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
133 hbuf_block_elt->flags = HBB_FLAG_ALLOC | HBB_FLAG_PERSISTENT;
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
134 hbuf_block_elt->ptr_end_alloc = hbuf_block_elt->ptr + HBB_BLOCKSIZE;
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
135 } else {
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
136 hbuf_block *hbuf_b_prev;
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
137 // Set p_hbuf to the end of the list, to speed up history loading
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
138 // (or CPU time will be used by g_list_last() for each line)
1011
b5bcc223cf51 Fix a bug in hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents: 943
diff changeset
139 *p_hbuf = g_list_last(*p_hbuf);
b5bcc223cf51 Fix a bug in hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents: 943
diff changeset
140 hbuf_b_prev = (*p_hbuf)->data;
943
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
141 hbuf_block_elt->ptr = hbuf_b_prev->ptr_end;
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
142 hbuf_block_elt->flags = HBB_FLAG_PERSISTENT;
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
143 hbuf_block_elt->ptr_end_alloc = hbuf_b_prev->ptr_end_alloc;
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
144 }
1011
b5bcc223cf51 Fix a bug in hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents: 943
diff changeset
145 *p_hbuf = g_list_append(*p_hbuf, hbuf_block_elt);
943
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
146
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
147 if (strlen(text) >= HBB_BLOCKSIZE) {
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
148 // Too long
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
149 text = "[ERR:LINE_TOO_LONG]";
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
150 hbuf_block_elt->prefix.flags |= HBB_PREFIX_INFO;
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
151 }
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
152 if (hbuf_block_elt->ptr + strlen(text) >= hbuf_block_elt->ptr_end_alloc) {
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
153 // Too long for the current allocated bloc, we need another one
1141
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
154 if (!maxhbufblocks) {
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
155 // No limit, let's allocate a new block
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
156 hbuf_block_elt->ptr = g_new0(char, HBB_BLOCKSIZE);
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
157 } else {
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
158 GList *hbuf_head, *hbuf_elt;
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
159 hbuf_block *hbuf_b_elt;
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
160 guint n = 0;
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
161 hbuf_head = g_list_first(*p_hbuf);
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
162 // We need at least 2 allocated blocks
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
163 if (maxhbufblocks == 1)
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
164 maxhbufblocks = 2;
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
165 // Let's count the number of allocated areas
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
166 for (hbuf_elt = hbuf_head; hbuf_elt; hbuf_elt = g_list_next(hbuf_elt)) {
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
167 hbuf_b_elt = (hbuf_block*)(hbuf_elt->data);
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
168 if (hbuf_b_elt->flags & HBB_FLAG_ALLOC)
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
169 n++;
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
170 }
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
171 // If we can't allocate a new area, reuse the previous block(s)
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
172 if (n < maxhbufblocks) {
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
173 hbuf_block_elt->ptr = g_new0(char, HBB_BLOCKSIZE);
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
174 } else {
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
175 // Let's use an old block, and free the extra blocks if needed
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
176 char *allocated_block = NULL;
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
177 while (n >= maxhbufblocks) {
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
178 /* --- */
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
179 int start_of_block = 1;
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
180 for (hbuf_elt = hbuf_head; hbuf_elt; hbuf_elt = hbuf_head) {
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
181 hbuf_b_elt = (hbuf_block*)(hbuf_elt->data);
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
182 if (hbuf_b_elt->flags & HBB_FLAG_ALLOC) {
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
183 if (start_of_block-- == 0)
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
184 break;
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
185 if (n == maxhbufblocks)
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
186 allocated_block = hbuf_b_elt->ptr;
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
187 else
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
188 g_free(hbuf_b_elt->ptr);
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
189 }
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
190 g_free(hbuf_b_elt);
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
191 hbuf_head = *p_hbuf = g_list_delete_link(hbuf_head, hbuf_elt);
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
192 }
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
193 n--;
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
194 /* --- */
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
195 }
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
196 memset(allocated_block, 0, HBB_BLOCKSIZE);
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
197 hbuf_block_elt->ptr = allocated_block;
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
198 }
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1011
diff changeset
199 }
943
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
200 hbuf_block_elt->flags = HBB_FLAG_ALLOC | HBB_FLAG_PERSISTENT;
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
201 hbuf_block_elt->ptr_end_alloc = hbuf_block_elt->ptr + HBB_BLOCKSIZE;
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
202 }
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
203
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
204 line = hbuf_block_elt->ptr;
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
205 // Ok, now we can copy the text..
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
206 strcpy(line, text);
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
207 hbuf_block_elt->ptr_end = line + strlen(line) + 1;
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
208
1011
b5bcc223cf51 Fix a bug in hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents: 943
diff changeset
209 curr_elt = g_list_last(*p_hbuf);
943
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
210
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
211 // Wrap lines and handle CRs ('\n')
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
212 do_wrap(p_hbuf, curr_elt, width);
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
213 }
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
214
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
215 // hbuf_free()
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
216 // Destroys all hbuf list.
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
217 void hbuf_free(GList **p_hbuf)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
218 {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
219 hbuf_block *hbuf_b_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
220 GList *hbuf_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
221 GList *first_elt = g_list_first(*p_hbuf);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
222
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
223 for (hbuf_elt = first_elt; hbuf_elt; hbuf_elt = g_list_next(hbuf_elt)) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
224 hbuf_b_elt = (hbuf_block*)(hbuf_elt->data);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
225 if (hbuf_b_elt->flags & HBB_FLAG_ALLOC) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
226 g_free(hbuf_b_elt->ptr);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
227 }
390
468c9cac2798 Minor changes to hbuf.c
Mikael Berthe <mikael@lilotux.net>
parents: 370
diff changeset
228 g_free(hbuf_b_elt);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
229 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
230
893
92aaf2af786b Fix a small memory leak in /buffer purge
Mikael Berthe <mikael@lilotux.net>
parents: 852
diff changeset
231 g_list_free(first_elt);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
232 *p_hbuf = NULL;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
233 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
234
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
235 // hbuf_rebuild()
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
236 // Rebuild all hbuf list, with the new width.
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
237 // If width == 0, lines are not wrapped.
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
238 void hbuf_rebuild(GList **p_hbuf, unsigned int width)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
239 {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
240 GList *first_elt, *curr_elt, *next_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
241 hbuf_block *hbuf_b_curr, *hbuf_b_next;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
242
150
5647381a7dfb [/trunk] Changeset 162 by mikael
mikael
parents: 83
diff changeset
243 // *p_hbuf needs to be the head of the list
5647381a7dfb [/trunk] Changeset 162 by mikael
mikael
parents: 83
diff changeset
244 first_elt = *p_hbuf = g_list_first(*p_hbuf);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
245
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
246 // #1 Remove non-persistent blocks (ptr_end should be updated!)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
247 curr_elt = first_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
248 while (curr_elt) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
249 next_elt = g_list_next(curr_elt);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
250 // Last element?
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
251 if (!next_elt)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
252 break;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
253 hbuf_b_curr = (hbuf_block*)(curr_elt->data);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
254 hbuf_b_next = (hbuf_block*)(next_elt->data);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
255 // Is next line not-persistent?
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
256 if (!(hbuf_b_next->flags & HBB_FLAG_PERSISTENT)) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
257 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
258 g_free(hbuf_b_next);
790
5d4ad1d77da4 Kill a few gcc4 warnings
Mikael Berthe <mikael@lilotux.net>
parents: 733
diff changeset
259 curr_elt = g_list_delete_link(curr_elt, next_elt);
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 392
diff changeset
260 } else
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
261 curr_elt = next_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
262 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
263 // #2 Go back to head and create non-persistent blocks when needed
943
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
264 if (width)
9ac0d166a85b hbuf: Refactor line wrapping stuff
Mikael Berthe <mikael@lilotux.net>
parents: 942
diff changeset
265 do_wrap(p_hbuf, first_elt, width);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
266 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
267
189
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
268 // hbuf_previous_persistent()
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
269 // Returns the previous persistent block (line). If the given line is
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
270 // persistent, then it is returned.
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
271 // 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
272 // 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
273 // line...
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
274 GList *hbuf_previous_persistent(GList *l_line)
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
275 {
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
276 hbuf_block *hbuf_b_elt;
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
277
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
278 while (l_line) {
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
279 hbuf_b_elt = (hbuf_block*)l_line->data;
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
280 if (hbuf_b_elt->flags & HBB_FLAG_PERSISTENT)
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
281 return l_line;
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
282 l_line = g_list_previous(l_line);
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
283 }
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
284
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
285 return NULL;
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
286 }
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
287
368
da50f08ea058 Update hbuf_get_lines() comment
Mikael Berthe <mikael@lilotux.net>
parents: 197
diff changeset
288 // hbuf_get_lines(hbuf, n)
370
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
289 // Returns an array of n hbb_line pointers
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
290 // (The first line will be the line currently pointed by hbuf)
898
c65b71dcda94 Fix memory leak in scr_UpdateWindow()
Mikael Berthe <mikael@lilotux.net>
parents: 893
diff changeset
291 // Note: The caller should free the array, the hbb_line pointers and the
c65b71dcda94 Fix memory leak in scr_UpdateWindow()
Mikael Berthe <mikael@lilotux.net>
parents: 893
diff changeset
292 // text pointers after use.
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
293 hbb_line **hbuf_get_lines(GList *hbuf, unsigned int n)
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
294 {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
295 unsigned int i;
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
296 hbuf_block *blk;
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
297 guchar last_persist_prefixflags = 0;
733
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
298 GList *last_persist; // last persistent flags
852
a3b8956db7bc hbuf: minor fixes and typos
Mikael Berthe <mikael@lilotux.net>
parents: 850
diff changeset
299 hbb_line **array, **array_elt;
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
300
733
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
301 // To be able to correctly highlight multi-line messages,
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
302 // we need to look at the last non-null prefix, which should be the first
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
303 // line of the message.
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
304 last_persist = hbuf_previous_persistent(hbuf);
733
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
305 while (last_persist) {
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
306 blk = (hbuf_block*)last_persist->data;
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
307 if ((blk->flags & HBB_FLAG_PERSISTENT) && blk->prefix.flags) {
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
308 last_persist_prefixflags = blk->prefix.flags;
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
309 break;
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
310 }
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
311 last_persist = g_list_previous(last_persist);
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
312 }
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
313
852
a3b8956db7bc hbuf: minor fixes and typos
Mikael Berthe <mikael@lilotux.net>
parents: 850
diff changeset
314 array = g_new0(hbb_line*, n);
a3b8956db7bc hbuf: minor fixes and typos
Mikael Berthe <mikael@lilotux.net>
parents: 850
diff changeset
315 array_elt = array;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
316
852
a3b8956db7bc hbuf: minor fixes and typos
Mikael Berthe <mikael@lilotux.net>
parents: 850
diff changeset
317 for (i = 0 ; i < n ; i++) {
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
318 if (hbuf) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
319 int maxlen;
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
320 blk = (hbuf_block*)(hbuf->data);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
321 maxlen = blk->ptr_end - blk->ptr;
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
322 *array_elt = (hbb_line*)g_new(hbb_line, 1);
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
323 (*array_elt)->timestamp = blk->prefix.timestamp;
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
324 (*array_elt)->flags = blk->prefix.flags;
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
325 (*array_elt)->text = g_strndup(blk->ptr, maxlen);
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
326
733
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
327 if ((blk->flags & HBB_FLAG_PERSISTENT) && blk->prefix.flags) {
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
328 last_persist_prefixflags = blk->prefix.flags;
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
329 } else {
852
a3b8956db7bc hbuf: minor fixes and typos
Mikael Berthe <mikael@lilotux.net>
parents: 850
diff changeset
330 // Propagate highlighting flag
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
331 (*array_elt)->flags |= last_persist_prefixflags & HBB_PREFIX_HLIGHT;
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
332 }
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
333
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
334 hbuf = g_list_next(hbuf);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
335 } else
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
336 break;
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
337
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
338 array_elt++;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
339 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
340
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
341 return array;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
342 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
343
370
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
344 // hbuf_search(hbuf, direction, string)
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
345 // 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
346 // 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
347 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
348 {
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
349 hbuf_block *blk;
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
350
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
351 for (;;) {
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
352 if (direction > 0)
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
353 hbuf = g_list_next(hbuf);
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
354 else
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
355 hbuf = g_list_previous(hbuf);
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
356
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
357 if (!hbuf) break;
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
358
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
359 blk = (hbuf_block*)(hbuf->data);
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
360 // 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
361 // not be after ptr_end. We should check that...
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
362 if (strcasestr(blk->ptr, string))
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
363 break;
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
364 }
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
365
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
366 return hbuf;
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
367 }
462
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
368
464
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
369 // hbuf_jump_date(hbuf, t)
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
370 // 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
371 GList *hbuf_jump_date(GList *hbuf, time_t t)
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
372 {
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
373 hbuf_block *blk;
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
374
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
375 hbuf = g_list_first(hbuf);
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
376
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
377 for ( ; hbuf && g_list_next(hbuf); hbuf = g_list_next(hbuf)) {
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
378 blk = (hbuf_block*)(hbuf->data);
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
379 if (blk->prefix.timestamp >= t) break;
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
380 }
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
381
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
382 return hbuf;
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
383 }
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
384
462
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
385 // hbuf_jump_percent(hbuf, pc)
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
386 // 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
387 GList *hbuf_jump_percent(GList *hbuf, int pc)
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
388 {
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
389 guint hlen;
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
390
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
391 hbuf = g_list_first(hbuf);
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
392 hlen = g_list_length(hbuf);
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
393
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
394 return g_list_nth(hbuf, pc*hlen/100);
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
395 }
576
8b3db0b555a1 Add Vim modelines
Mikael Berthe <mikael@lilotux.net>
parents: 502
diff changeset
396
580
fed6d1e4d7a9 Fix modelines
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
397 /* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */