Commit 747d86ac by karudu

Kompilaatori väljakutsumine toimib

parent 3879d569
......@@ -5,9 +5,10 @@ void SalvestaSeaded(GtkWidget *Nupp, gpointer Data)
{
puhvrid *Puhvrid = (puhvrid *)Data;
g_key_file_set_string(Puhvrid->Seaded, "Kompilaator", "nimi", gtk_entry_buffer_get_text(Puhvrid->PuhverNimi));
g_key_file_set_string(Puhvrid->Seaded, "Kompilaator", "seaded", gtk_entry_buffer_get_text(Puhvrid->PuhverSeaded));
g_key_file_set_string(Puhvrid->Seaded, "Kompilaator", "asukoht", gtk_entry_buffer_get_text(Puhvrid->PuhverAsukoht));
g_key_file_set_string(Puhvrid->Seaded, "Kompilaator", "komp_asukoht", gtk_entry_buffer_get_text(Puhvrid->PuhverKAsukoht));
g_key_file_set_string(Puhvrid->Seaded, "Kompilaator", "komp_seaded", gtk_entry_buffer_get_text(Puhvrid->PuhverKSeaded));
g_key_file_set_string(Puhvrid->Seaded, "Kompilaator", "prog_asukoht", gtk_entry_buffer_get_text(Puhvrid->PuhverPAsukoht));
g_key_file_set_string(Puhvrid->Seaded, "Kompilaator", "prog_seaded", gtk_entry_buffer_get_text(Puhvrid->PuhverPSeaded));
g_key_file_save_to_file(Puhvrid->Seaded, Puhvrid->SeadedNimi, 0);
......@@ -40,51 +41,229 @@ void KompilaatoriSeaded(GtkWidget *Nupp, gpointer Data)
GtkBox *HBox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
GtkBox *HBox3 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
GtkBox *HBox4 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
GtkLabel *LabelNimi = gtk_label_new("Nimi");
GtkLabel *LabelSeaded = gtk_label_new("Seaded");
GtkLabel *LabelAsukoht = gtk_label_new("Asukoht");
GtkEntry *EntryNimi = gtk_entry_new();
gtk_entry_set_width_chars(EntryNimi, 40);
GtkEntry *EntrySeaded = gtk_entry_new();
gtk_entry_set_width_chars(EntrySeaded, 40);
GtkEntry *EntryAsukoht = gtk_entry_new();
gtk_entry_set_width_chars(EntryAsukoht, 40);
GtkEntryBuffer *PuhverNimi = gtk_entry_get_buffer(EntryNimi);
GtkEntryBuffer *PuhverSeaded = gtk_entry_get_buffer(EntrySeaded);
GtkEntryBuffer *PuhverAsukoht = gtk_entry_get_buffer(EntryAsukoht);
gtk_box_pack_start(HBox1, GTK_WIDGET(LabelNimi), FALSE, FALSE, 8);
gtk_box_pack_start(HBox1, GTK_WIDGET(EntryNimi), FALSE, FALSE, 33);
gtk_box_pack_start(HBox2, GTK_WIDGET(LabelSeaded), FALSE, FALSE, 8);
gtk_box_pack_start(HBox2, GTK_WIDGET(EntrySeaded), FALSE, FALSE, 11);
gtk_box_pack_start(HBox3, GTK_WIDGET(LabelAsukoht), FALSE, FALSE, 8);
gtk_box_pack_start(HBox3, GTK_WIDGET(EntryAsukoht), FALSE, FALSE, 4);
char *Nimi = g_key_file_get_string(UI->Seaded, "Kompilaator", "nimi", NULL);
if(Nimi) gtk_entry_buffer_set_text(PuhverNimi, Nimi, -1);
char *Seaded = g_key_file_get_string(UI->Seaded, "Kompilaator", "seaded", NULL);
if(Seaded) gtk_entry_buffer_set_text(PuhverSeaded, Seaded, -1);
char *Asukoht = g_key_file_get_string(UI->Seaded, "Kompilaator", "asukoht", NULL);
if(Asukoht) gtk_entry_buffer_set_text(PuhverAsukoht, Asukoht, -1);
GtkBox *HBoxNupud = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
GtkLabel *LabelKAsukoht = gtk_label_new("Kompilaatori asukoht");
GtkLabel *LabelKSeaded = gtk_label_new("Kompilaatori seaded");
GtkLabel *LabelPAsukoht = gtk_label_new("Programmi asukoht");
GtkLabel *LabelPSeaded = gtk_label_new("Programmi seaded");
GtkEntry *EntryKAsukoht = gtk_entry_new();
gtk_entry_set_width_chars(EntryKAsukoht, 40);
GtkEntry *EntryKSeaded = gtk_entry_new();
gtk_entry_set_width_chars(EntryKSeaded, 40);
GtkEntry *EntryPAsukoht = gtk_entry_new();
gtk_entry_set_width_chars(EntryPAsukoht, 40);
GtkEntry *EntryPSeaded = gtk_entry_new();
gtk_entry_set_width_chars(EntryPSeaded, 40);
GtkEntryBuffer *PuhverKAsukoht = gtk_entry_get_buffer(EntryKAsukoht);
GtkEntryBuffer *PuhverKSeaded = gtk_entry_get_buffer(EntryKSeaded);
GtkEntryBuffer *PuhverPAsukoht = gtk_entry_get_buffer(EntryPAsukoht);
GtkEntryBuffer *PuhverPSeaded = gtk_entry_get_buffer(EntryPSeaded);
gtk_box_pack_start(HBox1, GTK_WIDGET(LabelKAsukoht), FALSE, FALSE, 8);
gtk_box_pack_start(HBox1, GTK_WIDGET(EntryKAsukoht), FALSE, FALSE, 0);
gtk_box_pack_start(HBox2, GTK_WIDGET(LabelKSeaded), FALSE, FALSE, 8);
gtk_box_pack_start(HBox2, GTK_WIDGET(EntryKSeaded), FALSE, FALSE, 6);
gtk_box_pack_start(HBox3, GTK_WIDGET(LabelPAsukoht), FALSE, FALSE, 8);
gtk_box_pack_start(HBox3, GTK_WIDGET(EntryPAsukoht), FALSE, FALSE, 12);
gtk_box_pack_start(HBox4, GTK_WIDGET(LabelPSeaded), FALSE, FALSE, 8);
gtk_box_pack_start(HBox4, GTK_WIDGET(EntryPSeaded), FALSE, FALSE, 18);
char *KAsukoht = g_key_file_get_string(UI->Seaded, "Kompilaator", "komp_asukoht", NULL);
if(KAsukoht) gtk_entry_buffer_set_text(PuhverKAsukoht, KAsukoht, -1);
char *KSeaded = g_key_file_get_string(UI->Seaded, "Kompilaator", "komp_seaded", NULL);
if(KSeaded) gtk_entry_buffer_set_text(PuhverKSeaded, KSeaded, -1);
char *PAsukoht = g_key_file_get_string(UI->Seaded, "Kompilaator", "prog_asukoht", NULL);
if(PAsukoht) gtk_entry_buffer_set_text(PuhverPAsukoht, PAsukoht, -1);
char *PSeaded = g_key_file_get_string(UI->Seaded, "Kompilaator", "prog_seaded", NULL);
if(PSeaded) gtk_entry_buffer_set_text(PuhverPSeaded, PSeaded, -1);
puhvrid *Puhvrid = malloc(sizeof(puhvrid));
Puhvrid->Aken = Aken;
Puhvrid->Seaded = UI->Seaded;
Puhvrid->SeadedNimi = UI->SeadedNimi;
Puhvrid->PuhverNimi = PuhverNimi;
Puhvrid->PuhverSeaded = PuhverSeaded;
Puhvrid->PuhverAsukoht = PuhverAsukoht;
Puhvrid->PuhverKAsukoht = PuhverKAsukoht;
Puhvrid->PuhverKSeaded = PuhverKSeaded;
Puhvrid->PuhverPAsukoht = PuhverPAsukoht;
Puhvrid->PuhverPSeaded = PuhverPSeaded;
GtkButton *NuppSalvesta = gtk_button_new_with_label("Salvesta");
GtkButton *NuppValju = gtk_button_new_with_label("Välju");
g_signal_connect(NuppSalvesta, "clicked", G_CALLBACK(SalvestaSeaded), Puhvrid);
g_signal_connect(NuppValju, "clicked", G_CALLBACK(SulgeSeaded), Puhvrid);
gtk_box_pack_start(HBox4, GTK_WIDGET(NuppSalvesta), FALSE, FALSE, 100);
gtk_box_pack_start(HBox4, GTK_WIDGET(NuppValju), FALSE, FALSE, 8);
gtk_box_pack_start(HBoxNupud, GTK_WIDGET(NuppSalvesta), FALSE, FALSE, 140);
gtk_box_pack_start(HBoxNupud, GTK_WIDGET(NuppValju), FALSE, FALSE, 8);
gtk_box_pack_start(Box, GTK_WIDGET(HBox1), FALSE, FALSE, 4);
gtk_box_pack_start(Box, GTK_WIDGET(HBox2), FALSE, FALSE, 4);
gtk_box_pack_start(Box, GTK_WIDGET(HBox3), FALSE, FALSE, 4);
gtk_box_pack_start(Box, GTK_WIDGET(HBox4), FALSE, FALSE, 8);
gtk_box_pack_start(Box, GTK_WIDGET(HBox4), FALSE, FALSE, 4);
gtk_box_pack_start(Box, GTK_WIDGET(HBoxNupud), FALSE, FALSE, 8);
gtk_widget_show_all(Aken);
}
// Loo programmi käsureast argv massiiv
char **LooArgv(char *Tekst)
{
int Argument = 0;
int P = 0;
int ArgP = 0;
char **Argv = malloc(sizeof(char *) * 16);
Argv[0] = malloc(512);
int Quotes = 0;
for(;;)
{
char C = Tekst[P++];
if(!Quotes)
{
switch(C)
{
case ' ':
{
Argv[Argument][ArgP] = 0;
Argument++;
Argv[Argument] = malloc(512);
ArgP = 0;
} break;
case 0:
{
Argv[Argument][ArgP] = 0;
Argv[Argument + 1] = malloc(1);
Argv[Argument + 1] = NULL;
return Argv;
} break;
case '"': Quotes = 1; break;
default: Argv[Argument][ArgP++] = C; break;
}
}
else
{
switch(C)
{
case '"': Quotes = 0; break;
default: Argv[Argument][ArgP++] = C; break;
}
}
}
}
// Käivita kompilaator vastavalt seadistustele
void Kompileeri(GtkWidget *Nupp, gpointer Data)
{
ui *UI = (ui *)Data;
char *Asukoht = g_key_file_get_string(UI->Seaded, "Kompilaator", "komp_asukoht", NULL);
char *Seaded = g_key_file_get_string(UI->Seaded, "Kompilaator", "komp_seaded", NULL);
char *PAsukoht = g_key_file_get_string(UI->Seaded, "Kompilaator", "prog_asukoht", NULL);
if(Asukoht && Seaded && PAsukoht) // Kontrolli, et seaded on olemas
{
gchar *PKaust = g_path_get_dirname(PAsukoht); // Eemalda programmi nimi faili asukohast, jäta kaust järele
// Tee asukohast ja seadetest käsurea string, asukoht läheb jutumärkide vahele, et tühikud töötaks
char *Kask;
if(Seaded) Kask = g_strdup_printf("\"%s\" %s", Asukoht, Seaded);
else Kask = g_strdup_printf("\"%s\"", Asukoht);
char **Argv = LooArgv(Kask); // Teisalda käsurida argumentide massiiviks
GError *Viga = NULL;
gint WaitStatus;
// Käivita kompilaator
int Status = g_spawn_sync(PKaust, Argv, NULL, G_SPAWN_SEARCH_PATH|G_SPAWN_CHILD_INHERITS_STDIN,
NULL, NULL, NULL, NULL, &WaitStatus, &Viga);
// Vaata, kuidas läks
if(Status == TRUE) // Kutsuti edukalt välja
{
// Kui kompileerimine õnnestus (tagastas 0), siis teata sellest status bar'il
if(g_spawn_check_wait_status(WaitStatus, &Viga))
{
StatusBarMsg(UI, "Kompileerimine OK");
}
else g_error_free(Viga);
}
else // Ei suutnud kompilaatorit käivitada, veateade
{
GtkWidget *Dialog = gtk_message_dialog_new(UI->Aken, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,
GTK_BUTTONS_CLOSE,
"Viga kompilaatori väljakutsumisel:\n%s", Viga->message);
gtk_dialog_run(GTK_DIALOG(Dialog));
gtk_widget_destroy(Dialog);
g_error_free(Viga);
}
g_free(Asukoht);
g_free(Seaded);
g_free(PAsukoht);
g_free(PKaust);
g_free(Kask);
g_free(Argv);
}
else // Pole veel seadistatud
{
GtkWidget *Dialog = gtk_message_dialog_new(UI->Aken, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,
GTK_BUTTONS_CLOSE,
"Kompilaatori asukoht või seaded pole seadistatud,\nseadista need ja proovi uuesti");
gtk_dialog_run(GTK_DIALOG(Dialog));
gtk_widget_destroy(Dialog);
}
}
// Käivita seadetes antud programm
void KaivitaProgramm(GtkWidget *Nupp, gpointer Data)
{
ui *UI = (ui *)Data;
char *Asukoht = g_key_file_get_string(UI->Seaded, "Kompilaator", "prog_asukoht", NULL);
char *Seaded = g_key_file_get_string(UI->Seaded, "Kompilaator", "prog_seaded", NULL);
if(Asukoht && Seaded) // Kontrolli, et seaded on olemas
{
gchar *Kaust = g_path_get_dirname(Asukoht); // Eemalda programmi nimi faili asukohast, jäta kaust järele
// Tee asukohast ja seadetest käsurea string, asukoht läheb jutumärkide vahele, et tühikud töötaks
char *Kask;
if(Seaded) Kask = g_strdup_printf("\"%s\" %s", Asukoht, Seaded);
else Kask = g_strdup_printf("\"%s\"", Asukoht);
char **Argv = LooArgv(Kask); // Teisalda käsurida argumentide massiiviks
GError *Viga = NULL;
gint WaitStatus;
// Käivita programm
int Status = g_spawn_sync(Kaust, Argv, NULL, G_SPAWN_SEARCH_PATH|G_SPAWN_CHILD_INHERITS_STDIN,
NULL, NULL, NULL, NULL, &WaitStatus, &Viga);
// Vaata, kuidas läks
if(Status == TRUE) // Kutsuti edukalt välja
{
// Loe ja näita programmi tagastatud koodi
gint Kood = 0;
if(g_spawn_check_wait_status(WaitStatus, &Viga) == FALSE)
{
Kood = Viga->code;
g_error_free(Viga);
}
char *Msg = g_strdup_printf("Programm tagastas 0x%x", Kood);
StatusBarMsg(UI, Msg);
gtk_window_present(UI->Aken); // Näita redaktori akent
g_free(Msg);
}
else // Ei suutnud programmi käivitada, veateade
{
GtkWidget *Dialog = gtk_message_dialog_new(UI->Aken, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,
GTK_BUTTONS_CLOSE,
"Viga programmi väljakutsumisel:\n%s", Viga->message);
gtk_dialog_run(GTK_DIALOG(Dialog));
gtk_widget_destroy(Dialog);
g_error_free(Viga);
}
g_free(Asukoht);
g_free(Seaded);
g_free(Kaust);
g_free(Kask);
g_free(Argv);
}
else // Pole veel seadistatud
{
GtkWidget *Dialog = gtk_message_dialog_new(UI->Aken, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,
GTK_BUTTONS_CLOSE,
"Programmi asukoht või seaded pole seadistatud,\nseadista need ja proovi uuesti");
gtk_dialog_run(GTK_DIALOG(Dialog));
gtk_widget_destroy(Dialog);
}
}
......@@ -8,11 +8,14 @@ typedef struct
GtkWindow *Aken;
GKeyFile *Seaded;
char *SeadedNimi;
GtkEntryBuffer *PuhverNimi;
GtkEntryBuffer *PuhverSeaded;
GtkEntryBuffer *PuhverAsukoht;
GtkEntryBuffer *PuhverKAsukoht;
GtkEntryBuffer *PuhverKSeaded;
GtkEntryBuffer *PuhverPAsukoht;
GtkEntryBuffer *PuhverPSeaded;
} puhvrid;
void KompilaatoriSeaded(GtkWidget *Nupp, gpointer Data);
void Kompileeri(GtkWidget *Nupp, gpointer Data);
void KaivitaProgramm(GtkWidget *Nupp, gpointer Data);
#endif // COMPILER_H
......@@ -10,9 +10,17 @@ void UuendaRidaVeerg(GtkTextBuffer *Puhver, GtkStatusbar *StatusBar)
gint Rida = gtk_text_iter_get_line(&Iter);
gint Veerg = gtk_text_iter_get_line_offset(&Iter);
gtk_statusbar_pop(StatusBar, 0); // Võta eelmine tekst ära
gtk_statusbar_pop(StatusBar, STATUSBAR_RIDAVEERG); // Võta eelmine tekst ära
gchar *Tekst = g_strdup_printf("%d:%d", Rida + 1, Veerg + 1); // Loo string rea ja veeruga
gtk_statusbar_push(StatusBar, 0, Tekst); // Näita teksti
gtk_statusbar_push(StatusBar, STATUSBAR_RIDAVEERG, Tekst); // Näita teksti
g_free(Tekst);
}
// Näita status bar'il teksti
void StatusBarMsg(ui *UI, char *Tekst)
{
GtkStatusbar *StatusBar = UI->Tabid[UI->PraeguneTab].StatusBar;
gtk_statusbar_pop(StatusBar, STATUSBAR_TEKST); // Võta eelmine tekst ära
gtk_statusbar_push(StatusBar, STATUSBAR_TEKST, Tekst); // Näita teksti
}
......@@ -3,6 +3,11 @@
#include "ceditor.h"
// Status bar'i sõnumite id'd
#define STATUSBAR_RIDAVEERG 0
#define STATUSBAR_TEKST 1
void UuendaRidaVeerg(GtkTextBuffer *Puhver, GtkStatusbar *StatusBar);
void StatusBarMsg(ui *UI, char *Tekst);
#endif // STATUSBAR_H
......@@ -22,7 +22,6 @@ void LisaTab(ui *UI)
// Tekstiaken
Tab->TextView = gtk_source_view_new(); // Loo tekstiaken
Tab->Puhver = gtk_text_view_get_buffer(GTK_TEXT_VIEW(Tab->TextView)); // Tekstiakna teksti puhver
Tab->OnMuudetud = 0;
// Scroll window
Tab->ScrollWindow = gtk_scrolled_window_new(NULL, NULL); // Loo scroll aken
......
......@@ -95,7 +95,7 @@ ui *LooUI()
GtkWidget *KompMenu = gtk_menu_new();
GtkWidget *KompMenuSeaded = gtk_menu_item_new_with_label("Seaded"); // Kompileeri->Seaded
GtkWidget *KompMenuKompileeri = gtk_menu_item_new_with_label("Kompileeri"); // Kompileeri->Kompileeri
GtkWidget *KompMenuKaivita = gtk_menu_item_new_with_label("Käivita"); // Kompileeri->Käivita
GtkWidget *KompMenuKaivita = gtk_menu_item_new_with_label("Käivita programm"); // Kompileeri->Käivita programm
// Menüü nupud menu bar'i
gtk_menu_shell_append(GTK_MENU_SHELL(UI->MenuBar), FailMenuNupp);
gtk_menu_shell_append(GTK_MENU_SHELL(UI->MenuBar), KompMenuNupp);
......@@ -116,8 +116,8 @@ ui *LooUI()
// Kompileeri menüü
LisaMenuItem(UI, KompMenu, KompMenuSeaded, KompilaatoriSeaded, 0, 0); // Kompileeri->Seaded
MenuSeparator(KompMenu);
LisaMenuItem(UI, KompMenu, KompMenuKompileeri, NULL, GDK_KEY_C, GDK_CONTROL_MASK|GDK_SHIFT_MASK); // Kompileeri->Kompileeri
LisaMenuItem(UI, KompMenu, KompMenuKaivita, NULL, GDK_KEY_R, GDK_CONTROL_MASK|GDK_SHIFT_MASK); // Kompileeri->Käivita
LisaMenuItem(UI, KompMenu, KompMenuKompileeri, Kompileeri, GDK_KEY_C, GDK_CONTROL_MASK|GDK_SHIFT_MASK); // Kompileeri->Kompileeri
LisaMenuItem(UI, KompMenu, KompMenuKaivita, KaivitaProgramm, GDK_KEY_R, GDK_CONTROL_MASK|GDK_SHIFT_MASK); // Kompileeri->Käivita programm
//ToolBar
UI->ToolBar = gtk_toolbar_new();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment