Dear friends,
with the help of Tadej and others, I have written the lexical scanner for bibtex that will read from file. For the time being, its writing in a file, and treeview is reading the file.
The problem is when I am reading those files(say,fauth.dat) as array element(aauth[i]), and showing on treeview, its giving box like character, giving warning:
Quote:
Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text()
but if I print them using g_print, they are printed correctly,
Quote:
$ ./mkbib
Content9
Chowdhury, D.
All the files are in ASCII
Quote:
$ file fauth.dat
fauth.dat: ASCII text
So, not really sure what is causing the trouble.
I am listing all the codes that are involved(in my opinion), which is making it too large a post. But will probably you can diagnose the source of error with ease.
Please Help.
The code for the parsing and tree store is as:
Code:
GScanner *scanner;
GHashTable *table;
guint ret;
scanner = g_scanner_new (NULL);
gint ttest=-1;
ttest=g_open(filename,O_RDONLY);
g_scanner_input_file (scanner, ttest);
table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
do
{
// g_hash_table_remove_all (table);
ret = parse_entry (scanner, table);
if (ret == G_TOKEN_ERROR)
continue;
g_scanner_peek_next_token (scanner);
}
while (scanner->next_token != G_TOKEN_EOF &&
scanner->next_token != G_TOKEN_ERROR);
//if(g_ascii_strcasecmp (key,"author")==0)g_print("%s frm_main %s\n",key,val);
/* finsish parsing */
g_scanner_destroy (scanner);
g_hash_table_destroy (table);
}
int i=0;//,j=0,k=0;
int num_line=-1, ch;
FILE *fauth, *fyear, *ftitle;
GString *content=g_string_new(NULL);
GIOChannel *tfauth;
gsize bytes;
tfauth=g_io_channel_new_file("fauth.dat","r",NULL);
do{
num_line++;
}while(g_io_channel_read_line_string(tfauth, content,&bytes, NULL) != G_IO_STATUS_EOF);
g_print("Content%d\n", num_line);
char aauth[num_line][128],ayear[num_line][4],atitle[num_line][128];//, buffer[500];
fauth=g_fopen("fauth.dat","r");
fyear=g_fopen("fyear.dat","r");
ftitle=g_fopen("ftitle.dat","r");
if(!fauth||!ftitle||!fyear){
printf("fauth failed\n");
}
else{
while (i < num_line && fgets(aauth[i], sizeof aauth[i], fauth)
&& fgets(ayear[i], sizeof ayear[i], fyear)
&& fgets(atitle[i], sizeof atitle[i], ftitle))
g_printf("%s\n",aauth[i]);
i++;
}
fclose(fauth);
fclose(fyear);
fclose(ftitle);
for (i = 0; i < num_line; i++){
gtk_tree_store_append(GTK_TREE_STORE(treestore), &toplevel,NULL);
gtk_tree_store_set(treestore, &toplevel,
COL_BIB_TYPE, NULL,
COL_BIB_NAME, aauth[i],
COL_BIB_YEAR, ayear[i],
COL_BIB_PUB, atitle[i],
-1);
}
The treestore is defined as:
Code:
static GtkTreeModel *
create_and_fill_model(void) {
treestore = gtk_tree_store_new(NUM_COLS,
G_TYPE_STRING,
G_TYPE_STRING,
G_TYPE_STRING,
G_TYPE_STRING);
return GTK_TREE_MODEL(treestore);
}
static GtkWidget *
create_view_and_model(void) {
GtkTreeViewColumn *col;
GtkCellRenderer *renderer;
GtkWidget *view;
GtkTreeModel *model;
view = gtk_tree_view_new();
/* --- Column #0 --- */
col = gtk_tree_view_column_new();
gtk_tree_view_column_set_title(col, "Type");
gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start(col, renderer, TRUE);
gtk_tree_view_column_add_attribute(col, renderer, "text", COL_BIB_TYPE);
/* --- Column #1 --- */
col = gtk_tree_view_column_new();
gtk_tree_view_column_set_title(col, "Name");
gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start(col, renderer, TRUE);
gtk_tree_view_column_add_attribute(col, renderer, "text", COL_BIB_NAME);
/* --- Column #2 --- */
col = gtk_tree_view_column_new();
gtk_tree_view_column_set_title(col, "Year");
gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start(col, renderer, TRUE);
gtk_tree_view_column_add_attribute(col, renderer, "text", COL_BIB_YEAR);
/* g_object_set(renderer,
"weight", PANGO_WEIGHT_BOLD,
"weight-set", TRUE,
NULL);
*/
/* --- Column #3 --- */
col = gtk_tree_view_column_new();
gtk_tree_view_column_set_title(col, "Journal");
gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start(col, renderer, TRUE);
gtk_tree_view_column_add_attribute(col, renderer, "text", COL_BIB_PUB);
/* connect a cell data function */
// gtk_tree_view_column_set_cell_data_func(col, renderer, age_cell_data_func, NULL, NULL);
model = create_and_fill_model();
gtk_tree_view_set_model(GTK_TREE_VIEW(view), model);
g_object_unref(model); /* destroy model automatically with view */
gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)),
GTK_SELECTION_NONE);
return view;
}
and the parsing script itself is:
Code:
static guint parse_entry (GScanner *scanner,
GHashTable *table)
{
/* Entry starts with @ */
g_scanner_get_next_token (scanner);
if (scanner->token != '@')
return G_TOKEN_ERROR;
/* Now get identifier */
g_scanner_get_next_token (scanner);
if (scanner->token != G_TOKEN_IDENTIFIER){
return G_TOKEN_ERROR;
}
// g_hash_table_insert (table, g_strdup ("type"),
// g_print("%s ",g_strdup (scanner->value.v_identifier));
/* Brace */
g_scanner_get_next_token (scanner);
if (scanner->token != G_TOKEN_LEFT_CURLY)
return G_TOKEN_ERROR;
/* ID */
g_scanner_get_next_token (scanner);
if (scanner->token != G_TOKEN_IDENTIFIER)
return G_TOKEN_ERROR;
// g_hash_table_insert (table, g_strdup ("id"),
// g_print("%s ", g_strdup (scanner->value.v_identifier));
while (TRUE)
{
tauth=fopen("fauth.dat","a");
tyear=fopen("fyear.dat","a");
ttitle=fopen("ftitle.dat","a");
g_scanner_get_next_token (scanner);
if (scanner->token != G_TOKEN_COMMA)
return G_TOKEN_ERROR;
g_scanner_get_next_token (scanner);
if (scanner->token != G_TOKEN_IDENTIFIER)
return G_TOKEN_ERROR;
key = g_strdup (scanner->value.v_identifier);
g_scanner_get_next_token (scanner);
if (scanner->token != '=')
{
g_free (key);
return G_TOKEN_ERROR;
}
g_scanner_get_next_token (scanner);
if (scanner->token != G_TOKEN_STRING)
{
g_free (key);
return G_TOKEN_ERROR;
}
val = g_strdup (scanner->value.v_string);
// g_hash_table_insert(table, key, val);
//g_print("%s",key);
if(g_ascii_strcasecmp (key,"author")==0)g_fprintf(tauth,"%s\n",g_strndup(val,128));
if(g_ascii_strcasecmp (key,"year")==0)g_fprintf(tyear,"%s\n",val);
if(g_ascii_strcasecmp (key,"title")==0)g_fprintf(ttitle,"%s\n",g_strndup(val,128));
g_scanner_peek_next_token (scanner);
if (scanner->next_token == G_TOKEN_RIGHT_CURLY)
break;
fclose(tauth);
fclose(tyear);
fclose(ttitle);
}
/* Eat last curly brace and return */
g_scanner_get_next_token (scanner);
return G_TOKEN_NONE;
}