On Wed, 2011-10-19 at 16:59 +0200, Jiri Moskovcak wrote:
On 10/19/2011 03:57 PM, Jiri Moskovcak wrote:
> Run tested, please review.
>
> --J
- updated patch, this time with hyperlinks.c
+char * tag_url(const char* line)
+{
+ const char *known_url_prefixes[] = {"http://", "https://",
"ftp://", "file://", NULL};
+ char *url_end;
+ char *url_start;
+ char *hyperlink;
+ char *new_str = xstrdup(line);
+ char *last_end = new_str;
I think this assignment (last_end) should be inside outer 'while'.
+
+ const char **tmp = known_url_prefixes;
+ while (*tmp != NULL && *new_str != '\0')
&& *new_str != '\0' check is not needed.
+ {
+ while (*last_end != '\0' && ((url_start = strstr(last_end, *tmp))
!= NULL))
*last_end != '\0' check is not needed.
+ {
+ url_end = strchrnul(url_start, ' ');
+ *url_end = '\0';
+ char * tmp_str = xstrndup(url_start, url_end - url_start);
+ hyperlink = xasprintf("<a
href=\"%s\">%s</a>", tmp_str, tmp_str);
+ char *c = new_str;
+ if (url_start != new_str)
+ {
+ *url_start = '\0';
+ new_str = xasprintf("%s%s%s", last_end, hyperlink, url_end);
After *url_end = '\0', printing url_end with "%s" will emit nothing.
+ }
+ else
+ new_str = xasprintf("%s%s", hyperlink, url_end);
+ last_end = new_str + (strlen(url_start) + strlen(hyperlink)) + 1;
+ free(c);
+ free(tmp_str);
'hyperlink' is leaked.
+ }
+ tmp++;
+ }
+ return new_str;
+}
Many variable names are non-descriptive, which makes code hard to read.
I propose this untested version:
char *tag_url(const char* line)
{
static const char *const known_url_prefixes[] = {"http://",
"https://", "ftp://", "file://", NULL};
char *result = xstrdup(line);
const char *const *pfx = known_url_prefixes;
while (*pfx != NULL)
{
char *cur_pos = result;
char *url_start;
while ((url_start = strstr(cur_pos, *tmp)) != NULL)
{
char *url_end = strchrnul(url_start, ' '); //TODO: also '.',
',', '\t', '\n'...
int len = url_end - url_start;
char *hyperlink = xasprintf("<a
href=\"%.*s\">%.*s</a>",
len, url_start,
len, url_start
);
len = url_start - result;
char *old = result;
result = xasprintf("%.*s%s%s",
len, result,
hyperlink,
url_end
);
cur_pos = result + len + strlen(hyperlink);
free(old);
free(hyperlink);
}
pfx++;
}
return result;
}
--
vda