annotate mcabber/src/hbuf.c @ 830:80434fde7cfa

Display presence notification timestamps when they exist These timestamps were used in the roster, but not in the buffer window message nor in the history logfile. Reported by "ze".
author Mikael Berthe <mikael@lilotux.net>
date Wed, 03 May 2006 11:28:41 +0200
parents 339c76ed5c0d
children d0781ca2dd08
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
370
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
22 #define _GNU_SOURCE /* We need glibc for strptime */
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
23 #include <string.h>
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
24
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
25 #include "hbuf.h"
804
339c76ed5c0d Remove a warning on Cygwin (implicit strcasestr() declaration)
Mikael Berthe <mikael@lilotux.net>
parents: 790
diff changeset
26 #include "utils.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;
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
41 guchar flags;
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
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
46 // hbuf_add_line(p_hbuf, text, prefix_flags, width)
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
47 // Add a line to the given buffer. If width is not null, then lines are
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
48 // wrapped at this length.
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
49 //
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
50 // Note 1: Splitting according to width won't work if there are tabs; they
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
51 // should be expanded before.
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
52 // Note 2: width does not include the ending \0.
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
53 void hbuf_add_line(GList **p_hbuf, const char *text, time_t timestamp,
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
54 guint prefix_flags, guint width)
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
55 {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
56 GList *hbuf = *p_hbuf;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
57 char *line, *cr, *end;
83
a95e2fc9ea6b [/trunk] Changeset 97 by mikael
mikael
parents: 75
diff changeset
58 hbuf_block *hbuf_block_elt;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
59
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
60 if (!text) return;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
61
83
a95e2fc9ea6b [/trunk] Changeset 97 by mikael
mikael
parents: 75
diff changeset
62 hbuf_block_elt = g_new0(hbuf_block, 1);
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
63 hbuf_block_elt->prefix.timestamp = timestamp;
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
64 hbuf_block_elt->prefix.flags = prefix_flags;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
65 if (!hbuf) {
390
468c9cac2798 Minor changes to hbuf.c
Mikael Berthe <mikael@lilotux.net>
parents: 370
diff changeset
66 hbuf_block_elt->ptr = g_new(char, HBB_BLOCKSIZE);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
67 hbuf_block_elt->flags = HBB_FLAG_ALLOC | HBB_FLAG_PERSISTENT;
182
f7b03201877a [/trunk] Changeset 194 by mikael
mikael
parents: 153
diff changeset
68 hbuf_block_elt->ptr_end_alloc = hbuf_block_elt->ptr + HBB_BLOCKSIZE;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
69 *p_hbuf = g_list_append(*p_hbuf, hbuf_block_elt);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
70 } else {
502
3134b4960cdb Fix mixed declaration and code
Mikael Berthe <mikael@lilotux.net>
parents: 464
diff changeset
71 hbuf_block *hbuf_b_prev;
392
6329c9601704 Speed up hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents: 390
diff changeset
72 // Set p_hbuf to the end of the list, to speed up history loading
6329c9601704 Speed up hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents: 390
diff changeset
73 // (or CPU time will be used by g_list_last() for each line)
6329c9601704 Speed up hbuf_add_line()
Mikael Berthe <mikael@lilotux.net>
parents: 390
diff changeset
74 hbuf = *p_hbuf = g_list_last(*p_hbuf);
502
3134b4960cdb Fix mixed declaration and code
Mikael Berthe <mikael@lilotux.net>
parents: 464
diff changeset
75 hbuf_b_prev = hbuf->data;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
76 hbuf_block_elt->ptr = hbuf_b_prev->ptr_end;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
77 hbuf_block_elt->flags = HBB_FLAG_PERSISTENT;
182
f7b03201877a [/trunk] Changeset 194 by mikael
mikael
parents: 153
diff changeset
78 hbuf_block_elt->ptr_end_alloc = hbuf_b_prev->ptr_end_alloc;
790
5d4ad1d77da4 Kill a few gcc4 warnings
Mikael Berthe <mikael@lilotux.net>
parents: 733
diff changeset
79 *p_hbuf = g_list_append(*p_hbuf, hbuf_block_elt);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
80 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
81
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
82 if (strlen(text) >= HBB_BLOCKSIZE) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
83 // Too long
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
84 text = "[ERR:LINE_TOO_LONG]";
197
c289e3c39c48 [/trunk] Changeset 209 by mikael
mikael
parents: 189
diff changeset
85 hbuf_block_elt->prefix.flags |= HBB_PREFIX_INFO;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
86 }
182
f7b03201877a [/trunk] Changeset 194 by mikael
mikael
parents: 153
diff changeset
87 if (hbuf_block_elt->ptr + strlen(text) >= hbuf_block_elt->ptr_end_alloc) {
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
88 // Too long for the current allocated bloc, we need another one
390
468c9cac2798 Minor changes to hbuf.c
Mikael Berthe <mikael@lilotux.net>
parents: 370
diff changeset
89 hbuf_block_elt->ptr = g_new0(char, HBB_BLOCKSIZE);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
90 hbuf_block_elt->flags = HBB_FLAG_ALLOC | HBB_FLAG_PERSISTENT;
182
f7b03201877a [/trunk] Changeset 194 by mikael
mikael
parents: 153
diff changeset
91 hbuf_block_elt->ptr_end_alloc = hbuf_block_elt->ptr + HBB_BLOCKSIZE;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
92 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
93
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
94 line = hbuf_block_elt->ptr;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
95 // Ok, now we can copy the text..
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
96 strcpy(line, text);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
97 hbuf_block_elt->ptr_end = line + strlen(line) + 1;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
98 end = hbuf_block_elt->ptr_end;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
99
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
100 // Let's add non-persistent blocs if necessary
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
101 // - If there are '\n' in the string
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
102 // - If length > width (and width != 0)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
103 cr = strchr(line, '\n');
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
104 while (cr || (width && strlen(line) > width)) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
105 hbuf_block *hbuf_b_prev = hbuf_block_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
106
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
107 if (!width || (cr && (cr - line <= (int)width))) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
108 // Carriage return
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
109 *cr = 0;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
110 hbuf_block_elt->ptr_end = cr;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
111 // Create another persistent block
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
112 hbuf_block_elt = g_new0(hbuf_block, 1);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
113 hbuf_block_elt->ptr = hbuf_b_prev->ptr_end + 1; // == cr+1
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
114 hbuf_block_elt->ptr_end = end;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
115 hbuf_block_elt->flags = HBB_FLAG_PERSISTENT;
182
f7b03201877a [/trunk] Changeset 194 by mikael
mikael
parents: 153
diff changeset
116 hbuf_block_elt->ptr_end_alloc = hbuf_b_prev->ptr_end_alloc;
790
5d4ad1d77da4 Kill a few gcc4 warnings
Mikael Berthe <mikael@lilotux.net>
parents: 733
diff changeset
117 *p_hbuf = g_list_append(*p_hbuf, hbuf_block_elt);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
118 line = hbuf_block_elt->ptr;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
119 } else {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
120 // We need to break where we can find a space char
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
121 char *br; // break pointer
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
122 for (br = line + width; br > line && *br != 32 && *br != 9; br--)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
123 ;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
124 if (br <= line)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
125 br = line + width;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
126 else
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
127 br++;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
128 hbuf_block_elt->ptr_end = br;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
129 // Create another block, non-persistent
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
130 hbuf_block_elt = g_new0(hbuf_block, 1);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
131 hbuf_block_elt->ptr = hbuf_b_prev->ptr_end; // == br
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
132 hbuf_block_elt->ptr_end = end;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
133 hbuf_block_elt->flags = 0;
182
f7b03201877a [/trunk] Changeset 194 by mikael
mikael
parents: 153
diff changeset
134 hbuf_block_elt->ptr_end_alloc = hbuf_b_prev->ptr_end_alloc;
790
5d4ad1d77da4 Kill a few gcc4 warnings
Mikael Berthe <mikael@lilotux.net>
parents: 733
diff changeset
135 *p_hbuf = g_list_append(*p_hbuf, hbuf_block_elt);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
136 line = hbuf_block_elt->ptr;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
137 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
138 cr = strchr(line, '\n');
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
139 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
140 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
141
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
142 // hbuf_free()
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
143 // Destroys all hbuf list.
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
144 void hbuf_free(GList **p_hbuf)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
145 {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
146 hbuf_block *hbuf_b_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
147 GList *hbuf_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
148 GList *first_elt = g_list_first(*p_hbuf);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
149
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
150 for (hbuf_elt = first_elt; hbuf_elt; hbuf_elt = g_list_next(hbuf_elt)) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
151 hbuf_b_elt = (hbuf_block*)(hbuf_elt->data);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
152 if (hbuf_b_elt->flags & HBB_FLAG_ALLOC) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
153 g_free(hbuf_b_elt->ptr);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
154 }
390
468c9cac2798 Minor changes to hbuf.c
Mikael Berthe <mikael@lilotux.net>
parents: 370
diff changeset
155 g_free(hbuf_b_elt);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
156 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
157
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
158 g_list_free(*p_hbuf);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
159 *p_hbuf = NULL;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
160 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
161
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
162 // hbuf_rebuild()
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
163 // Rebuild all hbuf list, with the new width.
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
164 // If width == 0, lines are not wrapped.
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
165 void hbuf_rebuild(GList **p_hbuf, unsigned int width)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
166 {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
167 GList *first_elt, *curr_elt, *next_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
168 hbuf_block *hbuf_b_curr, *hbuf_b_next;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
169
150
5647381a7dfb [/trunk] Changeset 162 by mikael
mikael
parents: 83
diff changeset
170 // *p_hbuf needs to be the head of the list
5647381a7dfb [/trunk] Changeset 162 by mikael
mikael
parents: 83
diff changeset
171 first_elt = *p_hbuf = g_list_first(*p_hbuf);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
172
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
173 // #1 Remove non-persistent blocks (ptr_end should be updated!)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
174 curr_elt = first_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
175 while (curr_elt) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
176 next_elt = g_list_next(curr_elt);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
177 // Last element?
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
178 if (!next_elt)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
179 break;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
180 hbuf_b_curr = (hbuf_block*)(curr_elt->data);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
181 hbuf_b_next = (hbuf_block*)(next_elt->data);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
182 // Is next line not-persistent?
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
183 if (!(hbuf_b_next->flags & HBB_FLAG_PERSISTENT)) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
184 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
185 g_free(hbuf_b_next);
790
5d4ad1d77da4 Kill a few gcc4 warnings
Mikael Berthe <mikael@lilotux.net>
parents: 733
diff changeset
186 curr_elt = g_list_delete_link(curr_elt, next_elt);
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 392
diff changeset
187 } else
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
188 curr_elt = next_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
189 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
190 // #2 Go back to head and create non-persistent blocks when needed
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
191 if (width) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
192 char *line, *end;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
193 curr_elt = first_elt;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
194
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
195 while (curr_elt) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
196 hbuf_b_curr = (hbuf_block*)(curr_elt->data);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
197 line = hbuf_b_curr->ptr;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
198 if (strlen(line) > width) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
199 hbuf_block *hbuf_b_prev = hbuf_b_curr;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
200
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
201 // We need to break where we can find a space char
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
202 char *br; // break pointer
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
203 for (br = line + width; br > line && *br != 32 && *br != 9; br--)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
204 ;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
205 if (br <= line)
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
206 br = line + width;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
207 else
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
208 br++;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
209 end = hbuf_b_curr->ptr_end;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
210 hbuf_b_curr->ptr_end = br;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
211 // Create another block, non-persistent
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
212 hbuf_b_curr = g_new0(hbuf_block, 1);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
213 hbuf_b_curr->ptr = hbuf_b_prev->ptr_end; // == br
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
214 hbuf_b_curr->ptr_end = end;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
215 hbuf_b_curr->flags = 0;
182
f7b03201877a [/trunk] Changeset 194 by mikael
mikael
parents: 153
diff changeset
216 hbuf_b_curr->ptr_end_alloc = hbuf_b_prev->ptr_end_alloc;
150
5647381a7dfb [/trunk] Changeset 162 by mikael
mikael
parents: 83
diff changeset
217 // This is OK because insert_before(NULL) == append():
5647381a7dfb [/trunk] Changeset 162 by mikael
mikael
parents: 83
diff changeset
218 *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
219 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
220 curr_elt = g_list_next(curr_elt);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
221 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
222 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
223 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
224
189
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
225 // hbuf_previous_persistent()
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
226 // Returns the previous persistent block (line). If the given line is
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
227 // persistent, then it is returned.
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
228 // 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
229 // 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
230 // line...
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
231 GList *hbuf_previous_persistent(GList *l_line)
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
232 {
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
233 hbuf_block *hbuf_b_elt;
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
234
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
235 while (l_line) {
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
236 hbuf_b_elt = (hbuf_block*)l_line->data;
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
237 if (hbuf_b_elt->flags & HBB_FLAG_PERSISTENT)
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
238 return l_line;
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
239 l_line = g_list_previous(l_line);
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
240 }
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
241
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
242 return NULL;
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
243 }
4f3975f1b852 [/trunk] Changeset 201 by mikael
mikael
parents: 184
diff changeset
244
368
da50f08ea058 Update hbuf_get_lines() comment
Mikael Berthe <mikael@lilotux.net>
parents: 197
diff changeset
245 // hbuf_get_lines(hbuf, n)
370
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
246 // Returns an array of n hbb_line pointers
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
247 // (The first line will be the line currently pointed by hbuf)
368
da50f08ea058 Update hbuf_get_lines() comment
Mikael Berthe <mikael@lilotux.net>
parents: 197
diff changeset
248 // Note: The caller should free the array and the text pointers after use.
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
249 hbb_line **hbuf_get_lines(GList *hbuf, unsigned int n)
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
250 {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
251 unsigned int i;
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
252 hbuf_block *blk;
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
253 guchar last_persist_prefixflags = 0;
733
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
254 GList *last_persist; // last persistent flags
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
255
733
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
256 // 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
257 // 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
258 // line of the message.
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
259 last_persist = hbuf_previous_persistent(hbuf);
733
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
260 while (last_persist) {
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
261 blk = (hbuf_block*)last_persist->data;
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
262 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
263 last_persist_prefixflags = blk->prefix.flags;
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
264 break;
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
265 }
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
266 last_persist = g_list_previous(last_persist);
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
267 }
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
268
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
269 hbb_line **array = g_new0(hbb_line*, n);
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
270 hbb_line **array_elt = array;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
271
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
272 for (i=0 ; i < n ; i++) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
273 if (hbuf) {
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
274 int maxlen;
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
275 blk = (hbuf_block*)(hbuf->data);
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
276 maxlen = blk->ptr_end - blk->ptr;
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
277 *array_elt = (hbb_line*)g_new(hbb_line, 1);
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
278 (*array_elt)->timestamp = blk->prefix.timestamp;
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
279 (*array_elt)->flags = blk->prefix.flags;
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
280 (*array_elt)->text = g_strndup(blk->ptr, maxlen);
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
281
733
c502bfe67c31 Fix highlighting of outgoing multi-line messages
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
282 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
283 last_persist_prefixflags = blk->prefix.flags;
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
284 } else {
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
285 // Propagate hilighting flag
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
286 (*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
287 }
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
288
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
289 hbuf = g_list_next(hbuf);
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
290 } else
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
291 break;
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
292
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 182
diff changeset
293 array_elt++;
71
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
294 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
295
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
296 return array;
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
297 }
1e9d4949bcfd [/trunk] Changeset 85 by mikael
mikael
parents:
diff changeset
298
370
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
299 // hbuf_search(hbuf, direction, string)
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
300 // 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
301 // 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
302 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
303 {
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
304 hbuf_block *blk;
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
305
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
306 for (;;) {
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
307 if (direction > 0)
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
308 hbuf = g_list_next(hbuf);
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
309 else
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
310 hbuf = g_list_previous(hbuf);
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
311
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
312 if (!hbuf) break;
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
313
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
314 blk = (hbuf_block*)(hbuf->data);
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
315 // 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
316 // not be after ptr_end. We should check that...
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
317 if (strcasestr(blk->ptr, string))
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
318 break;
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
319 }
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
320
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
321 return hbuf;
dd9e2eb52916 Add /buffer search_{backward,forward}
Mikael Berthe <mikael@lilotux.net>
parents: 368
diff changeset
322 }
462
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
323
464
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
324 // hbuf_jump_date(hbuf, t)
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
325 // 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
326 GList *hbuf_jump_date(GList *hbuf, time_t t)
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
327 {
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
328 hbuf_block *blk;
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
329
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
330 hbuf = g_list_first(hbuf);
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
331
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
332 for ( ; hbuf && g_list_next(hbuf); hbuf = g_list_next(hbuf)) {
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
333 blk = (hbuf_block*)(hbuf->data);
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
334 if (blk->prefix.timestamp >= t) break;
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
335 }
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
336
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
337 return hbuf;
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
338 }
e4840b288be0 Add "/buffer date"
Mikael Berthe <mikael@lilotux.net>
parents: 462
diff changeset
339
462
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
340 // hbuf_jump_percent(hbuf, pc)
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
341 // 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
342 GList *hbuf_jump_percent(GList *hbuf, int pc)
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
343 {
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
344 guint hlen;
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
345
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
346 hbuf = g_list_first(hbuf);
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
347 hlen = g_list_length(hbuf);
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
348
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
349 return g_list_nth(hbuf, pc*hlen/100);
d580e87c11ed Add "/buffer %n"
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
350 }
576
8b3db0b555a1 Add Vim modelines
Mikael Berthe <mikael@lilotux.net>
parents: 502
diff changeset
351
580
fed6d1e4d7a9 Fix modelines
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
352 /* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */