mdbtools (0.5.99.0.6pre1.0.20051109-7) 001-previous-debian-diff.patch

Summary

 ChangeLog                             |   19 +++
 include/mdbtools.h                    |    6 
 src/gmdb2/debug.c                     |  210 ++++++++++++++++------------------
 src/gmdb2/gladefiles/gmdb-debug.glade |    3 
 src/libmdb/data.c                     |   63 ++++++----
 src/libmdb/iconv.c                    |   14 +-
 src/libmdb/table.c                    |    8 -
 src/libmdb/write.c                    |    2 
 src/util/prfreemap.c                  |    3 
 src/util/prindex.c                    |    3 
 10 files changed, 179 insertions(+), 152 deletions(-)

    
download this patch

Patch contents

diff --git a/ChangeLog b/ChangeLog
index 4e80c39..8bf7dfc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,9 @@ Wed Nov  9 07:23:01 CST 2005	Jeff Smith <whydoubt@yahoo.com>
 	* src/util/mdb-header.c:
 	* src/sql/parser.y: Fix several leaks and errors
 
+Fri Nov  4 06:10:41 CST 2005	Jeff Smith <whydoubt@yahoo.com>
+	* src/libmdb/data.c: Fix in reading bound boolean fields (Yasir Assam)
+	* src/libmdb/data.c: Several more fixes in reading data into bound fields
 
 Mon Oct 17 06:25:44 CDT 2005	Jeff Smith <whydoubt@yahoo.com>
 	* HACKING: Correct info about MDBICONV
@@ -21,7 +24,20 @@ Tue Aug 30 21:24:46 EDT 2005	Brian Bruns <brian@bruns.com>
 	* configure.in:	add --disable-gmdb2 switch
 
 
+Mon Jun 27 23:52:15 CDT 2005	Jeff Smith <whydoubt@yahoo.com>
+	* src/gmdb2/debug.c:
+	* src/libmdb/data.c:
+	* src/util/prfreemap.c:
+	* src/util/prindex.c: Use more appropriate types (void *, size_t)
+
+
+Sat Jun 18 01:49:03 CDT 2005	Jeff Smith <whydoubt@yahoo.com>
+	* src/gmdb2/gladefiles/gmdb-debug.glade:
+	* src/gmdb2/debug.c: Fix several lockups, leaks, and warnings
+
 Thu Jun 16 21:19:37 CDT 2005	Jeff Smith <whydoubt@yahoo.com>
+	* src/libmdb/data.c: Fix segmentation fault
+	* src/libmdb/write.c: Fix bug in handling certain 'jump tables'
 	* src/util/mdb-schema.c: Handle 'file not found' case
 	* src/libmdb/catalog.c: Fix some potential segmentation faults
 
@@ -34,9 +50,12 @@ Thu Apr 28 21:34:57 CDT 2005	Jeff Smith <whydoubt@yahoo.com>
 	* src/util/mdb-check.c:
 	* src/util/sargtest.c: Remove an unused variable and a noop
 	* src/libmdb/backend.c:
+	* src/libmdb/iconv.c:
+	* src/libmdb/table.c:
 	* src/odbc/unittest.c: Clean up some gcc4 warnings and errors
 
 Sat Apr  9 15:40:17 CDT 2005	Jeff Smith <whydoubt@yahoo.com>
+	* src/gmdb2/gladefiles/gmdb-debug.glade:
 	* src/gmdb2/gladefiles/gmdb-schema.glade:
 	* src/gmdb2/gladefiles/gmdb-sql.glade:
 	* src/gmdb2/gladefiles/gmdb.glade: Gladefile fixes (Edward Catmur)
diff --git a/include/mdbtools.h b/include/mdbtools.h
index 8e3e44b..388b2a8 100644
--- a/include/mdbtools.h
+++ b/include/mdbtools.h
@@ -444,13 +444,13 @@ extern int mdb_rewind_table(MdbTableDef *table);
 extern int mdb_fetch_row(MdbTableDef *table);
 extern int mdb_is_fixed_col(MdbColumn *col);
 extern char *mdb_col_to_string(MdbHandle *mdb, unsigned char *buf, int start, int datatype, int size);
-extern int mdb_find_pg_row(MdbHandle *mdb, int pg_row, char **buf, int *off, int *len);
+extern int mdb_find_pg_row(MdbHandle *mdb, int pg_row, void **buf, int *off, size_t *len);
 extern int mdb_find_row(MdbHandle *mdb, int row, int *start, int *len);
 extern int mdb_find_end_of_row(MdbHandle *mdb, int row);
 extern int mdb_col_fixed_size(MdbColumn *col);
 extern int mdb_col_disp_size(MdbColumn *col);
-extern int mdb_ole_read_next(MdbHandle *mdb, MdbColumn *col, void *ole_ptr);
-extern int mdb_ole_read(MdbHandle *mdb, MdbColumn *col, void *ole_ptr, int chunk_size);
+extern size_t mdb_ole_read_next(MdbHandle *mdb, MdbColumn *col, void *ole_ptr);
+extern size_t mdb_ole_read(MdbHandle *mdb, MdbColumn *col, void *ole_ptr, int chunk_size);
 extern void mdb_set_date_fmt(const char *);
 extern int mdb_read_row(MdbTableDef *table, unsigned int row);
 
