bug 236425: fix IDN support on 64bit platforms (r=darin, sr=bz, a=chofmann)

This commit is contained in:
jshin%mailaps.org 2005-06-03 02:21:47 +00:00
Родитель b54132568a
Коммит e2d009106c
5 изменённых файлов: 57 добавлений и 53 удалений

Просмотреть файл

@ -64,9 +64,9 @@
#include "nameprep_template.c" #include "nameprep_template.c"
#undef VERSION #undef VERSION
typedef const char *(*nameprep_mapproc)(unsigned long v); typedef const char *(*nameprep_mapproc)(PRUint32 v);
typedef int (*nameprep_checkproc)(unsigned long v); typedef int (*nameprep_checkproc)(PRUint32 v);
typedef idn_biditype_t (*nameprep_biditypeproc)(unsigned long v); typedef idn_biditype_t (*nameprep_biditypeproc)(PRUint32 v);
static struct idn_nameprep { static struct idn_nameprep {
char *version; char *version;
@ -86,8 +86,8 @@ static struct idn_nameprep {
}; };
static idn_result_t idn_nameprep_check(nameprep_checkproc proc, static idn_result_t idn_nameprep_check(nameprep_checkproc proc,
const unsigned long *str, const PRUint32 *str,
const unsigned long **found); const PRUint32 **found);
idn_result_t idn_result_t
idn_nameprep_create(const char *version, idn_nameprep_t *handlep) { idn_nameprep_create(const char *version, idn_nameprep_t *handlep) {
@ -125,15 +125,15 @@ idn_nameprep_destroy(idn_nameprep_t handle) {
} }
idn_result_t idn_result_t
idn_nameprep_map(idn_nameprep_t handle, const unsigned long *from, idn_nameprep_map(idn_nameprep_t handle, const PRUint32 *from,
unsigned long *to, size_t tolen) { PRUint32 *to, size_t tolen) {
assert(handle != NULL && from != NULL && to != NULL); assert(handle != NULL && from != NULL && to != NULL);
TRACE(("idn_nameprep_map(ctx=%s, from=\"%s\")\n", TRACE(("idn_nameprep_map(ctx=%s, from=\"%s\")\n",
handle->version, idn__debug_ucs4xstring(from, 50))); handle->version, idn__debug_ucs4xstring(from, 50)));
while (*from != '\0') { while (*from != '\0') {
unsigned long v = *from; PRUint32 v = *from;
const char *mapped; const char *mapped;
if (v > UCS_MAX) { if (v > UCS_MAX) {
@ -189,8 +189,8 @@ idn_nameprep_map(idn_nameprep_t handle, const unsigned long *from,
} }
idn_result_t idn_result_t
idn_nameprep_isprohibited(idn_nameprep_t handle, const unsigned long *str, idn_nameprep_isprohibited(idn_nameprep_t handle, const PRUint32 *str,
const unsigned long **found) { const PRUint32 **found) {
assert(handle != NULL && str != NULL && found != NULL); assert(handle != NULL && str != NULL && found != NULL);
TRACE(("idn_nameprep_isprohibited(ctx=%s, str=\"%s\")\n", TRACE(("idn_nameprep_isprohibited(ctx=%s, str=\"%s\")\n",
@ -200,8 +200,8 @@ idn_nameprep_isprohibited(idn_nameprep_t handle, const unsigned long *str,
} }
idn_result_t idn_result_t
idn_nameprep_isunassigned(idn_nameprep_t handle, const unsigned long *str, idn_nameprep_isunassigned(idn_nameprep_t handle, const PRUint32 *str,
const unsigned long **found) { const PRUint32 **found) {
assert(handle != NULL && str != NULL && found != NULL); assert(handle != NULL && str != NULL && found != NULL);
TRACE(("idn_nameprep_isunassigned(handle->version, str=\"%s\")\n", TRACE(("idn_nameprep_isunassigned(handle->version, str=\"%s\")\n",
@ -211,9 +211,9 @@ idn_nameprep_isunassigned(idn_nameprep_t handle, const unsigned long *str,
} }
static idn_result_t static idn_result_t
idn_nameprep_check(nameprep_checkproc proc, const unsigned long *str, idn_nameprep_check(nameprep_checkproc proc, const PRUint32 *str,
const unsigned long **found) { const PRUint32 **found) {
unsigned long v; PRUint32 v;
while (*str != '\0') { while (*str != '\0') {
v = *str; v = *str;
@ -236,9 +236,9 @@ idn_nameprep_check(nameprep_checkproc proc, const unsigned long *str,
} }
idn_result_t idn_result_t
idn_nameprep_isvalidbidi(idn_nameprep_t handle, const unsigned long *str, idn_nameprep_isvalidbidi(idn_nameprep_t handle, const PRUint32 *str,
const unsigned long **found) { const PRUint32 **found) {
unsigned long v; PRUint32 v;
idn_biditype_t first_char; idn_biditype_t first_char;
idn_biditype_t last_char; idn_biditype_t last_char;
int found_r_al; int found_r_al;
@ -323,25 +323,25 @@ idn_nameprep_destroyproc(void *handle) {
} }
idn_result_t idn_result_t
idn_nameprep_mapproc(void *handle, const unsigned long *from, idn_nameprep_mapproc(void *handle, const PRUint32 *from,
unsigned long *to, size_t tolen) { PRUint32 *to, size_t tolen) {
return idn_nameprep_map((idn_nameprep_t)handle, from, to, tolen); return idn_nameprep_map((idn_nameprep_t)handle, from, to, tolen);
} }
idn_result_t idn_result_t
idn_nameprep_prohibitproc(void *handle, const unsigned long *str, idn_nameprep_prohibitproc(void *handle, const PRUint32 *str,
const unsigned long **found) { const PRUint32 **found) {
return idn_nameprep_isprohibited((idn_nameprep_t)handle, str, found); return idn_nameprep_isprohibited((idn_nameprep_t)handle, str, found);
} }
idn_result_t idn_result_t
idn_nameprep_unassignedproc(void *handle, const unsigned long *str, idn_nameprep_unassignedproc(void *handle, const PRUint32 *str,
const unsigned long **found) { const PRUint32 **found) {
return idn_nameprep_isunassigned((idn_nameprep_t)handle, str, found); return idn_nameprep_isunassigned((idn_nameprep_t)handle, str, found);
} }
idn_result_t idn_result_t
idn_nameprep_bidiproc(void *handle, const unsigned long *str, idn_nameprep_bidiproc(void *handle, const PRUint32 *str,
const unsigned long **found) { const PRUint32 **found) {
return idn_nameprep_isvalidbidi((idn_nameprep_t)handle, str, found); return idn_nameprep_isvalidbidi((idn_nameprep_t)handle, str, found);
} }

Просмотреть файл

@ -48,6 +48,8 @@
#ifndef NAMEPREP_TEMPLATE_INIT #ifndef NAMEPREP_TEMPLATE_INIT
#define NAMEPREP_TEMPLATE_INIT #define NAMEPREP_TEMPLATE_INIT
#include "prtypes.h"
/* Symbol composition. */ /* Symbol composition. */
#define compose_sym2(a, b) compose_sym2X(a, b) #define compose_sym2(a, b) compose_sym2X(a, b)
#define compose_sym2X(a, b) a ## b #define compose_sym2X(a, b) a ## b
@ -73,7 +75,7 @@
#endif /* NAMEPREP_TEMPLATE_INIT */ #endif /* NAMEPREP_TEMPLATE_INIT */
static const char * static const char *
compose_sym2(nameprep_map_, VERSION) (unsigned long v) { compose_sym2(nameprep_map_, VERSION) (PRUint32 v) {
int idx0 = IDX0(MAP, v); int idx0 = IDX0(MAP, v);
int idx1 = IDX1(MAP, v); int idx1 = IDX1(MAP, v);
int idx2 = IDX2(MAP, v); int idx2 = IDX2(MAP, v);
@ -92,7 +94,7 @@ compose_sym2(nameprep_map_, VERSION) (unsigned long v) {
} }
static int static int
compose_sym2(nameprep_prohibited_, VERSION) (unsigned long v) { compose_sym2(nameprep_prohibited_, VERSION) (PRUint32 v) {
int idx0 = IDX0(PROH, v); int idx0 = IDX0(PROH, v);
int idx1 = IDX1(PROH, v); int idx1 = IDX1(PROH, v);
int idx2 = IDX2(PROH, v); int idx2 = IDX2(PROH, v);
@ -107,7 +109,7 @@ compose_sym2(nameprep_prohibited_, VERSION) (unsigned long v) {
} }
static int static int
compose_sym2(nameprep_unassigned_, VERSION) (unsigned long v) { compose_sym2(nameprep_unassigned_, VERSION) (PRUint32 v) {
int idx0 = IDX0(UNAS, v); int idx0 = IDX0(UNAS, v);
int idx1 = IDX1(UNAS, v); int idx1 = IDX1(UNAS, v);
int idx2 = IDX2(UNAS, v); int idx2 = IDX2(UNAS, v);
@ -122,7 +124,7 @@ compose_sym2(nameprep_unassigned_, VERSION) (unsigned long v) {
} }
static idn_biditype_t static idn_biditype_t
compose_sym2(nameprep_biditype_, VERSION) (unsigned long v) { compose_sym2(nameprep_biditype_, VERSION) (PRUint32 v) {
int idx0 = IDX0(BIDI, v); int idx0 = IDX0(BIDI, v);
int idx1 = IDX1(BIDI, v); int idx1 = IDX1(BIDI, v);
int idx2 = IDX2(BIDI, v); int idx2 = IDX2(BIDI, v);

Просмотреть файл

@ -47,6 +47,8 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#include "prtypes.h"
/* /*
* libidnkit result code. * libidnkit result code.
*/ */
@ -96,12 +98,12 @@ typedef struct idn_nameprep *idn_nameprep_t;
/* race.c */ /* race.c */
idn_result_t race_decode_decompress(const char *from, idn_result_t race_decode_decompress(const char *from,
unsigned short *buf, PRUint16 *buf,
size_t buflen); size_t buflen);
idn_result_t race_compress_encode(const unsigned short *p, idn_result_t race_compress_encode(const PRUint16 *p,
int compress_mode, int compress_mode,
char *to, size_t tolen); char *to, size_t tolen);
int get_compress_mode(unsigned short *p); int get_compress_mode(PRUint16 *p);
/* nameprep.c */ /* nameprep.c */
@ -136,8 +138,8 @@ idn_nameprep_destroy(idn_nameprep_t handle);
* idn_buffer_overflow -- result buffer is too small. * idn_buffer_overflow -- result buffer is too small.
*/ */
idn_result_t idn_result_t
idn_nameprep_map(idn_nameprep_t handle, const unsigned long *from, idn_nameprep_map(idn_nameprep_t handle, const PRUint32 *from,
unsigned long *to, size_t tolen); PRUint32 *to, size_t tolen);
/* /*
* Check if an UCS4 string 'str' contains any prohibited characters specified * Check if an UCS4 string 'str' contains any prohibited characters specified
@ -151,8 +153,8 @@ idn_nameprep_map(idn_nameprep_t handle, const unsigned long *from,
* result.) * result.)
*/ */
idn_result_t idn_result_t
idn_nameprep_isprohibited(idn_nameprep_t handle, const unsigned long *str, idn_nameprep_isprohibited(idn_nameprep_t handle, const PRUint32 *str,
const unsigned long **found); const PRUint32 **found);
/* /*
* Check if an UCS4 string 'str' contains any unassigned characters specified * Check if an UCS4 string 'str' contains any unassigned characters specified
@ -166,8 +168,8 @@ idn_nameprep_isprohibited(idn_nameprep_t handle, const unsigned long *str,
* result.) * result.)
*/ */
idn_result_t idn_result_t
idn_nameprep_isunassigned(idn_nameprep_t handle, const unsigned long *str, idn_nameprep_isunassigned(idn_nameprep_t handle, const PRUint32 *str,
const unsigned long **found); const PRUint32 **found);
/* /*
* Check if an UCS4 string 'str' is valid string specified by ``bidi check'' * Check if an UCS4 string 'str' is valid string specified by ``bidi check''
@ -180,8 +182,8 @@ idn_nameprep_isunassigned(idn_nameprep_t handle, const unsigned long *str,
* Check '*found' to see the result.) * Check '*found' to see the result.)
*/ */
idn_result_t idn_result_t
idn_nameprep_isvalidbidi(idn_nameprep_t handle, const unsigned long *str, idn_nameprep_isvalidbidi(idn_nameprep_t handle, const PRUint32 *str,
const unsigned long **found); const PRUint32 **found);

Просмотреть файл

@ -397,8 +397,8 @@ nsresult nsIDNService::stringPrep(const nsAString& in, nsAString& out)
idn_result_t idn_err; idn_result_t idn_err;
PRUint32 namePrepBuf[kMaxDNSNodeLen * 3]; // map up to three characters PRUint32 namePrepBuf[kMaxDNSNodeLen * 3]; // map up to three characters
idn_err = idn_nameprep_map(mNamePrepHandle, (const unsigned long*) ucs4Buf, idn_err = idn_nameprep_map(mNamePrepHandle, (const PRUint32 *) ucs4Buf,
(unsigned long*) namePrepBuf, kMaxDNSNodeLen * 3); (PRUint32 *) namePrepBuf, kMaxDNSNodeLen * 3);
NS_ENSURE_TRUE(idn_err == idn_success, NS_ERROR_FAILURE); NS_ENSURE_TRUE(idn_err == idn_success, NS_ERROR_FAILURE);
nsAutoString namePrepStr; nsAutoString namePrepStr;
@ -413,15 +413,15 @@ nsresult nsIDNService::stringPrep(const nsAString& in, nsAString& out)
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
// prohibit // prohibit
const unsigned long *found = nsnull; const PRUint32 *found = nsnull;
idn_err = idn_nameprep_isprohibited(mNamePrepHandle, idn_err = idn_nameprep_isprohibited(mNamePrepHandle,
(const unsigned long*) ucs4Buf, &found); (const PRUint32 *) ucs4Buf, &found);
if (idn_err != idn_success || found) if (idn_err != idn_success || found)
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
// check bidi // check bidi
idn_err = idn_nameprep_isvalidbidi(mNamePrepHandle, idn_err = idn_nameprep_isvalidbidi(mNamePrepHandle,
(const unsigned long*) ucs4Buf, &found); (const PRUint32 *) ucs4Buf, &found);
if (idn_err != idn_success || found) if (idn_err != idn_success || found)
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;

Просмотреть файл

@ -64,9 +64,9 @@ enum {
idn_result_t idn_result_t
race_decode_decompress(const char *from, unsigned short *buf, size_t buflen) race_decode_decompress(const char *from, PRUint16 *buf, size_t buflen)
{ {
unsigned short *p = buf; PRUint16 *p = buf;
unsigned int bitbuf = 0; unsigned int bitbuf = 0;
int bitlen = 0; int bitlen = 0;
unsigned int i, j; unsigned int i, j;
@ -108,7 +108,7 @@ race_decode_decompress(const char *from, unsigned short *buf, size_t buflen)
buf[j] = (buf[i] << 8) + buf[i + 1]; buf[j] = (buf[i] << 8) + buf[i + 1];
len = j; len = j;
} else { } else {
unsigned short c = buf[0] << 8; /* higher octet */ PRUint16 c = buf[0] << 8; /* higher octet */
for (i = 1, j = 0; i < len; j++) { for (i = 1, j = 0; i < len; j++) {
if (buf[i] == RACE_ESCAPE) { if (buf[i] == RACE_ESCAPE) {
@ -138,10 +138,10 @@ race_decode_decompress(const char *from, unsigned short *buf, size_t buflen)
} }
idn_result_t idn_result_t
race_compress_encode(const unsigned short *p, int compress_mode, race_compress_encode(const PRUint16 *p, int compress_mode,
char *to, size_t tolen) char *to, size_t tolen)
{ {
unsigned long bitbuf = *p++; /* bit stream buffer */ PRUint32 bitbuf = *p++; /* bit stream buffer */
int bitlen = 8; /* # of bits in 'bitbuf' */ int bitlen = 8; /* # of bits in 'bitbuf' */
while (*p != '\0' || bitlen > 0) { while (*p != '\0' || bitlen > 0) {
@ -208,10 +208,10 @@ race_compress_encode(const unsigned short *p, int compress_mode,
} }
int int
get_compress_mode(unsigned short *p) { get_compress_mode(PRUint16 *p) {
int zero = 0; int zero = 0;
unsigned int upper = 0; unsigned int upper = 0;
unsigned short *modepos = p - 1; PRUint16 *modepos = p - 1;
while (*p != '\0') { while (*p != '\0') {
unsigned int hi = *p++ & 0xff00; unsigned int hi = *p++ & 0xff00;