24 #include "hbuf.h" |
24 #include "hbuf.h" |
25 |
25 |
26 |
26 |
27 /* This is a private structure type */ |
27 /* This is a private structure type */ |
28 |
28 |
29 #define PREFIX_LENGTH 32 |
|
30 typedef struct { |
29 typedef struct { |
31 char *ptr; |
30 char *ptr; |
32 char *ptr_end; // beginning of the block |
31 char *ptr_end; // beginning of the block |
33 char *ptr_end_alloc; // end of the current persistent block |
32 char *ptr_end_alloc; // end of the current persistent block |
34 guchar flags; |
33 guchar flags; |
35 |
34 |
36 // XXX This should certainly be a pointer, and be allocated only when needed |
35 // XXX This should certainly be a pointer, and be allocated only when needed |
37 // (for ex. when HBB_FLAG_PERSISTENT is set). |
36 // (for ex. when HBB_FLAG_PERSISTENT is set). |
38 struct { // hbuf_line_info |
37 struct { // hbuf_line_info |
39 char prefix[PREFIX_LENGTH]; |
38 time_t timestamp; |
40 } persist; |
39 guchar flags; |
|
40 } prefix; |
41 } hbuf_block; |
41 } hbuf_block; |
42 |
42 |
43 |
43 |
44 // hbuf_add_line(p_hbuf, text, prefix, width) |
44 // hbuf_add_line(p_hbuf, text, prefix_flags, width) |
45 // Add a line to the given buffer. If width is not null, then lines are |
45 // Add a line to the given buffer. If width is not null, then lines are |
46 // wrapped at this length. |
46 // wrapped at this length. |
47 // |
47 // |
48 // Note 1: Splitting according to width won't work if there are tabs; they |
48 // Note 1: Splitting according to width won't work if there are tabs; they |
49 // should be expanded before. |
49 // should be expanded before. |
50 // Note 2: width does not include the ending \0. |
50 // Note 2: width does not include the ending \0. |
51 void hbuf_add_line(GList **p_hbuf, const char *text, const char *prefix, |
51 void hbuf_add_line(GList **p_hbuf, const char *text, time_t timestamp, |
52 unsigned int width) |
52 guint prefix_flags, guint width) |
53 { |
53 { |
54 GList *hbuf = *p_hbuf; |
54 GList *hbuf = *p_hbuf; |
55 char *line, *cr, *end; |
55 char *line, *cr, *end; |
56 hbuf_block *hbuf_block_elt; |
56 hbuf_block *hbuf_block_elt; |
57 |
57 |
58 if (!text) return; |
58 if (!text) return; |
59 |
59 |
60 hbuf_block_elt = g_new0(hbuf_block, 1); |
60 hbuf_block_elt = g_new0(hbuf_block, 1); |
61 if (prefix) |
61 hbuf_block_elt->prefix.timestamp = timestamp; |
62 strncpy(hbuf_block_elt->persist.prefix, prefix, PREFIX_LENGTH-1); |
62 hbuf_block_elt->prefix.flags = prefix_flags; |
63 if (!hbuf) { |
63 if (!hbuf) { |
64 do { |
64 do { |
65 hbuf_block_elt->ptr = g_new(char, HBB_BLOCKSIZE); |
65 hbuf_block_elt->ptr = g_new(char, HBB_BLOCKSIZE); |
66 } while (!hbuf_block_elt->ptr); |
66 } while (!hbuf_block_elt->ptr); |
67 hbuf_block_elt->flags = HBB_FLAG_ALLOC | HBB_FLAG_PERSISTENT; |
67 hbuf_block_elt->flags = HBB_FLAG_ALLOC | HBB_FLAG_PERSISTENT; |
215 curr_elt = g_list_next(curr_elt); |
215 curr_elt = g_list_next(curr_elt); |
216 } |
216 } |
217 } |
217 } |
218 } |
218 } |
219 |
219 |
220 // hbuf_get_lines(hbuf, n, where) |
220 // hbuf_get_lines(hbuf, n, where) FIXME bad comments XXX |
221 // Returns an array of 2*n pointers (for n prefixes + n lines from hbuf) |
221 // Returns an array of 2*n pointers (for n prefixes + n lines from hbuf) |
222 // (prefix line 1, line 1, prefix line 2, line 2, etc.) |
222 // (prefix line 1, line 1, prefix line 2, line 2, etc.) |
223 // (The first line will be the line currently pointed by hbuf) |
223 // (The first line will be the line currently pointed by hbuf) |
224 // Note:The caller should free the array after use. |
224 // Note:The caller should free the array after use. |
225 char **hbuf_get_lines(GList *hbuf, unsigned int n) |
225 hbb_line **hbuf_get_lines(GList *hbuf, unsigned int n) |
226 { |
226 { |
227 unsigned int i; |
227 unsigned int i; |
228 |
228 |
229 char **array = g_new0(char*, n*2); |
229 hbb_line **array = g_new0(hbb_line*, n); |
230 char **array_elt = array; |
230 hbb_line **array_elt = array; |
231 |
231 |
232 for (i=0 ; i < n ; i++) { |
232 for (i=0 ; i < n ; i++) { |
233 if (hbuf) { |
233 if (hbuf) { |
234 hbuf_block *blk = (hbuf_block*)(hbuf->data); |
234 hbuf_block *blk = (hbuf_block*)(hbuf->data); |
235 int maxlen; |
235 int maxlen; |
236 maxlen = blk->ptr_end - blk->ptr; |
236 maxlen = blk->ptr_end - blk->ptr; |
237 *array_elt++ = blk->persist.prefix; |
237 *array_elt = (hbb_line*)g_new(hbb_line, 1); |
238 *array_elt++ = g_strndup(blk->ptr, maxlen); |
238 (*array_elt)->timestamp = blk->prefix.timestamp; |
|
239 (*array_elt)->flags = blk->prefix.flags; |
|
240 (*array_elt)->text = g_strndup(blk->ptr, maxlen); |
|
241 |
239 hbuf = g_list_next(hbuf); |
242 hbuf = g_list_next(hbuf); |
240 } else |
243 } else |
241 *array_elt++ = NULL; |
244 break; |
|
245 |
|
246 array_elt++; |
242 } |
247 } |
243 |
248 |
244 return array; |
249 return array; |
245 } |
250 } |
246 |
251 |