rendered paste body#include <stdlib.h>#include <gtk/gtk.h>#include <glib.h>#include <string.h>/*defines*/#define MAX_CARACTERES 3000/*Structures*/typedef struct{ GtkWidget* znlet; GtkWidget* znseq; GtkWidget* affres; GtkWidget* affres2; GtkWidget* affres3; GtkWidget* chcom; }rech;//Prototypesvoid lancerecherche(GtkWidget *widget, gpointer let);int recherche (char t1, char t2, char t3, char tab[], int tabtrouve[],int choix);void afftabtrouve (int tabtrouve[], int nbrtrouve, char *res);void upletters(char tab[]);void affrouge(int tabtrouve[], char sequ[], char res[], int choix);void prepsequ(char *sequ);/*fonction principale*/int main(int argc, char **argv) /*doit avoir ce prototype !*/{ /* Variables GTK*/ rech let; GtkWidget* MainWindow = NULL; GtkWidget* lettres3 = NULL; GtkWidget* btnrech = NULL; GtkWidget* frame1 = NULL; GtkWidget* frame2 = NULL; GtkWidget* seq = NULL; GtkWidget* MainBox = NULL; GtkWidget* boxfr1 = NULL; GtkWidget* boxfr11 = NULL; GtkWidget* boxfr12 = NULL; GtkWidget* boxlet = NULL; GtkWidget* boxseq = NULL; GtkWidget* boxres = NULL; GtkWidget* about = NULL; gchar* convert = NULL; GtkWidget* com = NULL; GtkWidget* scrollbar = NULL; /* Initialisation de GTK+ */ gtk_init(&argc, &argv); /* Création de la fenêtre */ MainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(G_OBJECT(MainWindow), "delete-event", G_CALLBACK(gtk_main_quit), NULL); gtk_window_set_title(GTK_WINDOW(MainWindow), "Couane V1.0"); gtk_window_set_default_size(GTK_WINDOW(MainWindow), 800, 600); gtk_window_set_position(GTK_WINDOW(MainWindow), GTK_WIN_POS_CENTER); gtk_window_set_resizable (GTK_WINDOW(MainWindow), FALSE); /*box*/ MainBox=gtk_vbox_new(TRUE, 5); /*hbox pour horizontal*/ boxfr1=gtk_hbox_new(FALSE, 10); boxlet=gtk_vbox_new(FALSE,5); boxseq=gtk_vbox_new(FALSE,5); boxres=gtk_vbox_new(FALSE, 10); boxfr11=gtk_vbox_new(TRUE,10); boxfr12=gtk_hbox_new(TRUE,0); gtk_widget_set_size_request(boxseq, 600, 300); /*Attributions des paramètres*/ convert = g_locale_to_utf8("\nEntrez 3 lettres à rechercher : ",-1,NULL,NULL,NULL); lettres3= gtk_label_new (convert); convert = g_locale_to_utf8("Entrez la séquence :\n(seules les lettres seront considérées)",-1,NULL,NULL,NULL); seq= gtk_label_new (convert); convert = g_locale_to_utf8("Programme realisé par Benjamin Monjoie\n(shgun_xzan@hotmail.com)\nsous license GPL\nPlus de renseignement sur :\nwww.xzan.be/couane",-1,NULL,NULL,NULL); about=gtk_label_new(convert); convert=g_locale_to_utf8("Pas de résultat pour l'instant",-1,NULL,NULL,NULL); let.affres = gtk_label_new(convert); let.affres2=gtk_label_new(""); let.affres3=gtk_label_new(""); btnrech=gtk_button_new_with_label("Rechercher"); let.znseq=gtk_text_view_new(); let.znlet=gtk_entry_new_with_max_length (3); convert = g_locale_to_utf8("Entrées",-1,NULL,NULL,NULL); frame1=gtk_frame_new(convert); frame2=gtk_frame_new("Sorties"); gtk_label_set_justify (GTK_LABEL(about), GTK_JUSTIFY_CENTER); gtk_label_set_justify (GTK_LABEL(seq), GTK_JUSTIFY_CENTER); gtk_label_set_justify (GTK_LABEL(let.affres3), GTK_JUSTIFY_CENTER); convert= g_locale_to_utf8("Choisir le nombre où commencer",-1,NULL,NULL,NULL); com=gtk_label_new(convert); g_free(convert); let.chcom=gtk_combo_box_new_text(); /*ajout dans la liste*/ gtk_combo_box_append_text(GTK_COMBO_BOX(let.chcom),"1"); gtk_combo_box_append_text(GTK_COMBO_BOX(let.chcom),"2"); gtk_combo_box_append_text(GTK_COMBO_BOX(let.chcom),"3"); /*ajout du scrollbar pour affres3*/ scrollbar = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollbar), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrollbar), boxres); /*selection du premier*/ gtk_combo_box_set_active(GTK_COMBO_BOX(let.chcom),0); /*Placement des box*/ gtk_box_pack_start(GTK_BOX(MainBox), frame1, FALSE /*expend*/, TRUE/*fill*/, 5 /*padding*/); /*end pour ajouter de bas en haut*/ gtk_box_pack_start(GTK_BOX(MainBox), frame2, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(boxfr1), boxfr11, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(boxfr1), boxfr12, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(boxfr11), boxlet, TRUE, TRUE, 5); gtk_box_pack_start(GTK_BOX(boxfr11), about, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(boxfr12), boxseq, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(boxlet), lettres3, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(boxlet), let.znlet, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(boxlet), com, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(boxlet), let.chcom, FALSE, FALSE, 5); gtk_box_pack_end(GTK_BOX(boxseq), btnrech, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(boxseq), let.znseq, TRUE, TRUE, 0); gtk_box_pack_end(GTK_BOX(boxseq), seq, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(boxres), let.affres, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(boxres), let.affres2, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(boxres), let.affres3, TRUE, TRUE, 0); /*Ajout des containers*/ gtk_container_add (GTK_CONTAINER(frame1), boxfr1); gtk_container_add (GTK_CONTAINER(MainWindow), MainBox); gtk_container_add (GTK_CONTAINER(frame2), scrollbar); /*Appel fonction*/ g_signal_connect(G_OBJECT(btnrech), "clicked", G_CALLBACK(lancerecherche), &let); /* Affichage et boucle évènementielle */ gtk_widget_show_all(MainWindow); gtk_main(); /* On quitte.. */ return EXIT_SUCCESS;}void lancerecherche(GtkWidget *btnrech, gpointer data){ char reche[4], *sequ, cpt_char[255], res[100],t1,t2,t3,outrouv[MAX_CARACTERES/3],res2[MAX_CARACTERES/3]="", *ch, res3[3*MAX_CARACTERES]=""; const char *tmp; GtkTextBuffer* text_buffer=0; GtkTextIter start; GtkTextIter end; gchar* convert = NULL; gchar* convert2 = NULL; gchar* convert3 = NULL; int choix; rech *let= (rech *) data; int cpt, tabtrouve[MAX_CARACTERES/3]; tmp=gtk_entry_get_text(GTK_ENTRY(let->znlet)); strcpy(reche,tmp); upletters(reche); /*On recupere le buffer*/ text_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(let->znseq)); /*On recupere l'origine du buffer*/ gtk_text_buffer_get_start_iter(text_buffer,&start); /*On recupere la fin du buffer*/ gtk_text_buffer_get_end_iter(text_buffer,&end); /*On copie le contenu du buffer dans une variable*/ sequ=gtk_text_buffer_get_text(text_buffer,&start, &end,TRUE); upletters(sequ); prepsequ(sequ); t1=reche[0]; t2=reche[1]; t3=reche[2]; /*transformation de chcom en int*/ ch=gtk_combo_box_get_active_text(GTK_COMBO_BOX(let->chcom)); choix=atoi(ch); free(ch); /*Appels des fonctions*/ cpt=recherche (t1,t2,t3,sequ,tabtrouve,choix-1); if (cpt>0) { afftabtrouve (tabtrouve, cpt, outrouv); affrouge(tabtrouve, sequ, res3, choix-1); } else { strcpy(res2," "); strcpy(res3," "); } sprintf(cpt_char,"%d",cpt); /*assemblage de l'affichage du résultat*/ strcpy(res,"Le programme a trouvé "); strcat(res,reche); strcat(res," "); strcat(res,cpt_char); strcat(res,"x dans la séquence"); convert=g_locale_to_utf8(res,-1,NULL,NULL,NULL); if (cpt>0) { strcpy(res2,"La séquence a été trouvée aux condons suivants : "); strcat(res2,outrouv); convert2=g_locale_to_utf8(res2,-1,NULL,NULL,NULL); } convert3=g_locale_to_utf8(res3,-1,NULL,NULL,NULL); /*affichage du résultat*/ gtk_label_set_text(GTK_LABEL(let->affres), convert); gtk_label_set_text(GTK_LABEL(let->affres2), convert2); gtk_label_set_markup(GTK_LABEL(let->affres3), convert3); g_free(convert); g_free(convert2); g_free(convert3);}int recherche (char t1, char t2, char t3, char tab[], int tabtrouve[], int choix){ int i=0+choix,j=0,cpt=0; int s, sf=0; while ((tab[i-choix]!='\0') && (sf==0)) { j=0; s=0; while ((j<3) && (s==0) && (sf==0)) { if (((j==0) && (tab[i+j]!=t1)) || ((j==1) && (tab[i+j]!=t2)) || ((j==2) && (tab[i+j]!=t3))) { s=1; } if (tab[i+j]!='\0') { j++; } else { sf=1; } } if ((s==1) && (tab[i+j]=='\0')) { sf=1; } if ((s==0) && (sf==0)) { tabtrouve[cpt]=i+1; cpt++; } if (sf==0) i+=3; } return cpt;}void afftabtrouve (int tabtrouve[], int nbrtrouve, char *res){ int i=1; char tmp[255]; if (nbrtrouve!=0) { sprintf(tmp,"%d",tabtrouve[0]); strcpy(res,tmp); while(i<nbrtrouve-1) { sprintf(tmp,"%d",tabtrouve[i]); strcat(res,", "); strcat(res,tmp); i++; if (i%20==0) strcat(res,"\n"); } if (i<nbrtrouve) { sprintf(tmp,"%d",tabtrouve[i]); strcat(res, " et "); strcat(res,tmp); } }}void upletters(char tab[]){ int i=0; while (tab[i]!='\0') { tab[i]=toupper(tab[i]); i++; }}void affrouge(int tabtrouve[], char sequ[], char *res, int choix){ int i=0,j=0,k, l=0; char tmp[10]; strcpy(res,"<u>La séquence :</u>\n"); while(i<choix) { tmp[i]=sequ[i]; i++; } if(i>0) { tmp[i]='\0'; strcat(res,tmp); } while (sequ[i]!='\0') { if (i==tabtrouve[j]-1) { strcat(res,"<span foreground=\"#FF0C18\"><b>"); k=0; l=0; while ((k<3) && (sequ[i]!='\0')) { if (i%10==0 && i>0) { tmp[k+l]=' '; l++; } if (i%40==0 && i>0) { tmp[k+l]='\n'; l++; } tmp[k+l]=sequ[i]; i++; k++; } tmp[k+l]='\0'; strcat(res,tmp); strcat(res,"</b></span>"); j++; } else { k=0; l=0; while ((k<3) && (sequ[i]!='\0')) { if (i%10==0 && i>0) { tmp[k+l]=' '; l++; } if (i%40==0 && i>0) { tmp[k+l]='\n'; l++; } tmp[k+l]=sequ[i]; k++; i++; } tmp[k+l]='\0'; strcat(res,tmp); } } strcat(res,"\0");}void prepsequ(char *sequ){ int i=0, j=0; char sequ2[MAX_CARACTERES]; while (sequ[i]!='\0') { if((sequ[i]>='A') && (sequ[i]<='Z')) { sequ2[j]=sequ[i]; j++; } i++; } sequ2[j]='\0'; strcpy(sequ,sequ2);}