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;
}