1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3     sparse_buffer.h
4     Copyright (C) 2006 Sebastien Granjoux
5 
6     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10 
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15 
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
19 */
20 
21 #ifndef _SPARSE_BUFFER_H
22 #define _SPARSE_BUFFER_H
23 
24 #include <gtk/gtk.h>
25 
26 #define DMA_SPARSE_BUFFER_TYPE              (dma_sparse_buffer_get_type ())
27 #define DMA_SPARSE_BUFFER(obj)              (G_TYPE_CHECK_INSTANCE_CAST ((obj), DMA_SPARSE_BUFFER_TYPE, DmaSparseBuffer))
28 #define DMA_SPARSE_BUFFER_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST ((klass),  DMA_SPARSE_BUFFER_TYPE, DmaSparseBufferClass))
29 #define DMA_IS_SPARSE_BUFFER(obj)           (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DMA_SPARSE_BUFFER_TYPE))
30 #define DMA_IS_SPARSE_BUFFER_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass),  DMA_SPARSE_BUFFER_TYPE))
31 #define DMA_GET_SPARSE_BUFFER_CLASS(obj)    (G_TYPE_INSTANCE_GET_CLASS ((obj),  DMA_SPARSE_BUFFER_TYPE, DmaSparseBufferClass))
32 
33 typedef struct _DmaSparseBuffer DmaSparseBuffer;
34 typedef struct _DmaSparseBufferClass DmaSparseBufferClass;
35 
36 typedef struct _DmaSparseBufferNode DmaSparseBufferNode;
37 typedef struct _DmaSparseIter DmaSparseIter;
38 typedef struct _DmaSparseBufferTransport DmaSparseBufferTransport;
39 
40 GType dma_sparse_buffer_get_type (void);
41 
42 DmaSparseBuffer *dma_sparse_buffer_new (guint lower, guint upper);
43 void dma_sparse_buffer_free (DmaSparseBuffer *buffer);
44 
45 void dma_sparse_buffer_insert (DmaSparseBuffer *buffer, DmaSparseBufferNode *node);
46 void dma_sparse_buffer_remove (DmaSparseBuffer *buffer, DmaSparseBufferNode *node);
47 void dma_sparse_buffer_remove_all (DmaSparseBuffer *buffer);
48 DmaSparseBufferNode *dma_sparse_buffer_lookup (DmaSparseBuffer *self, guint address);
49 DmaSparseBufferNode *dma_sparse_buffer_first (DmaSparseBuffer *self);
50 
51 guint dma_sparse_buffer_get_lower (const DmaSparseBuffer *buffer);
52 guint dma_sparse_buffer_get_upper (const DmaSparseBuffer *buffer);
53 
54 void dma_sparse_buffer_changed (const DmaSparseBuffer *buffer);
55 
56 void dma_sparse_buffer_add_mark (DmaSparseBuffer *buffer, guint address, gint mark);
57 void dma_sparse_buffer_remove_mark (DmaSparseBuffer *buffer, guint address, gint mark);
58 void dma_sparse_buffer_remove_all_mark (DmaSparseBuffer *buffer, gint mark);
59 gint dma_sparse_buffer_get_marks (DmaSparseBuffer *buffer, guint address);
60 
61 void dma_sparse_buffer_get_iterator_at_address (DmaSparseBuffer *buffer, DmaSparseIter *iter, guint address);
62 void dma_sparse_buffer_get_iterator_near_address (DmaSparseBuffer *buffer, DmaSparseIter *iter, guint address);
63 void dma_sparse_iter_copy (DmaSparseIter *dst, const DmaSparseIter *src);
64 void dma_sparse_iter_move_at (DmaSparseIter *iter, guint address);
65 void dma_sparse_iter_move_near (DmaSparseIter *iter, guint address);
66 void dma_sparse_iter_refresh (DmaSparseIter *iter);
67 void dma_sparse_iter_round (DmaSparseIter *iter, gboolean round_up);
68 void dma_sparse_iter_insert_lines (DmaSparseIter *iter, GtkTextIter *dst, guint count);
69 gboolean dma_sparse_iter_forward_lines (DmaSparseIter *iter, gint count);
70 gulong dma_sparse_iter_get_address (DmaSparseIter *iter);
71 
72 DmaSparseBufferTransport* dma_sparse_buffer_alloc_transport (DmaSparseBuffer *buffer, guint lines, guint chars);
73 void dma_sparse_buffer_free_transport (DmaSparseBufferTransport *trans);
74 
75 struct _DmaSparseBuffer
76 {
77 	GObject parent;
78 
79 	guint lower;
80 	guint upper;
81 
82 	struct
83 	{
84 		DmaSparseBufferNode *head;
85 		DmaSparseBufferNode *tail;
86 	} cache;
87 	DmaSparseBufferNode *head;
88 
89 	gint stamp;
90 	DmaSparseBufferTransport *pending;
91 
92 	GHashTable* mark;
93 };
94 
95 struct _DmaSparseBufferClass
96 {
97 	GObjectClass parent;
98 
99 	void (*changed) (const DmaSparseBuffer *buffer);
100 
101 	void (*insert_line) (DmaSparseIter *iter, GtkTextIter *dst);
102 	gboolean (*refresh_iter) (DmaSparseIter *iter);
103 	void (*round_iter) (DmaSparseIter *iter, gboolean round_up);
104 	gboolean (*forward_line) (DmaSparseIter *iter);
105 	gboolean (*backward_line) (DmaSparseIter *iter);
106 	gulong (*get_address) (DmaSparseIter *iter);
107 };
108 
109 struct _DmaSparseBufferNode
110 {
111 	struct
112 	{
113 		DmaSparseBufferNode *prev;
114 		DmaSparseBufferNode *next;
115 	} cache;
116 	DmaSparseBufferNode *prev;
117 	DmaSparseBufferNode *next;
118 
119 	guint lower;		/* Lowest address of block */
120 	guint upper;		/* Highest address in the block (avoid overflow) */
121 };
122 
123 struct _DmaSparseIter
124 {
125 	DmaSparseBuffer *buffer;
126 	gint stamp;
127 	DmaSparseBufferNode *node;
128 	gulong base;
129 	glong offset;
130 	gint line;
131 };
132 
133 struct _DmaSparseBufferTransport
134 {
135 	DmaSparseBuffer *buffer;
136 	gulong start;
137 	gulong length;
138 	guint lines;
139 	guint chars;
140 	guint stamp;
141 	gint tag;
142 	DmaSparseBufferTransport *next;
143 };
144 
145 #endif /* _SPARSE_BUFFER_H */
146