SF.net SVN: geany: [1362] trunk
ntrel at users.sourceforge.net
ntrel at xxxxx
Sat Mar 3 13:14:41 UTC 2007
Revision: 1362
http://svn.sourceforge.net/geany/?rev=1362&view=rev
Author: ntrel
Date: 2007-03-03 05:14:41 -0800 (Sat, 03 Mar 2007)
Log Message:
-----------
Moved all code for checking and creating the geany run script
temporary file from build_run_cmd() to prepare_run_script().
Modified Paths:
--------------
trunk/ChangeLog
trunk/src/build.c
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2007-03-02 19:04:18 UTC (rev 1361)
+++ trunk/ChangeLog 2007-03-03 13:14:41 UTC (rev 1362)
@@ -1,3 +1,10 @@
+2007-03-03 Nick Treleaven <nick.treleaven at btinternet.com>
+
+ * src/build.c:
+ Moved all code for checking and creating the geany run script
+ temporary file from build_run_cmd() to prepare_run_script().
+
+
2007-03-02 Enrico Tröger <enrico.troeger at uvena.de>
* src/win32.c:
Modified: trunk/src/build.c
===================================================================
--- trunk/src/build.c 2007-03-02 19:04:18 UTC (rev 1361)
+++ trunk/src/build.c 2007-03-03 13:14:41 UTC (rev 1362)
@@ -59,6 +59,12 @@
gint file_type_id;
} run_info = {0, GEANY_FILETYPES_ALL};
+#ifdef G_OS_WIN32
+static const gchar RUN_SCRIPT_CMD[] = "./geany_run_script.bat";
+#else
+static const gchar RUN_SCRIPT_CMD[] = "./geany_run_script.sh";
+#endif
+
enum
{
LATEX_CMD_TO_DVI,
@@ -130,7 +136,6 @@
gchar *cmd_string = NULL;
gchar *locale_cmd_string = NULL;
gchar *locale_term_cmd;
- gchar *script_name;
gint term_argv_len, i;
GError *error = NULL;
struct stat st;
@@ -139,12 +144,6 @@
run_info.file_type_id = GEANY_FILETYPES_LATEX;
-#ifdef G_OS_WIN32
- script_name = g_strdup("./geany_run_script.bat");
-#else
- script_name = g_strdup("./geany_run_script.sh");
-#endif
-
executable = utils_remove_ext_from_filename(doc_list[idx].file_name);
view_file = g_strconcat(executable, (mode == LATEX_CMD_VIEW_DVI) ? ".dvi" : ".pdf", NULL);
@@ -155,7 +154,7 @@
if (stat(locale_filename, &st) != 0)
{
msgwin_status_add(_("Failed to view %s (make sure it is already compiled)"), view_file);
- utils_free_pointers(executable, view_file, locale_filename, script_name, NULL);
+ utils_free_pointers(executable, view_file, locale_filename, NULL);
return (GPid) 1;
}
@@ -191,20 +190,20 @@
"(check path for Terminal tool setting in Preferences)"), app->tools_term_cmd);
utils_free_pointers(executable, view_file, locale_filename, cmd_string, locale_cmd_string,
- script_name, locale_term_cmd, NULL);
+ locale_term_cmd, NULL);
g_strfreev(term_argv);
return (GPid) 1;
}
// write a little shellscript to call the executable (similar to anjuta_launcher but "internal")
- // (script_name should be ok in UTF8 without converting in locale because it contains no umlauts)
- if (! build_create_shellscript(idx, script_name, locale_cmd_string, TRUE))
+ // (RUN_SCRIPT_CMD should be ok in UTF8 without converting in locale because it contains no umlauts)
+ if (! build_create_shellscript(idx, RUN_SCRIPT_CMD, locale_cmd_string, TRUE))
{
gchar *utf8_check_executable = utils_remove_ext_from_filename(doc_list[idx].file_name);
msgwin_status_add(_("Failed to execute %s (start-script could not be created)"),
utf8_check_executable);
utils_free_pointers(executable, view_file, locale_filename, cmd_string, locale_cmd_string,
- utf8_check_executable, script_name, locale_term_cmd, NULL);
+ utf8_check_executable, locale_term_cmd, NULL);
g_strfreev(term_argv);
return (GPid) 1;
}
@@ -217,10 +216,10 @@
#ifdef G_OS_WIN32
// command line arguments for cmd.exe
argv[term_argv_len ] = g_strdup("/Q /C");
- argv[term_argv_len + 1] = g_path_get_basename(script_name);
+ argv[term_argv_len + 1] = g_path_get_basename(RUN_SCRIPT_CMD);
#else
argv[term_argv_len ] = g_strdup("-e");
- argv[term_argv_len + 1] = g_strdup(script_name);
+ argv[term_argv_len + 1] = g_strdup(RUN_SCRIPT_CMD);
#endif
argv[term_argv_len + 2] = NULL;
@@ -232,7 +231,7 @@
msgwin_status_add(_("Process failed (%s)"), error->message);
utils_free_pointers(executable, view_file, locale_filename, cmd_string, locale_cmd_string,
- script_name, locale_term_cmd, NULL);
+ locale_term_cmd, NULL);
g_strfreev(argv);
g_strfreev(term_argv);
g_error_free(error);
@@ -248,7 +247,7 @@
}
utils_free_pointers(executable, view_file, locale_filename, cmd_string, locale_cmd_string,
- script_name, locale_term_cmd, NULL);
+ locale_term_cmd, NULL);
g_strfreev(argv);
g_strfreev(term_argv);
@@ -495,36 +494,21 @@
}
-GPid build_run_cmd(gint idx)
+// Returns: NULL if there was an error, or the working directory the script was created in.
+static gchar *prepare_run_script(gint idx)
{
- GPid result_id; // either child_pid or error id.
- GError *error = NULL;
- gchar **argv = NULL;
- gchar **term_argv = NULL;
- gchar *working_dir = NULL;
gchar *long_executable = NULL;
gchar *check_executable = NULL;
gchar *utf8_check_executable = NULL;
gchar *locale_filename = NULL;
- gchar *locale_term_cmd = NULL;
gchar *cmd = NULL;
- gchar *tmp = NULL;
gchar *executable = NULL;
- gchar *script_name;
- guint term_argv_len, i;
+ gchar *working_dir = NULL;
gboolean autoclose = FALSE;
struct stat st;
+ gboolean result = FALSE;
+ gchar *tmp;
- if (! DOC_IDX_VALID(idx) || doc_list[idx].file_name == NULL) return (GPid) 1;
-
- run_info.file_type_id = FILETYPE_ID(doc_list[idx].file_type);
-
-#ifdef G_OS_WIN32
- script_name = g_strdup("./geany_run_script.bat");
-#else
- script_name = g_strdup("./geany_run_script.sh");
-#endif
-
locale_filename = utils_get_locale_from_utf8(doc_list[idx].file_name);
long_executable = utils_remove_ext_from_filename(locale_filename);
@@ -554,7 +538,6 @@
{
msgwin_status_add(_("Command stopped because the current file has no extension."));
utils_beep();
- result_id = (GPid) 1;
goto free_strings;
}
@@ -569,34 +552,10 @@
#endif
msgwin_status_add(_("Failed to execute %s (make sure it is already built)"),
utf8_check_executable);
- result_id = (GPid) 1;
goto free_strings;
}
}
- /* get the terminal path */
- locale_term_cmd = utils_get_locale_from_utf8(app->tools_term_cmd);
- // split the term_cmd, so arguments will work too
- term_argv = g_strsplit(locale_term_cmd, " ", -1);
- term_argv_len = g_strv_length(term_argv);
-
- // check that terminal exists (to prevent misleading error messages)
- if (term_argv[0] != NULL)
- {
- tmp = term_argv[0];
- // g_find_program_in_path checks tmp exists and is executable
- term_argv[0] = g_find_program_in_path(tmp);
- g_free(tmp);
- }
- if (term_argv[0] == NULL)
- {
- msgwin_status_add(
- _("Could not find terminal '%s' "
- "(check path for Terminal tool setting in Preferences)"), app->tools_term_cmd);
- result_id = (GPid) 1;
- goto free_strings;
- }
-
executable = g_path_get_basename(long_executable);
working_dir = g_path_get_dirname(locale_filename);
@@ -605,8 +564,7 @@
gchar *utf8_working_dir = NULL;
utf8_working_dir = utils_get_utf8_from_locale(working_dir);
- msgwin_status_add(_("Failed to change the working directory to %s"), working_dir);
- result_id = (GPid) 1; // return 1, to prevent error handling of the caller
+ msgwin_status_add(_("Failed to change the working directory to %s"), utf8_working_dir);
g_free(utf8_working_dir);
goto free_strings;
}
@@ -624,23 +582,56 @@
#endif
// write a little shellscript to call the executable (similar to anjuta_launcher but "internal")
- // (script_name should be ok in UTF8 without converting in locale because it contains no umlauts)
- if (! build_create_shellscript(idx, script_name, cmd, autoclose))
+ // (RUN_SCRIPT_CMD should be ok in UTF8 without converting in locale because it contains no umlauts)
+ if (! build_create_shellscript(idx, RUN_SCRIPT_CMD, cmd, autoclose))
{
utf8_check_executable = utils_remove_ext_from_filename(doc_list[idx].file_name);
msgwin_status_add(_("Failed to execute %s (start-script could not be created)"),
utf8_check_executable);
- result_id = (GPid) 1;
- goto free_strings;
}
+ else
+ {
+ result = TRUE;
+ }
+ free_strings:
+ g_free(executable);
+ g_free(cmd);
+ g_free(locale_filename);
+ g_free(utf8_check_executable);
+ g_free(check_executable);
+ g_free(long_executable);
+
+ if (result)
+ return working_dir;
+
+ g_free(working_dir);
+ return NULL;
+}
+
+
+GPid build_run_cmd(gint idx)
+{
+ gchar *working_dir;
+ GError *error = NULL;
+
+ if (! DOC_IDX_VALID(idx) || doc_list[idx].file_name == NULL) return (GPid) 1;
+
+ working_dir = prepare_run_script(idx);
+ if (working_dir == NULL)
+ {
+ return (GPid) 1;
+ }
+
+ run_info.file_type_id = FILETYPE_ID(doc_list[idx].file_type);
+
#ifdef HAVE_VTE
if (vte_info.load_vte && vc != NULL && vc->run_in_vte)
{
- gchar *cmd = g_strconcat(script_name, "\n", NULL);
+ gchar *vte_cmd = g_strconcat(RUN_SCRIPT_CMD, "\n", NULL);
// change into current directory if it is not done by default
if (! vc->follow_path) vte_cwd(doc_list[idx].file_name, TRUE);
- vte_send_cmd(cmd);
+ vte_send_cmd(vte_cmd);
// show the VTE
gtk_notebook_set_current_page(GTK_NOTEBOOK(msgwindow.notebook), MSG_VTE);
@@ -649,11 +640,39 @@
run_info.pid = 1;
- g_free(cmd);
+ g_free(vte_cmd);
}
else
#endif
{
+ gchar *locale_term_cmd = NULL;
+ gchar **term_argv = NULL;
+ guint term_argv_len, i;
+ gchar **argv = NULL;
+
+ /* get the terminal path */
+ locale_term_cmd = utils_get_locale_from_utf8(app->tools_term_cmd);
+ // split the term_cmd, so arguments will work too
+ term_argv = g_strsplit(locale_term_cmd, " ", -1);
+ term_argv_len = g_strv_length(term_argv);
+
+ // check that terminal exists (to prevent misleading error messages)
+ if (term_argv[0] != NULL)
+ {
+ gchar *tmp = term_argv[0];
+ // g_find_program_in_path checks tmp exists and is executable
+ term_argv[0] = g_find_program_in_path(tmp);
+ g_free(tmp);
+ }
+ if (term_argv[0] == NULL)
+ {
+ msgwin_status_add(
+ _("Could not find terminal '%s' "
+ "(check path for Terminal tool setting in Preferences)"), app->tools_term_cmd);
+ run_info.pid = (GPid) 1;
+ goto free_strings;
+ }
+
argv = g_new0(gchar *, term_argv_len + 3);
for (i = 0; i < term_argv_len; i++)
{
@@ -662,10 +681,10 @@
#ifdef G_OS_WIN32
// command line arguments for cmd.exe
argv[term_argv_len ] = g_strdup("/Q /C");
- argv[term_argv_len + 1] = g_path_get_basename(script_name);
+ argv[term_argv_len + 1] = g_path_get_basename(RUN_SCRIPT_CMD);
#else
argv[term_argv_len ] = g_strdup("-e");
- argv[term_argv_len + 1] = g_strdup(script_name);
+ argv[term_argv_len + 1] = g_strdup(RUN_SCRIPT_CMD);
#endif
argv[term_argv_len + 2] = NULL;
@@ -674,11 +693,10 @@
{
geany_debug("g_spawn_async_with_pipes() failed: %s", error->message);
msgwin_status_add(_("Process failed (%s)"), error->message);
- unlink(script_name);
+ unlink(RUN_SCRIPT_CMD);
g_error_free(error);
error = NULL;
- result_id = (GPid) 0;
- goto free_strings;
+ run_info.pid = (GPid) 0;
}
if (run_info.pid > 0)
@@ -686,24 +704,14 @@
g_child_watch_add(run_info.pid, (GChildWatchFunc) run_exit_cb, NULL);
build_menu_update(idx);
}
+ free_strings:
+ g_strfreev(argv);
+ g_strfreev(term_argv);
+ g_free(locale_term_cmd);
}
- result_id = run_info.pid; // g_spawn was successful, result is child process id
- free_strings:
- /* free all non-NULL strings */
- g_strfreev(argv);
- g_strfreev(term_argv);
g_free(working_dir);
- g_free(cmd);
- g_free(utf8_check_executable);
- g_free(locale_filename);
- g_free(locale_term_cmd);
- g_free(check_executable);
- g_free(long_executable);
- g_free(executable);
- g_free(script_name);
-
- return result_id;
+ return run_info.pid;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Commits
mailing list