SF.net SVN: geany-plugins:[2077] trunk/geany-plugins/devhelp/src/manpages.c
codebrainz at users.sourceforge.net
codebrainz at xxxxx
Mon May 23 09:09:30 UTC 2011
Revision: 2077
http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=2077&view=rev
Author: codebrainz
Date: 2011-05-23 09:09:30 +0000 (Mon, 23 May 2011)
Log Message:
-----------
Use g_spawn_command_line_sync() instead of popen() and improve HTML output.
Modified Paths:
--------------
trunk/geany-plugins/devhelp/src/manpages.c
Modified: trunk/geany-plugins/devhelp/src/manpages.c
===================================================================
--- trunk/geany-plugins/devhelp/src/manpages.c 2011-05-23 08:28:39 UTC (rev 2076)
+++ trunk/geany-plugins/devhelp/src/manpages.c 2011-05-23 09:09:30 UTC (rev 2077)
@@ -8,70 +8,86 @@
#ifdef HAVE_MAN
-#define DEVHELP_MANPAGE_BUF_SIZE 4096
+#define DEVHELP_MANPAGE_SECTIONS "3:2:1:8:5:4:7:6"
+#define DEVHELP_MANPAGE_PAGER "col -b"
+#define DEVHELP_MANPAGE_HTML_TEMPLATE \
+ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd\">\n" \
+ "<html>\n" \
+ " <head>\n" \
+ " <title>%s</title>\n" \
+ " <style type=\"text/css\">\n" \
+ " .man_text {\n" \
+ " /*font-family: sans;*/\n" \
+ " }\n" \
+ " </style>\n" \
+ " </head>\n" \
+ " <body>\n" \
+ " <pre class=\"man_text\">%s</pre>\n" \
+ " </body>\n" \
+ "</html>\n"
+
+
static GList *temp_files = NULL;
/* Locates the path to the manpage found for the term and section. */
static gchar *find_manpage(const gchar *term, const gchar *section)
{
- FILE *fp;
- gint len, retcode=0;
- gchar *cmd, buf[PATH_MAX];
+ gint retcode=0;
+ gchar *cmd, *text=NULL;
g_return_val_if_fail(term != NULL, NULL);
if (section == NULL)
- cmd = g_strdup_printf("man -S 3:2:1:8:5:4:7:6 --where '%s'", term);
+ cmd = g_strdup_printf("man -S %s --where '%s'",
+ DEVHELP_MANPAGE_SECTIONS, term);
else
cmd = g_strdup_printf("man --where %s '%s'", section, term);
- if ((fp = popen(cmd, "r")) == NULL)
+ if (!g_spawn_command_line_sync(cmd, &text, NULL, &retcode, NULL))
{
g_free(cmd);
return NULL;
}
g_free(cmd);
- len = fread(buf, sizeof(gchar), PATH_MAX, fp);
- retcode = pclose(fp);
- buf[PATH_MAX - 1] = '\0';
-
- if (strlen(buf) == 0 || retcode != 0)
+ if (retcode != 0)
+ {
+ g_free(text);
return NULL;
+ }
- return g_strstrip(g_strdup(buf));
+ return g_strstrip(text);
}
/* Read the text output from man or NULL. */
static gchar *devhelp_plugin_man(const gchar *filename)
{
- FILE *fp;
- gint size = DEVHELP_MANPAGE_BUF_SIZE;
- gchar buf[DEVHELP_MANPAGE_BUF_SIZE] = { 0 };
- gchar *text=NULL, *cmd;
+ gint retcode=0;
+ gchar *cmd, *text=NULL;
g_return_val_if_fail(filename != NULL, NULL);
- cmd = g_strdup_printf("man -S 3:2:1:8:5:4:7:6 -P\"col -b\" \"%s\"", filename);
+ cmd = g_strdup_printf("man -P\"%s\" \'%s\'", DEVHELP_MANPAGE_PAGER, filename);
- fp = popen(cmd, "r");
- g_free(cmd);
- if (fp == NULL)
+ if (!g_spawn_command_line_sync(cmd, &text, NULL, &retcode, NULL))
+ {
+ g_free(cmd);
return NULL;
+ }
- while (fgets(buf, DEVHELP_MANPAGE_BUF_SIZE-1, fp) != NULL)
+ g_free(cmd);
+
+ if (retcode != 0)
{
- text = g_realloc(text, size);
- strncat(text, buf, DEVHELP_MANPAGE_BUF_SIZE);
- size += DEVHELP_MANPAGE_BUF_SIZE;
+ g_free(text);
+ return NULL;
}
- pclose(fp);
return text;
}
@@ -98,7 +114,6 @@
}
fp = fdopen(fd, "w");
- fseek(fp, 0, SEEK_SET);
text = devhelp_plugin_man(man_fn);
if (text == NULL)
@@ -108,8 +123,7 @@
fclose(fp);
return NULL;
}
- html_text = g_strdup_printf("<html><head><title>%s</title></head>"
- "<body><pre>%s</pre></body></html>", term, text);
+ html_text = g_strdup_printf(DEVHELP_MANPAGE_HTML_TEMPLATE, term, text);
g_free(text);
len = strlen(html_text);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Plugins-Commits
mailing list