/* Command line parsing.
Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
- 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+ 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
This file is part of GNU Wget.
/* defined in build_info.c */
extern char *compiled_features[];
/* Used for --version output in print_version */
-static const int max_chars_per_line = 72;
+#define MAX_CHARS_PER_LINE 72
+#define TABULATION 4
#if defined(SIGHUP) || defined(SIGUSR1)
static void redirect_output_signal (int);
#endif
const char *exec_name;
+
+/* Number of successfully downloaded URLs */
+int numurls = 0;
\f
#ifndef TESTING
/* Initialize I18N/L10N. That amounts to invoking setlocale, and
{ "inet6-only", '6', OPT_BOOLEAN, "inet6only", -1 },
#endif
{ "input-file", 'i', OPT_VALUE, "input", -1 },
+ { "iri", 0, OPT_BOOLEAN, "iri", -1 },
{ "keep-session-cookies", 0, OPT_BOOLEAN, "keepsessioncookies", -1 },
{ "level", 'l', OPT_VALUE, "reclevel", -1 },
{ "limit-rate", 0, OPT_VALUE, "limitrate", -1 },
{ "load-cookies", 0, OPT_VALUE, "loadcookies", -1 },
+ { "locale", 0, OPT_VALUE, "locale", -1 },
{ "max-redirect", 0, OPT_VALUE, "maxredirect", -1 },
{ "mirror", 'm', OPT_BOOLEAN, "mirror", -1 },
{ "no", 'n', OPT__NO, NULL, required_argument },
{ "referer", 0, OPT_VALUE, "referer", -1 },
{ "reject", 'R', OPT_VALUE, "reject", -1 },
{ "relative", 'L', OPT_BOOLEAN, "relativeonly", -1 },
+ { "remote-encoding", 0, OPT_VALUE, "remoteencoding", -1},
{ "remove-listing", 0, OPT_BOOLEAN, "removelisting", -1 },
{ "restrict-file-names", 0, OPT_BOOLEAN, "restrictfilenames", -1 },
{ "retr-symlinks", 0, OPT_BOOLEAN, "retrsymlinks", -1 },
format_and_print_line (const char *prefix, const char *line,
int line_length)
{
- int leading_spaces;
int remaining_chars;
char *line_dup, *token;
line_dup = xstrdup (line);
if (line_length <= 0)
- line_length = max_chars_per_line;
+ line_length = MAX_CHARS_PER_LINE - TABULATION;
- leading_spaces = strlen (prefix);
printf ("%s", prefix);
- remaining_chars = line_length - leading_spaces;
+ remaining_chars = line_length;
/* We break on spaces. */
token = strtok (line_dup, " ");
while (token != NULL)
token on the next line. */
if (remaining_chars <= strlen (token))
{
- printf ("\n%*c", leading_spaces, ' ');
- remaining_chars = line_length - leading_spaces;
+ printf ("\n%*c", TABULATION, ' ');
+ remaining_chars = line_length - TABULATION;
}
printf ("%s ", token);
- remaining_chars -= strlen (token) + 1; // account for " "
+ remaining_chars -= strlen (token) + 1; /* account for " " */
token = strtok (NULL, " ");
}
static void
print_version (void)
{
- const char *options_title = "Options : ";
- const char *wgetrc_title = "Wgetrc : ";
- const char *locale_title = "Locale : ";
- const char *compile_title = "Compile : ";
- const char *link_title = "Link : ";
- const char *prefix_spaces = " ";
- const int prefix_space_length = strlen (prefix_spaces);
+ const char *wgetrc_title = _("Wgetrc: ");
+ const char *locale_title = _("Locale: ");
+ const char *compile_title = _("Compile: ");
+ const char *link_title = _("Link: ");
char *line;
char *env_wgetrc, *user_wgetrc;
int i;
- printf ("GNU Wget %s\n", version_string);
- printf (options_title);
+ printf (_("GNU Wget %s\n\n"), version_string);
/* compiled_features is a char*[]. We limit the characters per
- line to max_chars_per_line and prefix each line with a constant
+ line to MAX_CHARS_PER_LINE and prefix each line with a constant
number of spaces for proper alignment. */
for (i = 0; compiled_features[i] != NULL; )
{
- int line_length = max_chars_per_line - prefix_space_length;
+ int line_length = MAX_CHARS_PER_LINE;
while ((line_length > 0) && (compiled_features[i] != NULL))
{
printf ("%s ", compiled_features[i]);
i++;
}
printf ("\n");
- if (compiled_features[i] != NULL)
- {
- printf (prefix_spaces);
- }
}
+ printf ("\n");
/* Handle the case when $WGETRC is unset and $HOME/.wgetrc is
absent. */
- printf (wgetrc_title);
+ printf ("%s\n", wgetrc_title);
env_wgetrc = wgetrc_env_file_name ();
if (env_wgetrc && *env_wgetrc)
{
- printf ("%s (env)\n%s", env_wgetrc, prefix_spaces);
+ printf (" %s (env)\n", env_wgetrc);
xfree (env_wgetrc);
}
user_wgetrc = wgetrc_user_file_name ();
if (user_wgetrc)
{
- printf ("%s (user)\n%s", user_wgetrc, prefix_spaces);
+ printf (" %s (user)\n", user_wgetrc);
xfree (user_wgetrc);
}
#ifdef SYSTEM_WGETRC
- printf ("%s (system)\n", SYSTEM_WGETRC);
-#else
- putchar ('\n');
+ printf (" %s (system)\n", SYSTEM_WGETRC);
#endif
format_and_print_line (locale_title,
LOCALEDIR,
- max_chars_per_line);
+ MAX_CHARS_PER_LINE);
format_and_print_line (compile_title,
compilation_string,
- max_chars_per_line);
+ MAX_CHARS_PER_LINE);
format_and_print_line (link_title,
link_string,
- max_chars_per_line);
+ MAX_CHARS_PER_LINE);
printf ("\n");
/* TRANSLATORS: When available, an actual copyright character
exit (1);
}
+#ifdef ENABLE_IRI
+ if (opt.enable_iri)
+ {
+ if (opt.locale && !check_encoding_name (opt.locale))
+ opt.locale = NULL;
+
+ if (!opt.locale)
+ opt.locale = find_locale ();
+
+ if (opt.encoding_remote && !check_encoding_name (opt.encoding_remote))
+ opt.encoding_remote = NULL;
+ }
+#else
+ if (opt.enable_iri || opt.locale || opt.encoding_remote)
+ {
+ /* sXXXav : be more specific... */
+ printf(_("This version does not have support for IRIs\n"));
+ exit(1);
+ }
+#endif
+
if (opt.ask_passwd)
{
opt.passwd = prompt_for_password ();
{
#ifdef WINDOWS
FILE *result;
- result = freopen (NULL, "wb", stdout);
+ result = freopen ("CONOUT$", "wb", stdout);
if (result == NULL)
{
logputs (LOG_NOTQUIET, _("\
for (t = url; *t; t++)
{
char *filename = NULL, *redirected_URL = NULL;
- int dt;
+ int dt, url_err;
+ /* Need to do a new struct iri every time, because
+ * retrieve_url may modify it in some circumstances,
+ * currently. */
+ struct iri *iri = iri_new ();
+ struct url *url_parsed;
+
+ set_uri_encoding (iri, opt.locale, true);
+ url_parsed = url_parse (*t, &url_err, iri, true);
- if ((opt.recursive || opt.page_requisites)
- && (url_scheme (*t) != SCHEME_FTP || url_uses_proxy (*t)))
+ if (!url_parsed)
{
- int old_follow_ftp = opt.follow_ftp;
+ char *error = url_error (*t, url_err);
+ logprintf (LOG_NOTQUIET, "%s: %s.\n",*t, error);
+ xfree (error);
+ status = URLERROR;
+ }
+ else
+ {
+ if ((opt.recursive || opt.page_requisites)
+ && (url_scheme (*t) != SCHEME_FTP || url_uses_proxy (url_parsed)))
+ {
+ int old_follow_ftp = opt.follow_ftp;
- /* Turn opt.follow_ftp on in case of recursive FTP retrieval */
- if (url_scheme (*t) == SCHEME_FTP)
- opt.follow_ftp = 1;
+ /* Turn opt.follow_ftp on in case of recursive FTP retrieval */
+ if (url_scheme (*t) == SCHEME_FTP)
+ opt.follow_ftp = 1;
- status = retrieve_tree (*t);
+ status = retrieve_tree (url_parsed, NULL);
- opt.follow_ftp = old_follow_ftp;
- }
- else
- status = retrieve_url (*t, &filename, &redirected_URL, NULL, &dt, opt.recursive);
+ opt.follow_ftp = old_follow_ftp;
+ }
+ else
+ {
+ status = retrieve_url (url_parsed, *t, &filename, &redirected_URL,
+ NULL, &dt, opt.recursive, iri);
+ }
- if (opt.delete_after && file_exists_p(filename))
- {
- DEBUGP (("Removing file due to --delete-after in main():\n"));
- logprintf (LOG_VERBOSE, _("Removing %s.\n"), filename);
- if (unlink (filename))
- logprintf (LOG_NOTQUIET, "unlink: %s\n", strerror (errno));
+ if (opt.delete_after && file_exists_p(filename))
+ {
+ DEBUGP (("Removing file due to --delete-after in main():\n"));
+ logprintf (LOG_VERBOSE, _("Removing %s.\n"), filename);
+ if (unlink (filename))
+ logprintf (LOG_NOTQUIET, "unlink: %s\n", strerror (errno));
+ }
+ xfree_null (redirected_URL);
+ xfree_null (filename);
+ url_free (url_parsed);
}
-
- xfree_null (redirected_URL);
- xfree_null (filename);
+ iri_free (iri);
}
/* And then from the input file, if any. */
logprintf (LOG_NOTQUIET,
_("FINISHED --%s--\nDownloaded: %d files, %s in %s (%s)\n"),
datetime_str (time (NULL)),
- opt.numurls,
+ numurls,
human_readable (total_downloaded_bytes),
secs_to_human_time (total_download_time),
retr_rate (total_downloaded_bytes, total_download_time));