Author: joes
Date: Tue Aug 23 18:08:56 2005
New Revision: 239495

URL: http://svn.apache.org/viewcvs?rev=239495&view=rev
Log:
Eliminate charset offsets from apreq_decode(v) return value.

Modified:
    httpd/apreq/trunk/CHANGES
    httpd/apreq/trunk/include/apreq_util.h
    httpd/apreq/trunk/include/apreq_version.h
    httpd/apreq/trunk/library/param.c
    httpd/apreq/trunk/library/parser_urlencoded.c
    httpd/apreq/trunk/library/t/util.c
    httpd/apreq/trunk/library/util.c

Modified: httpd/apreq/trunk/CHANGES
URL: 
http://svn.apache.org/viewcvs/httpd/apreq/trunk/CHANGES?rev=239495&r1=239494&r2=239495&view=diff
==============================================================================
--- httpd/apreq/trunk/CHANGES (original)
+++ httpd/apreq/trunk/CHANGES Tue Aug 23 18:08:56 2005
@@ -6,7 +6,8 @@
 
 
 - C API [joes]
-  Add apreq_charset_divine().
+  Add apreq_charset_divine() and eliminate charset offset from return
+  value of apreq_decode(v).
 
 - C API [joes]
   Improve the cp1252-charset heuristics for apreq_decode(v).

Modified: httpd/apreq/trunk/include/apreq_util.h
URL: 
http://svn.apache.org/viewcvs/httpd/apreq/trunk/include/apreq_util.h?rev=239495&r1=239494&r2=239495&view=diff
==============================================================================
--- httpd/apreq/trunk/include/apreq_util.h (original)
+++ httpd/apreq/trunk/include/apreq_util.h Tue Aug 23 18:08:56 2005
@@ -139,7 +139,7 @@
  * @return APREQ_CHARSET_LATIN1 if the string has no control chars;
  * @return APREQ_CHARSET_CP1252 if the string has control chars.
  */
