if (contains_unsafe (s)) \
{ \
char *uc_tmp = encode_string (s); \
- free (s); \
+ xfree (s); \
(s) = uc_tmp; \
} \
} while (0)
int i;
for (i = 0; i < 256; i++)
if (i < 32 || i >= 127
+ || i == ' '
|| i == '<'
|| i == '>'
|| i == '\"'
if (u->proxy)
freeurl (u->proxy, 1);
if (complete)
- free (u);
+ xfree (u);
return;
}
\f
tmp[1] = '2';
tmp[2] = 'F';
strcpy (tmp + 3, dir + 1);
- free (dir);
+ xfree (dir);
dir = tmp;
}
if (*dir)
res[l++] = '/';
strcpy (res + l, file);
- free (host);
- free (dir);
- free (file);
+ xfree (host);
+ xfree (dir);
+ xfree (file);
FREE_MAYBE (user);
FREE_MAYBE (passwd);
return res;
while (l)
{
urlpos *next = l->next;
- free (l->url);
+ xfree (l->url);
FREE_MAYBE (l->local_name);
- free (l);
+ xfree (l);
l = next;
}
}
{
if (S_ISDIR (st.st_mode))
{
- free (t);
+ xfree (t);
return 0;
}
else
res = make_directory (t);
if (res != 0)
logprintf (LOG_NOTQUIET, "%s: %s", t, strerror (errno));
- free (t);
+ xfree (t);
return res;
}
if (opt.add_hostdir && !opt.simple_check)
{
char *nhost = realhost (host);
- free (host);
+ xfree (host);
host = nhost;
}
/* Add dir_prefix and hostname (if required) to the beginning of
else
dirpref = "";
}
- free (host);
+ xfree (host);
/* If there is a prefix, prepend it. */
if (*dirpref)
/* Finally, construct the full name. */
res = (char *)xmalloc (strlen (dir) + 1 + strlen (file) + 1);
sprintf (res, "%s%s%s", dir, *dir ? "/" : "", file);
- free (dir);
+ xfree (dir);
return res;
}
char *nfile = (char *)xmalloc (strlen (opt.dir_prefix)
+ 1 + strlen (file) + 1);
sprintf (nfile, "%s/%s", opt.dir_prefix, file);
- free (file);
+ xfree (file);
file = nfile;
}
}
/* Find a unique name. */
name = unique_name (file);
- free (file);
+ xfree (file);
return name;
}
{
/* Find the "true" host. */
char *host = realhost (u->host);
- free (u->host);
+ xfree (u->host);
u->host = host;
assert (u->dir != NULL); /* the URL must have been parsed */
/* Refresh the printed representation. */
- free (u->url);
+ xfree (u->url);
u->url = str_url (u, 0);
}
char *p;
downloaded_file_t downloaded_file_return;
+ logprintf (LOG_VERBOSE, _("Converting %s... "), file);
+
{
/* First we do a "dry run": go through the list L and see whether
any URL needs to be converted in the first place. If not, just
int count = 0;
urlpos *dry = l;
for (dry = l; dry; dry = dry->next)
- if (dry->flags & (UABS2REL | UREL2ABS))
+ if (dry->convert != CO_NOCONVERT)
++count;
if (!count)
{
- logprintf (LOG_VERBOSE, _("Nothing to do while converting %s.\n"),
- file);
+ logputs (LOG_VERBOSE, _("nothing to do.\n"));
return;
}
}
- logprintf (LOG_VERBOSE, _("Converting %s... "), file);
-
fm = read_file (file);
if (!fm)
{
break;
}
/* If the URL is not to be converted, skip it. */
- if (!(l->flags & (UABS2REL | UREL2ABS)))
+ if (l->convert == CO_NOCONVERT)
{
- DEBUGP (("Skipping %s at position %d (flags %d).\n", l->url,
- l->pos, l->flags));
+ DEBUGP (("Skipping %s at position %d.\n", l->url, l->pos));
continue;
}
quote, to the outfile. */
fwrite (p, 1, url_start - p, fp);
p = url_start;
- if (l->flags & UABS2REL)
+ if (l->convert == CO_CONVERT_TO_RELATIVE)
{
/* Convert absolute URL to relative. */
char *newname = construct_relative (file, l->local_name);
+ char *quoted_newname = html_quote_string (newname);
putc (*p, fp); /* quoting char */
- fputs (newname, fp);
+ fputs (quoted_newname, fp);
p += l->size - 1;
putc (*p, fp); /* close quote */
++p;
- DEBUGP (("ABS2REL: %s to %s at position %d in %s.\n",
+ xfree (newname);
+ xfree (quoted_newname);
+ DEBUGP (("TO_RELATIVE: %s to %s at position %d in %s.\n",
l->url, newname, l->pos, file));
- free (newname);
}
- else if (l->flags & UREL2ABS)
+ else if (l->convert == CO_CONVERT_TO_COMPLETE)
{
/* Convert the link to absolute URL. */
char *newlink = l->url;
+ char *quoted_newlink = html_quote_string (newlink);
putc (*p, fp); /* quoting char */
- fputs (newlink, fp);
+ fputs (quoted_newlink, fp);
p += l->size - 1;
putc (*p, fp); /* close quote */
++p;
- DEBUGP (("REL2ABS: <something> to %s at position %d in %s.\n",
+ xfree (quoted_newlink);
+ DEBUGP (("TO_COMPLETE: <something> to %s at position %d in %s.\n",
newlink, l->pos, file));
}
}
rather than making a copy of the string... Another note is that I
thought I could just add a field to the urlpos structure saying
that we'd written a .orig file for this URL, but that didn't work,
- so I had to make this separate list. */
+ so I had to make this separate list.
+
+ This [adding a field to the urlpos structure] didn't work
+ because convert_file() is called twice: once after all its
+ sublinks have been retrieved in recursive_retrieve(), and
+ once at the end of the day in convert_all_links(). The
+ original linked list collected in recursive_retrieve() is
+ lost after the first invocation of convert_links(), and
+ convert_all_links() makes a new one (it calls get_urls_html()
+ for each file it covers.) That's why your approach didn't
+ work. The way to make it work is perhaps to make this flag a
+ field in the `urls_html' list. */
+
converted_file_ptr = xmalloc(sizeof(*converted_file_ptr));
converted_file_ptr->string = xstrdup(file); /* die on out-of-mem. */
converted_file_ptr->next = converted_files;
}
}
+typedef struct _downloaded_file_list {
+ char* file;
+ downloaded_file_t download_type;
+ struct _downloaded_file_list* next;
+} downloaded_file_list;
+
+static downloaded_file_list *downloaded_files;
+
/* Remembers which files have been downloaded. In the standard case, should be
called with mode == FILE_DOWNLOADED_NORMALLY for each file we actually
download successfully (i.e. not for ones we have failures on or that we skip
downloaded_file_t
downloaded_file (downloaded_file_t mode, const char* file)
{
- typedef struct _downloaded_file_list
- {
- char* file;
- downloaded_file_t download_type;
- struct _downloaded_file_list* next;
- } downloaded_file_list;
-
boolean found_file = FALSE;
- static downloaded_file_list* downloaded_files = NULL;
downloaded_file_list* rover = downloaded_files;
while (rover != NULL)
return FILE_NOT_ALREADY_DOWNLOADED;
}
}
+
+void
+downloaded_files_free (void)
+{
+ downloaded_file_list* rover = downloaded_files;
+ while (rover)
+ {
+ downloaded_file_list *next = rover->next;
+ xfree (rover->file);
+ xfree (rover);
+ rover = next;
+ }
+}
\f
/* Initialization of static stuff. */
void