diff --git a/src/gmdb2/debug.c b/src/gmdb2/debug.c
index d911d07..030f5ea 100644
--- a/src/gmdb2/debug.c
+++ b/src/gmdb2/debug.c
@@ -42,9 +42,8 @@ static void gmdb_debug_text_off(GtkWidget *textbox);
 static GtkTreeIter *gmdb_debug_add_item(GtkTreeStore *store, GtkTreeIter *iter, gchar *text, int start, int len);
 static void gmdb_debug_clear(GladeXML *xml);
 static void gmdb_debug_dissect(GtkTreeStore *store, char *fbuf, int offset, int len);
-static guint16 get_uint16(unsigned char *c);
-static guint32 get_uint32(unsigned char *c);
-static gchar *gmdb_strappend(gchar *x, gchar *y);
+static guint16 get_uint16(void *c);
+static guint32 get_uint32(void *c);
 static long gmdb_get_max_page(MdbHandle *mdb);
 static void gmdb_debug_display(GladeXML *xml, guint32 page);
 static void gmdb_debug_jump(GladeXML *xml, int msb);
@@ -56,8 +55,8 @@ typedef struct GMdbValStr {
 } GMdbValStr;
 
 GMdbValStr table_types[] = {
-	{ 0x4e, "User Table" },
-	{ 0x53, "System Table" },
+	{ 0x4e, "User" },
+	{ 0x53, "System" },
 	{ 0, NULL }
 };
 GMdbValStr column_types[] = {
@@ -78,11 +77,11 @@ GMdbValStr column_types[] = {
 	{ 0, NULL }
 };
 GMdbValStr object_types[] = {
-	{ 0x00, "Database Definition Page" },
-	{ 0x01, "Data Page" },
-	{ 0x02, "Table Definition Page" },
-	{ 0x03, "Index Page" },
-	{ 0x04, "Leaf Index Page" },
+	{ 0x00, "Database Definition" },
+	{ 0x01, "Data" },
+	{ 0x02, "Table Definition" },
+	{ 0x03, "Index" },
+	{ 0x04, "Leaf Index" },
 	{ 0, NULL }
 };
 
@@ -90,36 +89,37 @@ GMdbValStr object_types[] = {
 static void
 gmdb_debug_select_cb(GtkTreeSelection *select, GladeXML *xml)
 {
-int start_row, end_row;
-int start_col, end_col;
-int i;
-GtkTreeIter iter;
-GtkTreeModel *model;
-gint32 start, end;
-GtkWidget *textview;
-
-	if (!select) return;
-
-	if (gtk_tree_selection_get_selected (select, &model, &iter)) {
-		gchar *fieldname;
-		gint32 len;
-		gtk_tree_model_get (model, &iter, 0, &fieldname, 
-			1, &start, 
-			2, &len, -1);
-		end = start + len - 1;
-		g_free (fieldname);
-	}
+	int start_row, end_row;
+	int start_col, end_col;
+	GtkTreeIter iter;
+	GtkTreeModel *model;
+	gint32 start, end, len;
+	GtkWidget *textview;
+	gchar *fieldname;
+
+	fprintf(stderr, "select_cb fired\n");
 
-	if (start == -1 || end == -1) return;
+	textview = glade_xml_get_widget (xml, "debug_textview");
+	gmdb_debug_text_off(textview);
+
+	if (!select)
+		return;
+	if (!gtk_tree_selection_get_selected (select, &model, &iter))
+		return;
 
+	gtk_tree_model_get (model, &iter, 0, &fieldname, 
+		1, &start, 
+		2, &len, -1);
+	g_free (fieldname);
+	if ((start == -1) || (len < 1))
+		return;
+
+	end = start + len - 1;
 	start_row = LINESZ * (start / 16);
 	end_row = LINESZ * (end / 16);
 	start_col = 8 + (start % 16) * 3;
 	end_col = 8 + (end % 16) * 3;
 
-	textview = glade_xml_get_widget (xml, "debug_textview");
-	gmdb_debug_text_off(textview);
-
 	if (start_row == end_row) {
 		gmdb_debug_text_on(textview, 
 			start_row + start_col,
@@ -128,6 +128,7 @@ GtkWidget *textview;
 			start_row + 59 + (start % 16),
 			start_row + 59 + (end % 16) + 1);
 	} else {
+		int i;
 		gmdb_debug_text_on(textview, 
 			start_row + start_col,
 			/* 55 = 8 (addr) + 15 (bytes) * 3 (%02x " ") + 2 (last byte) */
@@ -292,6 +293,8 @@ gmdb_debug_display_cb(GtkWidget *w, gpointer data)
 	gchar *s;
 	GladeXML *xml;
 
+	fprintf(stderr, "display fired\n");
+
 	if (!mdb) return;
 
 	win = gtk_widget_get_toplevel(w);
@@ -389,13 +392,6 @@ gmdb_debug_display(GladeXML *xml, guint32 page)
 	g_free(tbuf);
 }
 /* functions */
-static gchar *
-gmdb_strappend(gchar *x, gchar *y)
-{
-	gchar *z = g_strconcat(x, y);
-	g_free(x);
-	return z;
-}
 static long
 gmdb_get_max_page(MdbHandle *mdb)
 {
@@ -420,14 +416,14 @@ int i = 0;
 	return "unknown";
 }
 static guint16 
-get_uint16(unsigned char *c)
+get_uint16(void *c)
 {
 	guint16 i;
 	memcpy(&i, c, 2);
 	return GINT16_FROM_LE(i);
 }
 static guint32 
-get_uint32(unsigned char *c)
+get_uint32(void *c)
 {
 	guint32 l;
 	memcpy(&l, c, 4);
@@ -483,20 +479,16 @@ gmdb_debug_dissect_index2(GtkTreeStore *store, GtkTreeIter *parent, char *fbuf,
 	gmdb_debug_add_item(store, parent, str, offset+34, 4);
 
 	flags = fbuf[offset+38];
-	str = g_strdup("Index Flags (");
-	if (flags & MDB_IDX_UNIQUE) { 
-		str = gmdb_strappend(str, "Unique"); mod++; 
-	}
-	if (flags & MDB_IDX_IGNORENULLS) { 
-		if (mod) str = gmdb_strappend(str, ",");
-		str = gmdb_strappend(str, "Ignore Nulls"); mod++;
+	str = g_strconcat("Index Flags:",
+		(flags & MDB_IDX_UNIQUE) ? " Unique" : "",
+		(flags & MDB_IDX_IGNORENULLS) ? " IgnoreNulls" : "",
+		(flags & MDB_IDX_REQUIRED) ? " Required" : "",
+		NULL);
+	if (strcmp(str, "Index Flags:") == 0) {
+		gchar *str2 = g_strconcat(str, " None");
+		g_free(str);
+		str = str2;
 	}
-	if (flags & MDB_IDX_REQUIRED) { 
-		if (mod) str = gmdb_strappend(str, ",");
-		str = gmdb_strappend(str, "Required"); mod++;
-	}
-	if (!mod) str = gmdb_strappend(str, "None");
-	str = gmdb_strappend(str, ")");
 	gmdb_debug_add_item(store, parent, str, offset+38, 1);
 }
 static void 
@@ -577,7 +569,7 @@ gmdb_debug_dissect_leaf_pg(GtkTreeStore *store, char *fbuf, int offset, int len)
 	guint32 temp;
 
 	temp = get_uint32(fbuf+offset+4);
-	str = g_strdup_printf("Parents TDEF page: 0x%06x (%lu)", temp,
+	str = g_strdup_printf("Parent's TDEF page: 0x%06x (%lu)", temp,
 		(unsigned long)temp);
 	gmdb_debug_add_item(store, NULL, str, offset+4, 4);
 
@@ -690,8 +682,8 @@ gmdb_debug_dissect_tabledef_pg4(GtkTreeStore *store, char *fbuf, int offset, int
 {
 	gchar *str;
 	guint32 i, num_idx, num_cols, idx_entries;
-	int newbase;
-	GtkTreeIter *node, *container;
+	int newbase, infobase;
+	GtkTreeIter *container;
 	char *foff = fbuf + offset;
 
 	str = g_strdup_printf("Next TDEF Page: 0x%06x (%lu)",
@@ -700,7 +692,7 @@ gmdb_debug_dissect_tabledef_pg4(GtkTreeStore *store, char *fbuf, int offset, int
 	str = g_strdup_printf("Length of Data: %lu",
 		(unsigned long)get_uint32(foff+8));
 	gmdb_debug_add_item(store, NULL, str, offset+8, 4);
-	str = g_strdup_printf("# of Records: %lu",
+	str = g_strdup_printf("Records: %lu",
 		(unsigned long)get_uint32(foff+16));
 	gmdb_debug_add_item(store, NULL, str, offset+16, 4);
 	str = g_strdup_printf("Autonumber Value: %lu",
@@ -709,19 +701,19 @@ gmdb_debug_dissect_tabledef_pg4(GtkTreeStore *store, char *fbuf, int offset, int
 	str = g_strdup_printf("Table Type: 0x%02x (%s)", foff[40],
 		gmdb_val_to_str(table_types, foff[40]));
 	gmdb_debug_add_item(store, NULL, str, offset+40, 1);
-	str = g_strdup_printf("Max # of Columns: %u", get_uint16(foff+41));
+	str = g_strdup_printf("Max Columns: %u", get_uint16(foff+41));
 	gmdb_debug_add_item(store, NULL, str, offset+41, 2);
-	str = g_strdup_printf("# of VarCols: %u", get_uint16(foff+43));
+	str = g_strdup_printf("Var Columns: %u", get_uint16(foff+43));
 	gmdb_debug_add_item(store, NULL, str, offset+43, 2);
 	num_cols = get_uint16(foff+45);
-	str = g_strdup_printf("# of Columns: %u", num_cols);
+	str = g_strdup_printf("Columns: %u", num_cols);
 	gmdb_debug_add_item(store, NULL, str, offset+45, 2);
 	idx_entries = get_uint32(foff+47);
-	str = g_strdup_printf("# of Index Entries: %lu",
+	str = g_strdup_printf("Index Entries: %lu",
 		(unsigned long)idx_entries);
 	gmdb_debug_add_item(store, NULL, str, offset+47, 4);
 	num_idx = get_uint32(foff+51);
-	str = g_strdup_printf("# of Real Indices: %lu",
+	str = g_strdup_printf("Real Indices: %lu",
 		(unsigned long)num_idx);
 	gmdb_debug_add_item(store, NULL, str, offset+51, 4);
 
@@ -729,39 +721,43 @@ gmdb_debug_dissect_tabledef_pg4(GtkTreeStore *store, char *fbuf, int offset, int
 	gmdb_debug_add_page_ptr(store, NULL, fbuf, "Pages Freespace Pointer", offset+59);
 	newbase = offset+63;
 
-	str = g_strdup("Index Entries");
-	container = gmdb_debug_add_item(store, NULL, str, -1, 1);
+	if (num_idx > 0) {
+		str = g_strdup("Index Entries");
+		container = gmdb_debug_add_item(store, NULL, str, -1, 0);
+	}
 	for (i=0;i<num_idx;i++) {
+		GtkTreeIter *node;
 		str = g_strdup_printf("Index %d", i+1);
 		node = gmdb_debug_add_item(store, container, str, newbase, 12);
 		//gmdb_debug_dissect_index1(store, node, fbuf, offset+63);
 		newbase += 12;
 	}
 
-	str = g_strdup("Column Data");
-	container = gmdb_debug_add_item(store, NULL, str, -1, 1);
+	infobase = newbase;
+	newbase += 25 * num_cols;
+	str = g_strdup("Column Info");
+	container = gmdb_debug_add_item(store, NULL, str, -1, 0);
 	for (i=0;i<num_cols;i++) {
+		GtkTreeIter *node, *subnode;
+//		char *tmpstr;
+		int namelen;
+
 		str = g_strdup_printf("Column %d", i+1);
-		node = gmdb_debug_add_item(store, container, str, newbase, 25);
-		//gmdb_debug_dissect_column(store, node, fbuf, newbase);
-		newbase += 25;
-	}
+		node = gmdb_debug_add_item(store, container, str, -1, 0);
 
-	str = g_strdup("Column Names");
-	container = gmdb_debug_add_item(store, NULL, str, -1, 1);
-	for (i=0;i<num_cols;i++) {
-		char *tmpstr;
-		int namelen;
+		str = g_strdup("Data");
+		subnode = gmdb_debug_add_item(store, node, str, infobase, 25);
+		//gmdb_debug_dissect_column(store, subnode, fbuf, infobase);
+		infobase += 25;
 
+		str = g_strdup("Name");
 		namelen = get_uint16(fbuf+newbase);
 //		tmpstr = g_malloc(namelen + 1);
 //		strncpy(tmpstr, &fbuf[newbase+1], namelen);
 //		tmpstr[namelen]=0;
 //		str = g_strdup_printf("Column %d: %s", i+1, tmpstr);
 //		g_free(tmpstr);
-		str = g_strdup_printf("Column %d", i+1);
-		node = gmdb_debug_add_item(store, container, str,
-			newbase+2, namelen);
+		gmdb_debug_add_item(store, node, str, newbase+2, namelen);
 		newbase += namelen+2;
 	}
 }
@@ -810,7 +806,7 @@ gmdb_debug_dissect_tabledef_pg3(GtkTreeStore *store, char *fbuf, int offset, int
 	newbase = offset + 43;
 
 	str = g_strdup("Index Entries");
-	container = gmdb_debug_add_item(store, NULL, str, -1, 1);
+	container = gmdb_debug_add_item(store, NULL, str, -1, 0);
 	for (i=0;i<num_idx;i++) {
 		str = g_strdup_printf("Index %d", i+1);
 		node = gmdb_debug_add_item(store, container, str, newbase, 8);
@@ -819,7 +815,7 @@ gmdb_debug_dissect_tabledef_pg3(GtkTreeStore *store, char *fbuf, int offset, int
 	}
 
 	str = g_strdup("Column Data");
-	container = gmdb_debug_add_item(store, NULL, str, -1, 1);
+	container = gmdb_debug_add_item(store, NULL, str, -1, 0);
 	for (i=0;i<num_cols;i++) {
 		str = g_strdup_printf("Column %d", i+1);
 		node = gmdb_debug_add_item(store, container, str, newbase, 18);
@@ -828,7 +824,7 @@ gmdb_debug_dissect_tabledef_pg3(GtkTreeStore *store, char *fbuf, int offset, int
 	}
 
 	str = g_strdup("Column Names");
-	container = gmdb_debug_add_item(store, NULL, str, -1, 1);
+	container = gmdb_debug_add_item(store, NULL, str, -1, 0);
 	for (i=0;i<num_cols;i++) {
 		char *tmpstr;
 		int namelen;
@@ -844,7 +840,7 @@ gmdb_debug_dissect_tabledef_pg3(GtkTreeStore *store, char *fbuf, int offset, int
 		newbase += namelen + 1;
 	}
 	str = g_strdup("Index definition 1");
-	container = gmdb_debug_add_item(store, NULL, str, -1, 1);
+	container = gmdb_debug_add_item(store, NULL, str, -1, 0);
 	for (i=0;i<num_idx;i++) {
 		str = g_strdup_printf("Index %d", i+1);
 		node = gmdb_debug_add_item(store, container, str, newbase, 39);
@@ -852,7 +848,7 @@ gmdb_debug_dissect_tabledef_pg3(GtkTreeStore *store, char *fbuf, int offset, int
 		newbase += 39;
 	}
 	str = g_strdup("Index definition 2");
-	container = gmdb_debug_add_item(store, NULL, str, -1, 1);
+	container = gmdb_debug_add_item(store, NULL, str, -1, 0);
 	for (i=0;i<idx_entries;i++) {
 		str = g_strdup_printf("Index %d", i+1);
 		node = gmdb_debug_add_item(store, container, str, newbase, 20);
@@ -860,7 +856,7 @@ gmdb_debug_dissect_tabledef_pg3(GtkTreeStore *store, char *fbuf, int offset, int
 	}
 
 	str = g_strdup("Index Names");
-	container = gmdb_debug_add_item(store, NULL, str, -1, 1);
+	container = gmdb_debug_add_item(store, NULL, str, -1, 0);
 	for (i=0;i<idx_entries;i++) {
 		char *tmpstr;
 		int namelen;
@@ -889,7 +885,7 @@ gmdb_debug_dissect(GtkTreeStore *store, char *fbuf, int offset, int len)
 {
 	gchar *str;
 
-	str = g_strdup_printf("Object Type: 0x%02x (%s)", fbuf[offset],
+	str = g_strdup_printf("Page Type: 0x%02x (%s)", fbuf[offset],
 		gmdb_val_to_str(object_types, fbuf[offset]));
 	gmdb_debug_add_item(store, NULL, str, 0, 1);
 	switch (fbuf[offset]) {
@@ -947,44 +943,29 @@ static void
 gmdb_debug_text_on(GtkWidget *textbox, 
 	int start_byte, int end_byte)
 {
-GtkTextBuffer *buffer;
-GtkTextTag *tag;
-GtkTextIter start, end;
+	GtkTextBuffer *buffer;
+	GtkTextIter start, end;
 
 	buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textbox));
-
-	tag = gtk_text_buffer_create_tag (buffer, NULL,
-		"foreground", "white", NULL);  
-	tag = gtk_text_buffer_create_tag (buffer, NULL,
-		"background", "blue", NULL);  
-
 	gtk_text_buffer_get_iter_at_offset (buffer, &start, start_byte);
 	gtk_text_buffer_get_iter_at_offset (buffer, &end, end_byte);
 	gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(textbox), 
 		&start, 0.0, FALSE, 0.0, 0.0);
-	gtk_text_buffer_apply_tag (buffer, tag, &start, &end);
+	gtk_text_buffer_apply_tag_by_name (buffer, "debug_on", &start, &end);
 }
 
 static void
 gmdb_debug_text_off(GtkWidget *textbox)
 {
-GtkTextBuffer *buffer;
-GtkTextTag *tag;
-int end_byte;
-GtkTextIter start, end;
+	GtkTextBuffer *buffer;
+	int end_byte;
+	GtkTextIter start, end;
 
 	buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textbox));
-
-	tag = gtk_text_buffer_create_tag (buffer, NULL,
-		"foreground", "black", NULL);  
-	tag = gtk_text_buffer_create_tag (buffer, NULL,
-		"background", "white", NULL);  
-
 	end_byte = gtk_text_buffer_get_char_count(buffer);
 	gtk_text_buffer_get_iter_at_offset (buffer, &start, 0);
 	gtk_text_buffer_get_iter_at_offset (buffer, &end, end_byte);
-
-	gtk_text_buffer_apply_tag (buffer, tag, &start, &end);
+	gtk_text_buffer_remove_all_tags (buffer, &start, &end);
 }
 
 static gint
@@ -997,6 +978,7 @@ gmdb_debug_close_cb(GtkWidget *w, gpointer data)
 {
 	GladeXML *xml;
 
+	fprintf(stderr, "close fired\n");
 	xml = g_object_get_data(G_OBJECT(w), "debugwin_xml");
 	debug_list = g_list_remove(debug_list, xml);
 	gtk_widget_destroy(w);
@@ -1007,6 +989,7 @@ gmdb_debug_close_all()
 	GladeXML *xml;
 	GtkWidget *win;
 
+	fprintf(stderr, "close_all fired\n");
 	while ((xml = g_list_nth_data(debug_list, 0))) {
 		win = glade_xml_get_widget (xml, "debug_window");
 		debug_list = g_list_remove(debug_list, xml);
@@ -1029,6 +1012,7 @@ gmdb_debug_new_cb(GtkWidget *w, gpointer data)
 	/* load the interface */
 	debugwin_xml = glade_xml_new(GMDB_GLADEDIR "gmdb-debug.glade", NULL, NULL);
 	/* connect the signals in the interface */
+	fprintf(stderr, "autoconnect signals\n");
 	glade_xml_signal_autoconnect(debugwin_xml);
 	
 	debug_list = g_list_append(debug_list, debugwin_xml);
@@ -1089,7 +1073,8 @@ gmdb_debug_set_dissect_cb(GtkWidget *w, gpointer data)
 static void gmdb_debug_init(MdbHandle *mdb, GladeXML *xml)
 {
 	gchar *str;
-	GtkWidget *pglabel, *entry, *window;
+	GtkWidget *pglabel, *entry, *window, *textview;
+	GtkTextBuffer *buffer;
 	gboolean *dissect;
 
 	pglabel = glade_xml_get_widget (xml, "debug_num_label");
@@ -1104,4 +1089,9 @@ static void gmdb_debug_init(MdbHandle *mdb, GladeXML *xml)
 	dissect = g_malloc0(sizeof(guint));
 	*dissect = TRUE;
 	g_object_set_data(G_OBJECT(window), "dissect", dissect);
+
+	textview = glade_xml_get_widget (xml, "debug_textview");
+	buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview));
+	gtk_text_buffer_create_tag (buffer, "debug_on",
+		"foreground", "white", "background", "blue", NULL);  
 }
diff --git a/src/gmdb2/gladefiles/gmdb-debug.glade b/src/gmdb2/gladefiles/gmdb-debug.glade
index 1278e5b..041aac0 100644
--- a/src/gmdb2/gladefiles/gmdb-debug.glade
+++ b/src/gmdb2/gladefiles/gmdb-debug.glade
@@ -392,7 +392,8 @@
 		      <property name="label" translatable="yes">_Display</property>
 		      <property name="use_underline">True</property>
 		      <property name="relief">GTK_RELIEF_NORMAL</property>
-		      <signal name="clicked" handler="gmdb_debug_display_cb" object="debug_entry"/>
+		      <property name="focus_on_click">True</property>
+		      <signal name="clicked" handler="gtk_main_quit" object="debug_entry" last_modification_time="Tue, 23 Aug 2005 12:40:43 GMT"/>
 		    </widget>
 		    <packing>
 		      <property name="padding">0</property>
diff --git a/src/libmdb/data.c b/src/libmdb/data.c
index d0965e1..80fae1b 100644
--- a/src/libmdb/data.c
+++ b/src/libmdb/data.c
@@ -32,7 +32,9 @@ static int _mdb_attempt_bind(MdbHandle *mdb,
 	MdbColumn *col, unsigned char isnull, int offset, int len);
 static char *mdb_num_to_string(MdbHandle *mdb, int start, int datatype, int prec, int scale);
 static char *mdb_date_to_string(MdbHandle *mdb, int start);
-int mdb_copy_ole(MdbHandle *mdb, char *dest, int start, int size);
+#ifdef MDB_COPY_OLE
+static size_t mdb_copy_ole(MdbHandle *mdb, void *dest, int start, int size);
+#endif
 
 static char date_fmt[64] = "%x %X";
 
@@ -88,7 +90,7 @@ mdb_bind_column_by_name(MdbTableDef *table, gchar *col_name, void *bind_ptr, int
  * 
  * Returns: 0 on success.  1 on failure.
  */
-int mdb_find_pg_row(MdbHandle *mdb, int pg_row, char **buf, int *off, int *len)
+int mdb_find_pg_row(MdbHandle *mdb, int pg_row, void **buf, int *off, size_t *len)
 {
 	unsigned int pg = pg_row >> 8;
 	unsigned int row = pg_row & 0xff;
@@ -161,20 +163,23 @@ int bit_num = (col_num - 1) % 8;
 }
 /* bool has to be handled specially because it uses the null bit to store its 
 ** value*/
-static int 
+static size_t 
 mdb_xfer_bound_bool(MdbHandle *mdb, MdbColumn *col, int value)
 {
-	
 	col->cur_value_len = value;
 	if (col->bind_ptr) {
-		strcpy(col->bind_ptr,  value ? "0" : "1");
+		strcpy(col->bind_ptr, value ? "0" : "1");
+	}
+	if (col->len_ptr) {
+		*col->len_ptr = 1;
 	}
 
-	return 0;
+	return 1;
 }
-static int mdb_xfer_bound_ole(MdbHandle *mdb, int start, MdbColumn *col, int len)
+static size_t
+mdb_xfer_bound_ole(MdbHandle *mdb, int start, MdbColumn *col, int len)
 {
-	int ret = 0;
+	size_t ret = 0;
 	if (len) {
 		col->cur_value_start = start;
 		col->cur_value_len = len;
@@ -182,16 +187,23 @@ static int mdb_xfer_bound_ole(MdbHandle *mdb, int start, MdbColumn *col, int len
 		col->cur_value_start = 0;
 		col->cur_value_len = 0;
 	}
+#ifdef MDB_COPY_OLE
 	if (col->bind_ptr || col->len_ptr) {
-		//ret = mdb_copy_ole(mdb, col->bind_ptr, start, len);
-		memcpy(col->bind_ptr, &mdb->pg_buf[start], MDB_MEMO_OVERHEAD);
+		ret = mdb_copy_ole(mdb, col->bind_ptr, start, len);
 	}
+#else
+	if (col->bind_ptr) {
+		memcpy(col->bind_ptr, mdb->pg_buf + start, MDB_MEMO_OVERHEAD);
+	}
+	ret = MDB_MEMO_OVERHEAD;
+#endif
 	if (col->len_ptr) {
-		*col->len_ptr = MDB_MEMO_OVERHEAD;
+		*col->len_ptr = ret;
 	}
 	return ret;
 }
-static int mdb_xfer_bound_data(MdbHandle *mdb, int start, MdbColumn *col, int len)
+static size_t
+mdb_xfer_bound_data(MdbHandle *mdb, int start, MdbColumn *col, int len)
 {
 int ret;
 	//if (!strcmp("Name",col->name)) {
@@ -437,13 +449,13 @@ int i;
 	return text;
 }
 #endif
-int 
+size_t 
 mdb_ole_read_next(MdbHandle *mdb, MdbColumn *col, void *ole_ptr)
 {
 	guint32 ole_len;
-	char *buf;
+	void *buf;
 	int row_start;
-	int len;
+	size_t len;
 
 	ole_len = mdb_get_int32(ole_ptr, 0);
 
@@ -464,13 +476,13 @@ mdb_ole_read_next(MdbHandle *mdb, MdbColumn *col, void *ole_ptr)
 	}
 	return 0;
 }
-int 
+size_t 
 mdb_ole_read(MdbHandle *mdb, MdbColumn *col, void *ole_ptr, int chunk_size)
 {
 	guint32 ole_len;
-	char *buf;
+	void *buf;
 	int row_start;
-	int len;
+	size_t len;
 
 	ole_len = mdb_get_int32(ole_ptr, 0);
 	mdb_debug(MDB_DEBUG_OLE,"ole len = %d ole flags = %02x",
@@ -526,12 +538,13 @@ mdb_ole_read(MdbHandle *mdb, MdbColumn *col, void *ole_ptr, int chunk_size)
 		return 0;
 	}
 }
-int mdb_copy_ole(MdbHandle *mdb, char *dest, int start, int size)
+#ifdef MDB_COPY_OLE
+static size_t mdb_copy_ole(MdbHandle *mdb, void *dest, int start, int size)
 {
 	guint32 ole_len;
 	guint32 row_start, pg_row;
-	guint32 len;
-	char *buf, *pg_buf = mdb->pg_buf;
+	size_t len;
+	void *buf, *pg_buf = mdb->pg_buf;
 
 	if (size<MDB_MEMO_OVERHEAD) {
 		return 0;
@@ -589,12 +602,13 @@ int mdb_copy_ole(MdbHandle *mdb, char *dest, int start, int size)
 		return 0;
 	}
 }
+#endif
 static char *mdb_memo_to_string(MdbHandle *mdb, int start, int size)
 {
 	guint32 memo_len;
 	guint32 row_start, pg_row;
-	guint32 len;
-	char *buf, *pg_buf = mdb->pg_buf;
+	size_t len;
+	void *buf, *pg_buf = mdb->pg_buf;
 	char *text = (char *) g_malloc(MDB_BIND_SIZE);
 
 	if (size<MDB_MEMO_OVERHEAD) {
@@ -668,7 +682,8 @@ static char *mdb_memo_to_string(MdbHandle *mdb, int start, int size)
 		return text;
 	} else {
 		fprintf(stderr, "Unhandled memo field flags = %02x\n", memo_len >> 24);
-		return "";
+		strcpy(text, "");
+		return text;
 	}
 }
 static char *
diff --git a/src/libmdb/iconv.c b/src/libmdb/iconv.c
index 3ce1b27..bfd2760 100644
--- a/src/libmdb/iconv.c
+++ b/src/libmdb/iconv.c
@@ -43,7 +43,7 @@ mdb_unicode2ascii(MdbHandle *mdb, unsigned char *src, unsigned int slen, unsigne
 		unsigned int compress=1;
 		src += 2;
 		slen -= 2;
-		tmp = (char *)g_malloc(slen*2);
+		tmp = (unsigned char *)g_malloc(slen*2);
 		while (slen) {
 			if (*src == 0) {
 				compress = (compress) ? 0 : 1;
@@ -61,8 +61,8 @@ mdb_unicode2ascii(MdbHandle *mdb, unsigned char *src, unsigned int slen, unsigne
 		}
 	}
 
-	in_ptr = (tmp) ? tmp : src;
-	out_ptr = dest;
+	in_ptr = (char *)((tmp) ? tmp : src);
+	out_ptr = (char *)dest;
 	len_in = (tmp) ? tlen : slen;
 	len_out = dlen;
 
@@ -111,9 +111,9 @@ mdb_ascii2unicode(MdbHandle *mdb, unsigned char *src, unsigned int slen, unsigne
 	if ((!src) || (!dest))
 		return 0;
 
-        in_ptr = src;
-        out_ptr = dest;
-        len_in = (slen) ? slen : strlen(src);
+        in_ptr = (char *)src;
+        out_ptr = (char *)dest;
+        len_in = (slen) ? slen : strlen(in_ptr);
         len_out = dlen;
 
 #ifdef HAVE_ICONV
@@ -137,7 +137,7 @@ mdb_ascii2unicode(MdbHandle *mdb, unsigned char *src, unsigned int slen, unsigne
 
 	/* Unicode Compression */
 	if(IS_JET4(mdb) && (dlen>4)) {
-		char *tmp = g_malloc(dlen);
+		unsigned char *tmp = g_malloc(dlen);
 		unsigned int tptr = 0, dptr = 0;
 		int comp = 1;
 
diff --git a/src/libmdb/table.c b/src/libmdb/table.c
index c1eefe3..3119432 100644
--- a/src/libmdb/table.c
+++ b/src/libmdb/table.c
@@ -77,10 +77,10 @@ MdbTableDef *mdb_read_table(MdbCatalogEntry *entry)
 	MdbHandle *mdb = entry->mdb;
 	MdbFormatConstants *fmt = mdb->fmt;
 	int len, row_start, pg_row;
-	char *buf, *pg_buf = mdb->pg_buf;
+	void *buf, *pg_buf = mdb->pg_buf;
 
 	mdb_read_pg(mdb, entry->table_pg);
-	if (pg_buf[0] != 0x02)  /* not a valid table def page */
+	if (mdb_get_byte(pg_buf, 0) != 0x02)  /* not a valid table def page */
 		return NULL;
 	table = mdb_alloc_tabledef(entry);
 
@@ -270,7 +270,7 @@ GPtrArray *mdb_read_columns(MdbTableDef *table)
 	** column names - ordered the same as the column attributes table
 	*/
 	for (i=0;i<table->num_cols;i++) {
-		char *tmp_buf;
+		unsigned char *tmp_buf;
 		pcol = g_ptr_array_index(table->columns, i);
 
 		if (IS_JET4(mdb)) {
@@ -284,7 +284,7 @@ GPtrArray *mdb_read_columns(MdbTableDef *table)
 			fprintf(stderr,"Unknown MDB version\n");
 			continue;
 		}
-		tmp_buf = (char *) g_malloc(name_sz);
+		tmp_buf = (unsigned char *) g_malloc(name_sz);
 		read_pg_if_n(mdb, tmp_buf, &cur_pos, name_sz);
 		mdb_unicode2ascii(mdb, tmp_buf, name_sz, pcol->name, MDB_MAX_OBJ_NAME);
 		g_free(tmp_buf);
diff --git a/src/libmdb/write.c b/src/libmdb/write.c
index eaabb9a..bfe8b0c 100644
--- a/src/libmdb/write.c
+++ b/src/libmdb/write.c
@@ -132,7 +132,7 @@ mdb_crack_row3(MdbHandle *mdb, int row_start, int row_end, unsigned int bitmask_
 
 	jumps_used = 0;
 	for (i=0; i<row_var_cols+1; i++) {
-		if ((jumps_used < num_jumps)
+		while ((jumps_used < num_jumps)
 		 && (i == mdb->pg_buf[row_end-bitmask_sz-jumps_used-1])) {
 			jumps_used++;
 		}
diff --git a/src/util/prfreemap.c b/src/util/prfreemap.c
index 6420cc8..e0f9fca 100644
--- a/src/util/prfreemap.c
+++ b/src/util/prfreemap.c
@@ -25,7 +25,8 @@ main(int argc, char **argv)
 {
 MdbHandle *mdb;
 int j;
-long int pgnum = 0, row_start, map_sz;
+	long int pgnum = 0, row_start;
+	size_t map_sz;
 int coln = 1;
 unsigned char *map_buf;
 
diff --git a/src/util/prindex.c b/src/util/prindex.c
index 738ffa1..5504d11 100644
--- a/src/util/prindex.c
+++ b/src/util/prindex.c
@@ -80,7 +80,8 @@ void check_row(MdbHandle *mdb, MdbIndex *idx, guint32 pg, int row, unsigned char
 {
 	MdbField fields[256];
 	unsigned int num_fields, i, j;
-	int row_start, row_size;
+	int row_start;
+	size_t row_size;
 	MdbColumn *col;
 	gchar buf[256], key[256];
 	int elem;