1
0
mirror of https://github.com/moparisthebest/wget synced 2024-07-03 16:38:41 -04:00

[svn] Reimplemented UNSAFE_CHAR and RESERVED_CHAR.

Fixed snprintf.c to avoid ISDIGIT.
This commit is contained in:
hniksic 2001-04-24 17:20:30 -07:00
parent 082aa5018e
commit d80f6cbe8c
4 changed files with 81 additions and 65 deletions

View File

@ -1,3 +1,13 @@
2001-04-25 Hrvoje Niksic <hniksic@arsdigita.com>
* url.c (UNSAFE_CHAR): Reimplement using a static table.
(url_init): Removed.
(init_unsafe_char_table): Removed.
2001-04-25 Hrvoje Niksic <hniksic@arsdigita.com>
* snprintf.c (dopr): Replace ISDIGIT with '0' <= ch && ch <= '9'.
2001-04-25 Hrvoje Niksic <hniksic@arsdigita.com> 2001-04-25 Hrvoje Niksic <hniksic@arsdigita.com>
* utils.c: Document timer functions. * utils.c: Document timer functions.

View File

@ -102,7 +102,6 @@ i18n_initialize (void)
/* It's kosher to declare these here because their interface _has_ to /* It's kosher to declare these here because their interface _has_ to
be void foo(void). */ be void foo(void). */
void url_init PARAMS ((void));
void host_init PARAMS ((void)); void host_init PARAMS ((void));
/* This just calls the various initialization functions from the /* This just calls the various initialization functions from the
@ -110,7 +109,6 @@ void host_init PARAMS ((void));
static void static void
private_initialize (void) private_initialize (void)
{ {
url_init ();
host_init (); host_init ();
} }

View File

@ -227,7 +227,7 @@ static int dopr (char *buffer, size_t maxlen, const char *format, va_list args)
} }
break; break;
case DP_S_MIN: case DP_S_MIN:
if (ISDIGIT(ch)) if ('0' <= ch && ch <= '9')
{ {
min = 10*min + char_to_int (ch); min = 10*min + char_to_int (ch);
ch = *format++; ch = *format++;
@ -251,7 +251,7 @@ static int dopr (char *buffer, size_t maxlen, const char *format, va_list args)
state = DP_S_MOD; state = DP_S_MOD;
break; break;
case DP_S_MAX: case DP_S_MAX:
if (ISDIGIT(ch)) if ('0' <= ch && ch <= '9')
{ {
if (max < 0) if (max < 0)
max = 0; max = 0;

130
src/url.c
View File

@ -42,21 +42,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
extern int errno; extern int errno;
#endif #endif
/* Table of Unsafe chars. This is intialized in
init_unsafe_char_table. */
static char unsafe_char_table[256];
#define UNSAFE_CHAR(c) (unsafe_char_table[(unsigned char)(c)])
/* rfc1738 reserved chars. This is too short to warrant a table. We
don't use this yet; preservation of reserved chars will be
implemented when I integrate the new `reencode_string'
function. */
#define RESERVED_CHAR(c) ( (c) == ';' || (c) == '/' || (c) == '?' \
|| (c) == '@' || (c) == '=' || (c) == '&' \
|| (c) == '+')
/* Is X "."? */ /* Is X "."? */
#define DOTP(x) ((*(x) == '.') && (!*(x + 1))) #define DOTP(x) ((*(x) == '.') && (!*(x + 1)))
/* Is X ".."? */ /* Is X ".."? */
@ -135,34 +120,64 @@ static char *construct_relative PARAMS ((const char *, const char *));
static char process_ftp_type PARAMS ((char *)); static char process_ftp_type PARAMS ((char *));
/* Support for encoding and decoding of URL strings. We determine
whether a character is unsafe through static table lookup. This
code assumes ASCII character set and 8-bit chars. */
enum {
urlchr_reserved = 1,
urlchr_unsafe = 2
};
#define R urlchr_reserved
#define U urlchr_unsafe
#define RU R|U
#define urlchr_test(c, mask) (urlchr_table[(unsigned char)(c)] & (mask))
/* rfc1738 reserved chars. We don't use this yet; preservation of
reserved chars will be implemented when I integrate the new
`reencode_string' function. */
#define RESERVED_CHAR(c) urlchr_test(c, urlchr_reserved)
/* Unsafe chars: /* Unsafe chars:
- anything <= 32; - anything <= 32;
- stuff from rfc1738 ("<>\"#%{}|\\^~[]`"); - stuff from rfc1738 ("<>\"#%{}|\\^~[]`");
- @ and :, for user/password encoding. - '@' and ':'; needed for encoding URL username and password.
- everything over 127 (but we don't bother with recording those. */ - anything >= 127. */
void
init_unsafe_char_table (void) #define UNSAFE_CHAR(c) urlchr_test(c, urlchr_unsafe)
const static unsigned char urlchr_table[256] =
{ {
int i; U, U, U, U, U, U, U, U, /* NUL SOH STX ETX EOT ENQ ACK BEL */
for (i = 0; i < 256; i++) U, U, U, U, U, U, U, U, /* BS HT LF VT FF CR SO SI */
if (i < 32 || i >= 127 U, U, U, U, U, U, U, U, /* DLE DC1 DC2 DC3 DC4 NAK SYN ETB */
|| i == ' ' U, U, U, U, U, U, U, U, /* CAN EM SUB ESC FS GS RS US */
|| i == '<' U, 0, U, U, 0, U, R, 0, /* SP ! " # $ % & ' */
|| i == '>' 0, 0, 0, R, 0, 0, 0, R, /* ( ) * + , - . / */
|| i == '\"' 0, 0, 0, 0, 0, 0, 0, 0, /* 0 1 2 3 4 5 6 7 */
|| i == '#' 0, 0, U, R, U, R, U, R, /* 8 9 : ; < = > ? */
|| i == '%' RU, 0, 0, 0, 0, 0, 0, 0, /* @ A B C D E F G */
|| i == '{' 0, 0, 0, 0, 0, 0, 0, 0, /* H I J K L M N O */
|| i == '}' 0, 0, 0, 0, 0, 0, 0, 0, /* P Q R S T U V W */
|| i == '|' 0, 0, 0, U, U, U, U, 0, /* X Y Z [ \ ] ^ _ */
|| i == '\\' U, 0, 0, 0, 0, 0, 0, 0, /* ` a b c d e f g */
|| i == '^' 0, 0, 0, 0, 0, 0, 0, 0, /* h i j k l m n o */
|| i == '~' 0, 0, 0, 0, 0, 0, 0, 0, /* p q r s t u v w */
|| i == '[' 0, 0, 0, U, U, U, U, U, /* x y z { | } ~ DEL */
|| i == ']'
|| i == '`') U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U,
unsafe_char_table[i] = 1; U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U,
} U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U,
U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U,
U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U,
U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U,
U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U,
U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U,
};
/* Decodes the forms %xy in a URL to the character the hexadecimal /* Decodes the forms %xy in a URL to the character the hexadecimal
code of which is xy. xy are hexadecimal digits from code of which is xy. xy are hexadecimal digits from
@ -173,27 +188,27 @@ init_unsafe_char_table (void)
static void static void
decode_string (char *s) decode_string (char *s)
{ {
char *p = s; char *t = s; /* t - tortoise */
char *h = s; /* h - hare */
for (; *s; s++, p++) for (; *h; h++, t++)
{ {
if (*s != '%') if (*h != '%')
*p = *s; {
copychar:
*t = *h;
}
else else
{ {
/* Do nothing if at the end of the string, or if the chars /* Do nothing if '%' is not followed by two hex digits. */
are not hex-digits. */ if (!*(h + 1) || !*(h + 2)
if (!*(s + 1) || !*(s + 2) || !(ISXDIGIT (*(h + 1)) && ISXDIGIT (*(h + 2))))
|| !(ISXDIGIT (*(s + 1)) && ISXDIGIT (*(s + 2)))) goto copychar;
{ *t = (XCHAR_TO_XDIGIT (*(h + 1)) << 4) + XCHAR_TO_XDIGIT (*(h + 2));
*p = *s; h += 2;
continue;
}
*p = (XCHAR_TO_XDIGIT (*(s + 1)) << 4) + XCHAR_TO_XDIGIT (*(s + 2));
s += 2;
} }
} }
*p = '\0'; *t = '\0';
} }
/* Like encode_string, but return S if there are no unsafe chars. */ /* Like encode_string, but return S if there are no unsafe chars. */
@ -1702,10 +1717,3 @@ downloaded_files_free (void)
rover = next; rover = next;
} }
} }
/* Initialization of static stuff. */
void
url_init (void)
{
init_unsafe_char_table ();
}