-APREQ_DECLARE(apreq_charset_t) apreq_charset_divine(const unsigned char *src,
+APREQ_DECLARE(apreq_charset_t) apreq_charset_divine(const char *src,
                                                     apr_size_t slen);
 
 /**
@@ -151,9 +151,9 @@
  * @param src  Original string.
  * @param slen Length of original string.
  *
- * @return APR_SUCCESS + apreq_charset_t (<=APREQ_CHARSET_UTF8) on success.
- * @return APR_INCOMPLETE + apreq_charset_t (<=APREQ_CHARSET_UTF8) if the 
string
- *         ends in the middle of an escape sequence.
+ * @return APR_SUCCESS.
+ * @return APR_INCOMPLETE if the string
+ *                        ends in the middle of an escape sequence.
  * @return ::APREQ_ERROR_BADSEQ or ::APREQ_ERROR_BADCHAR on malformed input.
  *
  * @remarks In the non-success case, dlen will be set to include
@@ -174,9 +174,9 @@
  * @param v     Array of iovecs that represent the source string
  * @param nelts Number of iovecs in the array.
  *
- * @return APR_SUCCESS + apreq_charset_t (<=APREQ_CHARSET_UTF8) on success.
- * @return APR_INCOMPLETE + apreq_charset_t (<=APREQ_CHARSET_UTF8) if the iovec
- *         ends in the middle of an escape sequence.
+ * @return APR_SUCCESS.
+ * @return APR_INCOMPLETE if the iovec
+ *                        ends in the middle of an escape sequence.
  * @return ::APREQ_ERROR_BADSEQ or ::APREQ_ERROR_BADCHAR on malformed input.
  *
  * @remarks In the non-APR_SUCCESS case, dlen will be set to include

Modified: httpd/apreq/trunk/include/apreq_version.h
URL: 
http://svn.apache.org/viewcvs/httpd/apreq/trunk/include/apreq_version.h?rev=239495&r1=239494&r2=239495&view=diff
==============================================================================
--- httpd/apreq/trunk/include/apreq_version.h (original)
+++ httpd/apreq/trunk/include/apreq_version.h Tue Aug 23 18:08:56 2005
@@ -58,7 +58,7 @@
  * Minor API changes that do not cause binary compatibility problems.
  * Should be reset to 0 when upgrading APREQ_MAJOR_VERSION
  */
-#define APREQ_MINOR_VERSION       4
+#define APREQ_MINOR_VERSION       5
 
 /** patch level */
 #define APREQ_PATCH_VERSION       0

Modified: httpd/apreq/trunk/library/param.c
URL: 
http://svn.apache.org/viewcvs/httpd/apreq/trunk/library/param.c?rev=239495&r1=239494&r2=239495&view=diff
==============================================================================
--- httpd/apreq/trunk/library/param.c (original)
+++ httpd/apreq/trunk/library/param.c Tue Aug 23 18:08:56 2005
@@ -83,11 +83,11 @@
 
     if (vlen > 0) {
         status = apreq_decode(v->data, &v->dlen, word + nlen + 1, vlen);
-        if (status > APR_SUCCESS + APREQ_CHARSET_UTF8) {
+        if (status != APR_SUCCESS) {
             *param = NULL;
             return status;
         }
-        charset = status;
+        charset = apreq_charset_divine(v->data, v->dlen);
     }
     else {
         v->data[0] = 0;
@@ -97,12 +97,12 @@
     v->name = v->data + vlen + 1;
 
     status = apreq_decode(v->name, &v->nlen, word, nlen);
-    if (status > APR_SUCCESS + APREQ_CHARSET_UTF8) {
+    if (status != APR_SUCCESS) {
         *param = NULL;
         return status;
     }
 
-    switch (status) {
+    switch (apreq_charset_divine(v->name, v->nlen)) {
     case APREQ_CHARSET_UTF8:
         if (charset == APREQ_CHARSET_ASCII)
             charset = APREQ_CHARSET_UTF8;

Modified: httpd/apreq/trunk/library/parser_urlencoded.c
URL: 
http://svn.apache.org/viewcvs/httpd/apreq/trunk/library/parser_urlencoded.c?rev=239495&r1=239494&r2=239495&view=diff
==============================================================================
--- httpd/apreq/trunk/library/parser_urlencoded.c (original)
+++ httpd/apreq/trunk/library/parser_urlencoded.c Tue Aug 23 18:08:56 2005
@@ -115,18 +115,19 @@
 
     s = apreq_decodev(v->data, &vlen,
                       (struct iovec *)arr.elts + mark, arr.nelts - mark);
-    if (s > APR_SUCCESS + APREQ_CHARSET_UTF8)
+    if (s != APR_SUCCESS)
         return s;
 
-    charset = s;
+    charset = apreq_charset_divine(v->data, vlen);
 
     v->name = v->data + vlen + 1;
     v->dlen = vlen;
 
     s = apreq_decodev(v->name, &nlen, (struct iovec *)arr.elts, mark);
-    if (s > APR_SUCCESS + APREQ_CHARSET_UTF8)
+    if (s != APR_SUCCESS)
         return s;
-    switch (s) {
+
+    switch (apreq_charset_divine(v->name, nlen)) {
     case APREQ_CHARSET_UTF8:
         if (charset == APREQ_CHARSET_ASCII)
             charset = APREQ_CHARSET_UTF8;

Modified: httpd/apreq/trunk/library/t/util.c
URL: 
http://svn.apache.org/viewcvs/httpd/apreq/trunk/library/t/util.c?rev=239495&r1=239494&r2=239495&view=diff
==============================================================================
--- httpd/apreq/trunk/library/t/util.c (original)
+++ httpd/apreq/trunk/library/t/util.c Tue Aug 23 18:08:56 2005
@@ -77,7 +77,7 @@
     unsigned char expect[6];
 
     AT_int_eq(apreq_decode((char *)expect, &elen, src1, sizeof(src1) -1),
-              APR_SUCCESS + APREQ_CHARSET_UTF8);
+              APR_SUCCESS);
     AT_int_eq(elen, 5);
     AT_int_eq(expect[0], 0xC3);
     AT_int_eq(expect[1], 0x80);
@@ -86,6 +86,31 @@
     AT_int_eq(expect[4], 0xA2);
 }
 
+static void test_charset_divine(dAT)
+{
+    apr_size_t elen;
+    char src1[] = "%C3%80%E3%82%a2"; /* A_GRAVE KATAKANA_A as utf8 */
+    char src2[] = "pound%A3";/* latin-1 */
+    char src3[] = "euro%80";/* cp-1252 */
+    char expect[6];
+
+    AT_int_eq(apreq_decode(expect, &elen, src1, sizeof(src1) -1),
+              APR_SUCCESS);
+
+    AT_int_eq(apreq_charset_divine(expect, elen), APREQ_CHARSET_UTF8);
+
+    AT_int_eq(apreq_decode(expect, &elen, src2, sizeof(src2) -1),
+              APR_SUCCESS);
+
+    AT_int_eq(apreq_charset_divine(expect, elen), APREQ_CHARSET_LATIN1);
+    AT_int_eq(apreq_decode(expect, &elen, src3, sizeof(src3) -1),
+              APR_SUCCESS);
+
+    AT_int_eq(apreq_charset_divine(expect, elen), APREQ_CHARSET_CP1252);
+
+}
+
+
 static void test_decodev(dAT)
 {
     char src1[] = "%2540%2";
@@ -131,7 +156,7 @@
     apr_size_t slen;
 
     AT_int_eq(apreq_decode((char *)src2, &slen, src1, sizeof(src1) -1),
-              APR_SUCCESS + APREQ_CHARSET_UTF8);
+              APR_SUCCESS);
     AT_int_eq(apreq_cp1252_to_utf8((char *)expect, src2, 5),
               12);
 
@@ -280,6 +305,7 @@
         { dT(test_atoi64t, 9) },
         { dT(test_index, 6) },
         { dT(test_decode, 7) },
+        { dT(test_charset_divine, 6) },
         { dT(test_decodev, 6) },
         { dT(test_encode, 0) },
         { dT(test_cp1252_to_utf8, 14) },

Modified: httpd/apreq/trunk/library/util.c
URL: 
http://svn.apache.org/viewcvs/httpd/apreq/trunk/library/util.c?rev=239495&r1=239494&r2=239495&view=diff
==============================================================================
--- httpd/apreq/trunk/library/util.c (original)
+++ httpd/apreq/trunk/library/util.c Tue Aug 23 18:08:56 2005
@@ -236,21 +236,22 @@
  * about earlier control characters presumed to be valid utf8.
  */
 
-APREQ_DECLARE(apreq_charset_t) apreq_charset_divine(const unsigned char *src,
+APREQ_DECLARE(apreq_charset_t) apreq_charset_divine(const char *src,
                                                     apr_size_t slen)
 
 {
     apreq_charset_t rv = APREQ_CHARSET_ASCII;
     register unsigned char trail = 0, saw_cntrl = 0, mask = 0;
-    const unsigned char *end = src + slen;
+    register const unsigned char *s = (const unsigned char *)src;
+    const unsigned char *end = s + slen;
 
-    for (; src < end; ++src) {
+    for (; s < end; ++s) {
         if (trail) {
-            if ((*src & 0xC0) == 0x80 && (mask == 0 || (mask & *src))) {
+            if ((*s & 0xC0) == 0x80 && (mask == 0 || (mask & *s))) {
                 mask = 0;
                 --trail;
 
-                if ((*src & 0xE0) == 0x80) {
+                if ((*s & 0xE0) == 0x80) {
                     saw_cntrl = 1;
                 }
             }
@@ -261,13 +262,13 @@
                 rv = APREQ_CHARSET_LATIN1;
             }
         }
-        else if (*src < 0x80) {
+        else if (*s < 0x80) {
             /* do nothing */
         }
-        else if (*src < 0xA0) {
+        else if (*s < 0xA0) {
             return APREQ_CHARSET_CP1252;
         }
-        else if (*src < 0xC0) {
+        else if (*s < 0xC0) {
             if (saw_cntrl)
                 return APREQ_CHARSET_CP1252;
             rv = APREQ_CHARSET_LATIN1;
@@ -278,8 +279,8 @@
 
         /* utf8 cases */
 
-        else if (*src < 0xE0) {
-            if (*src & 0x1E) {
+        else if (*s < 0xE0) {
+            if (*s & 0x1E) {
                 rv = APREQ_CHARSET_UTF8;
                 trail = 1;
                 mask = 0;
@@ -289,23 +290,23 @@
             else
                 rv = APREQ_CHARSET_LATIN1;
         }
-        else if (*src < 0xF0) {
-            mask = (*src & 0x0F) ? 0 : 0x20;
+        else if (*s < 0xF0) {
+            mask = (*s & 0x0F) ? 0 : 0x20;
             rv = APREQ_CHARSET_UTF8;
             trail = 2;
         }
-        else if (*src < 0xF8) {
-            mask = (*src & 0x07) ? 0 : 0x30;
+        else if (*s < 0xF8) {
+            mask = (*s & 0x07) ? 0 : 0x30;
             rv = APREQ_CHARSET_UTF8;
             trail = 3;
         }
-        else if (*src < 0xFC) {
-            mask = (*src & 0x03) ? 0 : 0x38;
+        else if (*s < 0xFC) {
+            mask = (*s & 0x03) ? 0 : 0x38;
             rv = APREQ_CHARSET_UTF8;
             trail = 4;
         }
-        else if (*src < 0xFE) {
-            mask = (*src & 0x01) ? 0 : 0x3C;
+        else if (*s < 0xFE) {
+            mask = (*s & 0x01) ? 0 : 0x3C;
             rv = APREQ_CHARSET_UTF8;
             trail = 5;
         }
@@ -430,7 +431,6 @@
 {
     apr_size_t len = 0;
     const char *end = s + slen;
-    apr_status_t rv;
 
     if (s == (const char *)d) {     /* optimize for src = dest case */
         for ( ; d < end; ++d) {
@@ -446,15 +446,13 @@
         slen -= len;
     }
 
-    rv = url_decode(d, dlen, s, &slen);
-    return rv + apreq_charset_divine((unsigned char *)d, *dlen);
+    return url_decode(d, dlen, s, &slen);
 }
 
 APREQ_DECLARE(apr_status_t) apreq_decodev(char *d, apr_size_t *dlen,
                                           struct iovec *v, int nelts)
 {
     apr_status_t status = APR_SUCCESS;
-    const unsigned char *dest = (unsigned char *)d;
     int n = 0;
 
     *dlen = 0;
@@ -490,7 +488,7 @@
         }
     }
 
-    return status + apreq_charset_divine(dest, *dlen);
+    return status;
 }
 
 


Reply via email to