+#ifndef WINDOWS
+# define ISSEP(c) ((c) == '/')
+#else
+# define ISSEP(c) ((c) == '/' || (c) == '\\')
+#endif
+
+/* Like the above, but handles tilde-expansion when reading a user's
+ `.wgetrc'. In that case, and if VAL begins with `~', the tilde
+ gets expanded to the user's home directory. */
+static int
+cmd_file (const char *com, const char *val, void *closure)
+{
+ char **pstring = (char **)closure;
+
+ FREE_MAYBE (*pstring);
+
+ /* #### If VAL is empty, perhaps should set *CLOSURE to NULL. */
+
+ if (!enable_tilde_expansion || !(*val == '~' && ISSEP (val[1])))
+ {
+ noexpand:
+ *pstring = xstrdup (val);
+ }
+ else
+ {
+ char *result;
+ int homelen;
+ char *home = home_dir ();
+ if (!home)
+ goto noexpand;
+
+ homelen = strlen (home);
+ while (homelen && ISSEP (home[homelen - 1]))
+ home[--homelen] = '\0';
+
+ /* Skip the leading "~/". */
+ for (++val; ISSEP (*val); val++)
+ ;
+
+ result = xmalloc (homelen + 1 + strlen (val) + 1);
+ memcpy (result, home, homelen);
+ result[homelen] = '/';
+ strcpy (result + homelen + 1, val);
+
+ *pstring = result;
+ }
+
+#ifdef WINDOWS
+ /* Convert "\" to "/". */
+ {
+ char *s;
+ for (s = *pstring; *s; s++)
+ if (*s == '\\')
+ *s = '/';
+ }
+#endif
+ return 1;
+}
+
+/* Like cmd_file, but strips trailing '/' characters. */
+static int
+cmd_directory (const char *com, const char *val, void *closure)
+{
+ char *s, *t;
+
+ /* Call cmd_file() for tilde expansion and separator
+ canonicalization (backslash -> slash under Windows). These
+ things should perhaps be in a separate function. */
+ if (!cmd_file (com, val, closure))
+ return 0;
+
+ s = *(char **)closure;
+ t = s + strlen (s);
+ while (t > s && *--t == '/')
+ *t = '\0';
+
+ return 1;
+}
+
+/* Split VAL by space to a vector of values, and append those values
+ to vector pointed to by the CLOSURE argument. If VAL is empty, the
+ CLOSURE vector is cleared instead. */
+