]> sjero.net Git - wget/commitdiff
[svn] Reimplemented UNSAFE_CHAR and RESERVED_CHAR.
authorhniksic <devnull@localhost>
Wed, 25 Apr 2001 00:20:30 +0000 (17:20 -0700)
committerhniksic <devnull@localhost>
Wed, 25 Apr 2001 00:20:30 +0000 (17:20 -0700)
Fixed snprintf.c to avoid ISDIGIT.

src/ChangeLog
src/main.c
src/snprintf.c
src/url.c

index 313b504dc30337e061ad9afde2f53ccc0f6e24b2..1512e1e9df4b8cea22f88bc4995bccbc88665dc4 100644 (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>
 
        * utils.c: Document timer functions.
index 360d67e1fe7d8dd85c44548e93983bb742105097..de94a60c61fc417e4e2903421996f958e224e382 100644 (file)
@@ -102,7 +102,6 @@ i18n_initialize (void)
 
 /* It's kosher to declare these here because their interface _has_ to
    be void foo(void).  */
-void url_init PARAMS ((void));
 void host_init PARAMS ((void));
 
 /* This just calls the various initialization functions from the
@@ -110,7 +109,6 @@ void host_init PARAMS ((void));
 static void
 private_initialize (void)
 {
-  url_init ();
   host_init ();
 }
 \f
index bc83def4ff6686445434f24c3e6b05750abdb67d..e9a643e347ee22d1c96727d5385217a861ea4a90 100644 (file)
@@ -227,7 +227,7 @@ static int dopr (char *buffer, size_t maxlen, const char *format, va_list args)
       }
       break;
     case DP_S_MIN:
-      if (ISDIGIT(ch)) 
+      if ('0' <= ch && ch <= '9')
       {
        min = 10*min + char_to_int (ch);
        ch = *format++;
@@ -251,7 +251,7 @@ static int dopr (char *buffer, size_t maxlen, const char *format, va_list args)
        state = DP_S_MOD;
       break;
     case DP_S_MAX:
-      if (ISDIGIT(ch)) 
+      if ('0' <= ch && ch <= '9')
       {
        if (max < 0)
          max = 0;
index c7be646da388cea96a6ddff7f4d964c589138e80..3629cb9384f6aa885f8999bb4773782adccc5062 100644 (file)
--- a/src/url.c
+++ b/src/url.c
@@ -42,21 +42,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 extern int errno;
 #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 "."?  */
 #define DOTP(x) ((*(x) == '.') && (!*(x + 1)))
 /* Is X ".."?  */
@@ -135,34 +120,64 @@ static char *construct_relative PARAMS ((const char *, const char *));
 static char process_ftp_type PARAMS ((char *));
 
 \f
+/* 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:
    - anything <= 32;
    - stuff from rfc1738 ("<>\"#%{}|\\^~[]`");
-   - @ and :, for user/password encoding.
-   - everything over 127 (but we don't bother with recording those.  */
-void
-init_unsafe_char_table (void)
+   - '@' and ':'; needed for encoding URL username and password.
+   - anything >= 127. */
+
+#define UNSAFE_CHAR(c) urlchr_test(c, urlchr_unsafe)
+
+const static unsigned char urlchr_table[256] =
 {
-  int i;
-  for (i = 0; i < 256; i++)
-    if (i < 32 || i >= 127
-       || i == ' '
-       || i == '<'
-       || i == '>'
-       || i == '\"'
-       || i == '#'
-       || i == '%'
-       || i == '{'
-       || i == '}'
-       || i == '|'
-       || i == '\\'
-       || i == '^'
-       || i == '~'
-       || i == '['
-       || i == ']'
-       || i == '`')
-      unsafe_char_table[i] = 1;
-}
+  U,  U,  U,  U,   U,  U,  U,  U,   /* NUL SOH STX ETX  EOT ENQ ACK BEL */
+  U,  U,  U,  U,   U,  U,  U,  U,   /* BS  HT  LF  VT   FF  CR  SO  SI  */
+  U,  U,  U,  U,   U,  U,  U,  U,   /* DLE DC1 DC2 DC3  DC4 NAK SYN ETB */
+  U,  U,  U,  U,   U,  U,  U,  U,   /* CAN EM  SUB ESC  FS  GS  RS  US  */
+  U,  0,  U,  U,   0,  U,  R,  0,   /* SP  !   "   #    $   %   &   '   */
+  0,  0,  0,  R,   0,  0,  0,  R,   /* (   )   *   +    ,   -   .   /   */
+  0,  0,  0,  0,   0,  0,  0,  0,   /* 0   1   2   3    4   5   6   7   */
+  0,  0,  U,  R,   U,  R,  U,  R,   /* 8   9   :   ;    <   =   >   ?   */
+ RU,  0,  0,  0,   0,  0,  0,  0,   /* @   A   B   C    D   E   F   G   */
+  0,  0,  0,  0,   0,  0,  0,  0,   /* H   I   J   K    L   M   N   O   */
+  0,  0,  0,  0,   0,  0,  0,  0,   /* P   Q   R   S    T   U   V   W   */
+  0,  0,  0,  U,   U,  U,  U,  0,   /* X   Y   Z   [    \   ]   ^   _   */
+  U,  0,  0,  0,   0,  0,  0,  0,   /* `   a   b   c    d   e   f   g   */
+  0,  0,  0,  0,   0,  0,  0,  0,   /* h   i   j   k    l   m   n   o   */
+  0,  0,  0,  0,   0,  0,  0,  0,   /* p   q   r   s    t   u   v   w   */
+  0,  0,  0,  U,   U,  U,  U,  U,   /* x   y   z   {    |   }   ~   DEL */
+
+  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,
+  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
    code of which is xy.  xy are hexadecimal digits from
@@ -173,27 +188,27 @@ init_unsafe_char_table (void)
 static void
 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 != '%')
-       *p = *s;
+      if (*h != '%')
+       {
+       copychar:
+         *t = *h;
+       }
       else
        {
-         /* Do nothing if at the end of the string, or if the chars
-            are not hex-digits.  */
-         if (!*(s + 1) || !*(s + 2)
-             || !(ISXDIGIT (*(s + 1)) && ISXDIGIT (*(s + 2))))
-           {
-             *p = *s;
-             continue;
-           }
-         *p = (XCHAR_TO_XDIGIT (*(s + 1)) << 4) + XCHAR_TO_XDIGIT (*(s + 2));
-         s += 2;
+         /* Do nothing if '%' is not followed by two hex digits. */
+         if (!*(h + 1) || !*(h + 2)
+             || !(ISXDIGIT (*(h + 1)) && ISXDIGIT (*(h + 2))))
+           goto copychar;
+         *t = (XCHAR_TO_XDIGIT (*(h + 1)) << 4) + XCHAR_TO_XDIGIT (*(h + 2));
+         h += 2;
        }
     }
-  *p = '\0';
+  *t = '\0';
 }
 
 /* Like encode_string, but return S if there are no unsafe chars.  */
@@ -1702,10 +1717,3 @@ downloaded_files_free (void)
       rover = next;
     }
 }
-\f
-/* Initialization of static stuff. */
-void
-url_init (void)
-{
-  init_unsafe_char_table ();
-}