From 22c3b15218ceb77075f4bf782760dfe50fd07009 Mon Sep 17 00:00:00 2001 From: whydoubt Date: Tue, 28 Jun 2005 04:53:37 +0000 Subject: [PATCH] Use more appropriate types (void *, size_t) --- ChangeLog | 9 +++++ include/mdbtools.h | 16 ++++----- src/gmdb2/debug.c | 8 ++--- src/libmdb/data.c | 38 ++++++++++++--------- src/libmdb/file.c | 9 +++-- src/libmdb/write.c | 79 +++++++++++++++++++++----------------------- src/util/prfreemap.c | 3 +- src/util/prindex.c | 3 +- 8 files changed, 89 insertions(+), 76 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2b907b0..bbb23ce 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Mon Jun 27 23:52:15 CDT 2005 Jeff Smith + * include/mdbtools.h: + * src/gmdb2/debug.c: + * src/libmdb/data.c: + * src/libmdb/file.c: + * src/libmdb/write.c: + * src/util/prfreemap.c: + * src/util/prindex.c: Use more appropriate types (void *, size_t) + Thu Jun 23 00:40:32 CDT 2005 Jeff Smith * src/libmdb/write.c: Use col->is_fixed member directly * doc/reference/libmdb/libmdb-sections.txt: diff --git a/include/mdbtools.h b/include/mdbtools.h index aacc37b..9d83395 100644 --- a/include/mdbtools.h +++ b/include/mdbtools.h @@ -337,11 +337,11 @@ typedef struct { int noskip_del; /* don't skip deleted rows */ /* object allocation map */ guint32 map_base_pg; - unsigned int map_sz; + size_t map_sz; unsigned char *usage_map; /* pages with free space left */ guint32 freemap_base_pg; - unsigned int freemap_sz; + size_t freemap_sz; unsigned char *free_usage_map; /* query planner */ MdbSargNode *sarg_tree; @@ -441,13 +441,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, void *buf, int start, int datatype, int size); -extern int mdb_find_pg_row(MdbHandle *mdb, int pg_row, void **buf, int *off, int *len); -extern int mdb_find_row(MdbHandle *mdb, int row, int *start, 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, size_t *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); @@ -502,10 +502,10 @@ extern int mdb_crack_row(MdbTableDef *table, int row_start, int row_end, MdbFiel extern guint16 mdb_add_row_to_pg(MdbTableDef *table, unsigned char *row_buffer, int new_row_size); extern int mdb_update_index(MdbTableDef *table, MdbIndex *idx, unsigned int num_fields, MdbField *fields, guint32 pgnum, guint16 rownum); extern int mdb_pack_row(MdbTableDef *table, unsigned char *row_buffer, unsigned int num_fields, MdbField *fields); -extern int mdb_replace_row(MdbTableDef *table, int row, unsigned char *new_row, int new_row_size); +extern int mdb_replace_row(MdbTableDef *table, int row, void *new_row, int new_row_size); extern int mdb_pg_get_freespace(MdbHandle *mdb); extern int mdb_update_row(MdbTableDef *table); -extern unsigned char *mdb_new_data_pg(MdbCatalogEntry *entry); +extern void *mdb_new_data_pg(MdbCatalogEntry *entry); /* map.c */ extern guint32 mdb_map_find_next_freepage(MdbTableDef *table, int row_size); diff --git a/src/gmdb2/debug.c b/src/gmdb2/debug.c index 1b98165..28f1900 100644 --- a/src/gmdb2/debug.c +++ b/src/gmdb2/debug.c @@ -42,8 +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 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); @@ -412,14 +412,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); diff --git a/src/libmdb/data.c b/src/libmdb/data.c index eff5e7d..bc2249a 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, char *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, void **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; @@ -102,7 +104,7 @@ int mdb_find_pg_row(MdbHandle *mdb, int pg_row, void **buf, int *off, int *len) return 0; } -int mdb_find_row(MdbHandle *mdb, int row, int *start, int *len) +int mdb_find_row(MdbHandle *mdb, int row, int *start, size_t *len) { int rco = mdb->fmt->row_count_offset; int next_start; @@ -183,7 +185,9 @@ static int mdb_xfer_bound_ole(MdbHandle *mdb, int start, MdbColumn *col, int len col->cur_value_len = 0; } if (col->bind_ptr || col->len_ptr) { - //ret = mdb_copy_ole(mdb, col->bind_ptr, start, len); +#ifdef MDB_COPY_OLE + ret = mdb_copy_ole(mdb, col->bind_ptr, start, len); +#endif memcpy(col->bind_ptr, &mdb->pg_buf[start], MDB_MEMO_OVERHEAD); } if (col->len_ptr) { @@ -235,7 +239,8 @@ int mdb_read_row(MdbTableDef *table, unsigned int row) MdbColumn *col; unsigned int i; int rc; - int row_start, row_size; + int row_start; + size_t row_size; int delflag, lookupflag; MdbField fields[256]; int num_fields; @@ -437,13 +442,13 @@ int i; return text; } #endif -int +size_t mdb_ole_read_next(MdbHandle *mdb, MdbColumn *col, void *ole_ptr) { guint32 ole_len; void *buf; int row_start; - int len; + size_t len; ole_len = mdb_get_int32(ole_ptr, 0); @@ -464,13 +469,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; 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,11 +531,12 @@ 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, char *dest, int start, int size) { guint32 ole_len; gint32 row_start, pg_row; - gint32 len; + size_t len; void *buf, *pg_buf = mdb->pg_buf; if (sizepg_buf; char *text = (char *) g_malloc(MDB_BIND_SIZE); @@ -803,6 +810,7 @@ char *mdb_col_to_string(MdbHandle *mdb, void *buf, int start, int datatype, int char *text; float tf; double td; + void *pg_buf = mdb->pg_buf; switch (datatype) { case MDB_BOOL: @@ -821,13 +829,13 @@ char *mdb_col_to_string(MdbHandle *mdb, void *buf, int start, int datatype, int mdb_get_int32(buf, start)); break; case MDB_FLOAT: - tf = mdb_get_single(mdb->pg_buf, start); + tf = mdb_get_single(pg_buf, start); text = g_strdup_printf("%.*f", FLT_DIG - floor_log10(tf,1) - 1, tf); trim_trailing_zeros(text); break; case MDB_DOUBLE: - td = mdb_get_double(mdb->pg_buf, start); + td = mdb_get_double(pg_buf, start); text = g_strdup_printf("%.*f", DBL_DIG - floor_log10(td,0) - 1, td); trim_trailing_zeros(text); @@ -837,7 +845,7 @@ char *mdb_col_to_string(MdbHandle *mdb, void *buf, int start, int datatype, int text = g_strdup(""); } else { text = (char *) g_malloc(MDB_BIND_SIZE); - mdb_unicode2ascii(mdb, mdb->pg_buf + start, + mdb_unicode2ascii(mdb, pg_buf + start, size, text, MDB_BIND_SIZE); } break; diff --git a/src/libmdb/file.c b/src/libmdb/file.c index ee894d6..58450aa 100644 --- a/src/libmdb/file.c +++ b/src/libmdb/file.c @@ -52,7 +52,7 @@ MdbFormatConstants MdbJet3Constants = { 2048, 0x08, 12, 25, 27, 31, 35, 36, 43, 8, 13, 16, 1, 18, 39, 3, 14, 5 }; -static ssize_t _mdb_read_pg(MdbHandle *mdb, unsigned char *pg_buf, unsigned long pg); +static ssize_t _mdb_read_pg(MdbHandle *mdb, void *pg_buf, unsigned long pg); /** * mdb_find_file: @@ -65,7 +65,7 @@ static ssize_t _mdb_read_pg(MdbHandle *mdb, unsigned char *pg_buf, unsigned long * freeing. **/ -static gchar *mdb_find_file(const char *file_name) +static char *mdb_find_file(const char *file_name) { struct stat status; gchar *mdbpath, **dir, *tmpfname; @@ -121,7 +121,7 @@ MdbHandle *mdb_open(const char *filename, MdbFileFlags flags) mdb->f = (MdbFile *) g_malloc0(sizeof(MdbFile)); mdb->f->refs = 1; mdb->f->fd = -1; - mdb->f->filename = (char *) mdb_find_file(filename); + mdb->f->filename = mdb_find_file(filename); if (!mdb->f->filename) { fprintf(stderr, "Can't alloc filename\n"); mdb_close(mdb); @@ -253,7 +253,7 @@ ssize_t mdb_read_alt_pg(MdbHandle *mdb, unsigned long pg) len = _mdb_read_pg(mdb, mdb->alt_pg_buf, pg); return len; } -static ssize_t _mdb_read_pg(MdbHandle *mdb, unsigned char *pg_buf, unsigned long pg) +static ssize_t _mdb_read_pg(MdbHandle *mdb, void *pg_buf, unsigned long pg) { ssize_t len; struct stat status; @@ -289,7 +289,6 @@ char tmpbuf[MDB_PGSIZE]; } -/* really stupid, just here for consistancy */ unsigned char mdb_get_byte(void *buf, int offset) { return ((unsigned char *)(buf))[offset]; diff --git a/src/libmdb/write.c b/src/libmdb/write.c index b750f70..6ced04e 100644 --- a/src/libmdb/write.c +++ b/src/libmdb/write.c @@ -30,19 +30,19 @@ static int mdb_add_row_to_leaf_pg(MdbTableDef *table, MdbIndex *idx, MdbIndexPage *ipg, MdbField *idx_fields, guint32 pgnum, guint16 rownum); void -_mdb_put_int16(unsigned char *buf, guint32 offset, guint32 value) +_mdb_put_int16(void *buf, guint32 offset, guint32 value) { value = GINT32_TO_LE(value); memcpy(buf + offset, &value, 2); } void -_mdb_put_int32(unsigned char *buf, guint32 offset, guint32 value) +_mdb_put_int32(void *buf, guint32 offset, guint32 value) { value = GINT32_TO_LE(value); memcpy(buf + offset, &value, 4); } void -_mdb_put_int32_msb(unsigned char *buf, guint32 offset, guint32 value) +_mdb_put_int32_msb(void *buf, guint32 offset, guint32 value) { value = GINT32_TO_BE(value); memcpy(buf + offset, &value, 4); @@ -148,7 +148,7 @@ mdb_crack_row(MdbTableDef *table, int row_start, int row_end, MdbField *fields) MdbColumn *col; MdbCatalogEntry *entry = table->entry; MdbHandle *mdb = entry->mdb; - unsigned char *pg_buf = mdb->pg_buf; + void *pg_buf = mdb->pg_buf; unsigned int row_var_cols=0, row_cols; unsigned char *nullmask; unsigned int bitmask_sz; @@ -162,20 +162,20 @@ mdb_crack_row(MdbTableDef *table, int row_start, int row_end, MdbField *fields) } if (IS_JET4(mdb)) { - row_cols = mdb_get_int16(mdb->pg_buf, row_start); + row_cols = mdb_get_int16(pg_buf, row_start); col_count_size = 2; } else { - row_cols = pg_buf[row_start]; + row_cols = mdb_get_byte(pg_buf, row_start); col_count_size = 1; } bitmask_sz = (row_cols + 7) / 8; - nullmask = &pg_buf[row_end - bitmask_sz + 1]; + nullmask = pg_buf + row_end - bitmask_sz + 1; /* read table of variable column locations */ row_var_cols = IS_JET4(mdb) ? - mdb_get_int16(mdb->pg_buf, row_end - bitmask_sz - 1) : - pg_buf[row_end - bitmask_sz]; + mdb_get_int16(pg_buf, row_end - bitmask_sz - 1) : + mdb_get_byte(pg_buf, row_end - bitmask_sz); var_col_offsets = (unsigned int *)g_malloc((row_var_cols+1)*sizeof(int)); if (table->num_var_cols > 0) { if (IS_JET4(mdb)) { @@ -211,7 +211,7 @@ mdb_crack_row(MdbTableDef *table, int row_start, int row_end, MdbField *fields) && (fixed_cols_found < row_fixed_cols)) { col_start = col->fixed_offset + col_count_size; fields[i].start = row_start + col_start; - fields[i].value = &pg_buf[row_start + col_start]; + fields[i].value = pg_buf + row_start + col_start; fields[i].siz = col->col_size; fixed_cols_found++; /* Use col->var_col_num because a deleted column is still @@ -220,7 +220,7 @@ mdb_crack_row(MdbTableDef *table, int row_start, int row_end, MdbField *fields) && (col->var_col_num < row_var_cols)) { col_start = var_col_offsets[col->var_col_num]; fields[i].start = row_start + col_start; - fields[i].value = &pg_buf[row_start + col_start]; + fields[i].value = pg_buf + row_start + col_start; fields[i].siz = var_col_offsets[(col->var_col_num)+1] - col_start; } else { @@ -356,7 +356,7 @@ mdb_pack_row3(MdbTableDef *table, unsigned char *row_buffer, unsigned int num_fi } offset_high = (unsigned char *) g_malloc(var_cols+1); - offset_high[0] = (pos << 8) & 0xff; + offset_high[0] = (pos >> 8) & 0xff; j = 1; /* EOD */ @@ -367,7 +367,7 @@ mdb_pack_row3(MdbTableDef *table, unsigned char *row_buffer, unsigned int num_fi for (i=num_fields; i>0; i--) { if (!fields[i-1].is_fixed) { row_buffer[pos++] = fields[i-1].offset & 0xff; - offset_high[j++] = (fields[i-1].offset << 8) & 0xff; + offset_high[j++] = (fields[i-1].offset >> 8) & 0xff; } } @@ -422,30 +422,24 @@ mdb_pg_get_freespace(MdbHandle *mdb) mdb_debug(MDB_DEBUG_WRITE,"free space left on page = %d", free_end - free_start); return (free_end - free_start); } -unsigned char * +void * mdb_new_leaf_pg(MdbCatalogEntry *entry) { MdbHandle *mdb = entry->mdb; - unsigned char *new_pg; - - new_pg = (unsigned char *) g_malloc0(mdb->fmt->pg_size); + void *new_pg = g_malloc0(mdb->fmt->pg_size); - new_pg[0]=0x04; - new_pg[1]=0x01; + _mdb_put_int16(new_pg, 2, 0x0104); _mdb_put_int32(new_pg, 4, entry->table_pg); return new_pg; } -unsigned char * +void * mdb_new_data_pg(MdbCatalogEntry *entry) { MdbFormatConstants *fmt = entry->mdb->fmt; - unsigned char *new_pg; - - new_pg = (unsigned char *) g_malloc0(fmt->pg_size); + void *new_pg = g_malloc0(fmt->pg_size); - new_pg[0]=0x01; - new_pg[1]=0x01; + _mdb_put_int16(new_pg, 2, 0x0101); _mdb_put_int16(new_pg, 2, fmt->pg_size - fmt->row_count_offset - 2); _mdb_put_int32(new_pg, 4, entry->table_pg); @@ -574,8 +568,9 @@ mdb_insert_row(MdbTableDef *table, int num_fields, MdbField *fields) guint16 mdb_add_row_to_pg(MdbTableDef *table, unsigned char *row_buffer, int new_row_size) { - unsigned char *new_pg; - int num_rows, i, pos, row_start, row_size; + void *new_pg; + int num_rows, i, pos, row_start; + size_t row_size; MdbCatalogEntry *entry = table->entry; MdbHandle *mdb = entry->mdb; MdbFormatConstants *fmt = mdb->fmt; @@ -606,14 +601,14 @@ mdb_add_row_to_pg(MdbTableDef *table, unsigned char *row_buffer, int new_row_siz for (i=0;ipg_buf[row_start], row_size); + memcpy(new_pg + pos, mdb->pg_buf + row_start, row_size); _mdb_put_int16(new_pg, (fmt->row_count_offset + 2) + (i*2), pos); } } /* add our new row */ pos -= new_row_size; - memcpy(&new_pg[pos], row_buffer, new_row_size); + memcpy(new_pg + pos, row_buffer, new_row_size); /* add row to the row offset table */ _mdb_put_int16(new_pg, (fmt->row_count_offset + 2) + (num_rows*2), pos); @@ -642,7 +637,7 @@ MdbCatalogEntry *entry = table->entry; MdbHandle *mdb = entry->mdb; MdbField fields[256]; unsigned char row_buffer[4096]; -int old_row_size, new_row_size, delta; + size_t old_row_size, new_row_size; unsigned int num_fields; if (!mdb->f->writable) { @@ -683,8 +678,7 @@ unsigned int num_fields; new_row_size = mdb_pack_row(table, row_buffer, num_fields, fields); if (mdb_get_option(MDB_DEBUG_WRITE)) buffer_dump(row_buffer, 0, new_row_size-1); - delta = new_row_size - old_row_size; - if ((mdb_pg_get_freespace(mdb) - delta) < 0) { + if (new_row_size > (old_row_size + mdb_pg_get_freespace(mdb))) { fprintf(stderr, "No space left on this page, update will not occur\n"); return 0; } @@ -693,15 +687,16 @@ unsigned int num_fields; return 0; } int -mdb_replace_row(MdbTableDef *table, int row, unsigned char *new_row, int new_row_size) +mdb_replace_row(MdbTableDef *table, int row, void *new_row, int new_row_size) { MdbCatalogEntry *entry = table->entry; MdbHandle *mdb = entry->mdb; int pg_size = mdb->fmt->pg_size; int rco = mdb->fmt->row_count_offset; -unsigned char *new_pg; + void *new_pg; guint16 num_rows; -int row_start, row_size; + int row_start; + size_t row_size; int i, pos; if (mdb_get_option(MDB_DEBUG_WRITE)) { @@ -720,20 +715,20 @@ int i, pos; for (i=0;ipg_buf[row_start], row_size); + memcpy(new_pg + pos, mdb->pg_buf + row_start, row_size); _mdb_put_int16(new_pg, rco + 2 + i*2, pos); } /* our row */ pos -= new_row_size; - memcpy(&new_pg[pos], new_row, new_row_size); + memcpy(new_pg + pos, new_row, new_row_size); _mdb_put_int16(new_pg, rco + 2 + row*2, pos); /* rows after */ for (i=row+1;ipg_buf[row_start], row_size); + memcpy(new_pg + pos, mdb->pg_buf + row_start, row_size); _mdb_put_int16(new_pg, rco + 2 + i*2, pos); } @@ -766,7 +761,7 @@ mdb_copy_index_pg(MdbTableDef *table, MdbIndex *idx, MdbIndexPage *ipg) MdbColumn *col; guint32 pg, pg_row; guint16 row; - unsigned char *new_pg; + void *new_pg; unsigned char key_hash[256]; unsigned char iflag; int keycol; @@ -812,7 +807,7 @@ mdb_copy_index_pg(MdbTableDef *table, MdbIndex *idx, MdbIndexPage *ipg) buffer_dump(key_hash, 0, col->col_size - 1); } - memcpy(&new_pg[ipg->offset], &mdb->pg_buf[ipg->offset], ipg->len); + memcpy(new_pg + ipg->offset, mdb->pg_buf + ipg->offset, ipg->len); ipg->offset += ipg->len; ipg->len = 0; @@ -831,8 +826,8 @@ mdb_copy_index_pg(MdbTableDef *table, MdbIndex *idx, MdbIndexPage *ipg) buffer_dump(key_hash, 0, col->col_size-1); printf("--------\n"); } - new_pg[ipg->offset] = 0x7f; - memcpy(&new_pg[ipg->offset + 1], key_hash, col->col_size); + ((char *)new_pg)[ipg->offset] = 0x7f; + memcpy(new_pg + ipg->offset + 1, key_hash, col->col_size); pg_row = (pgnum << 8) | ((rownum-1) & 0xff); _mdb_put_int32_msb(new_pg, ipg->offset + 5, pg_row); ipg->idx_starts[row++] = ipg->offset + ipg->len; 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;