#include "grove.h" #include "gramatica.tab.h" Elem* Elem_new(int tipo,GHashTable* hash,int nlinha) { Elem* nova; nova=(Elem *)malloc(sizeof(Elem)); nova->tipo=tipo; nova->hash=hash; nova->nlinha=nlinha; return nova; } Elem* Elem_insert(Elem* list,Elem* el){ if(list==NULL) list=el; else list->next=Elem_insert(list->next,el); return list; } int Hash_elem_free(void* chave, void* val, void* zbr) { g_string_free((GString *)chave,TRUE); g_string_free((GString *)val,TRUE); return TRUE; } void Elem_free(Elem * el){ g_hash_table_foreach_remove(el->hash,Hash_elem_free,NULL); g_hash_table_destroy(el->hash); Elem_free(el->next); if(el->tipo==texto) g_string_free((GString *)el->content,TRUE); else Elem_free(el->content); free(el); } Elem* Elem_texto_new(GString* str){ Elem* nova; nova=Elem_new(texto,NULL,0); nova->next=NULL; nova->content=(Elem *)str; return nova; } GString * Elem_texto_get(Elem* el){ if((el)&&(el->tipo==texto)){ return (GString *)(el->content); } } Elem* Set_next(Elem* prim,Elem* segu){ prim->next=segu; return prim; } Elem* Set_content(Elem* prim,Elem* segu){ prim->content=segu; return prim; } guint Gstr2int (gconstpointer str){ return g_str_hash(((GString *)str)->str); } gint Compgstr(gconstpointer str1,gconstpointer str2){ return g_str_equal(((GString *)str1)->str,((GString *)str2)->str); } void imp_atrib(gpointer key, gpointer value, gpointer data){ printf("A %s=%s\n",((GString*)key)->str,((GString*)value)->str); } void imp_atribs(GHashTable * hash){ g_hash_table_foreach(hash,imp_atrib,NULL); } void _travessia_Esis(Elem *el){ travessia(el); } void travessia(Elem* el){ if(el){ if(el->tipo==texto){ printf("-%s\n",Elem_texto_get(el)->str); } else{ printf("( %s\n",Tipo_to_Str(el->tipo)); imp_atribs(el->hash); travessia(el->content); printf(")/ %s\n",Tipo_to_Str(el->tipo)); } travessia(el->next); } } char* Tipo_to_Str(int tipo){ char* str; switch(tipo) { case texto: str=strdup("Texto"); break; case PLI_DOC: str=strdup("Pli-Doc"); break; case ABERTURA: str=strdup("Abertura"); break; case TITULO: str=strdup("Titulo"); break; case DATA: str=strdup("Data"); break; case AUTOR: str=strdup("Autor"); break; case NOME: str=strdup("Nome"); break; case EMAIL: str=strdup("Email"); break; case URL: str=strdup("Url"); break; case RESUMO: str=strdup("Resumo"); break; case REALCADO: str=strdup("Realcado"); break; case REF: str=strdup("Ref"); break; case GRAFICO: str=strdup("Grafico"); break; case CODPROGRAMA: str=strdup("CodPrograma"); break; case LISTA: str=strdup("Lista"); break; case ITEM: str=strdup("Item"); break; case EXEMPLO: str=strdup("Exemplo"); break; case FECHO: str=strdup("Fecho"); break; case AGRADECIMENTOS: str=strdup("Agradecimentos"); break; case BIBLIOGRAFIA: str=strdup("Bibliografia"); break; case BIBITEM: str=strdup("BibItem"); break; case CHAVE: str=strdup("Chave"); break; case CORPO: str=strdup("Corpo"); break; case CAPITULO: str=strdup("Capitulo"); break; case SECCAO: str=strdup("Seccao"); break; case PARA: str=strdup("Para"); break; case COMANDO: str=strdup("Comando"); break; case PUB: str=strdup("Pub"); break; case FIGURA: str=strdup("Figura"); break; default: str=NULL; } return str; }