aboutsummaryrefslogtreecommitdiff
path: root/src/stringprep/stringprep_drv.c
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2003-10-08 18:27:48 +0000
committerAlexey Shchepin <alexey@process-one.net>2003-10-08 18:27:48 +0000
commit8e7106dd748b8b07da95f91a328ef145dc002997 (patch)
tree3f8f01715e1059c936268a90cd59b105a71e9fc1 /src/stringprep/stringprep_drv.c
parent* (all): Changed JID storage format, added support for stringprep (diff)
* src/ejabberd_c2s.erl: Added support for "jid-malformed" error
* src/stringprep/stringprep_drv.c: Bugfix SVN Revision: 145
Diffstat (limited to '')
-rw-r--r--src/stringprep/stringprep_drv.c64
1 files changed, 47 insertions, 17 deletions
diff --git a/src/stringprep/stringprep_drv.c b/src/stringprep/stringprep_drv.c
index a8cd06bcf..906ea6207 100644
--- a/src/stringprep/stringprep_drv.c
+++ b/src/stringprep/stringprep_drv.c
@@ -152,17 +152,17 @@ static int stringprep_erl_control(ErlDrvData drv_data,
int i, j, pos=1;
unsigned char c;
int bad = 0;
- int uc, ruc;
+ int uc = 0, ruc;
int size;
int info;
- int prohibit, tolower;
+ int prohibit = 0, tolower = 0;
char *rstring;
int *mc;
int *str32;
int str32len, str32pos = 0;
int decomp_len, decomp_shift;
- int comp_pos;
- int cclass1, cclass2;
+ int comp_pos, comp_starter_pos;
+ int cclass1, cclass2, cclass_prev;
int ch1, ch2;
size = len + 1;
@@ -214,7 +214,7 @@ static int stringprep_erl_control(ErlDrvData drv_data,
} else if(c < 0xF0) {
if(i+2 < len && (buf[i+1] & 0xC0) == 0x80 &&
(buf[i+2] & 0xC0) == 0x80) {
- uc = ((c & 0x1F) << 12) | ((buf[i+1] & 0x1F) << 6)
+ uc = ((c & 0x0F) << 12) | ((buf[i+1] & 0x3F) << 6)
| (buf[i+2] & 0x3F);
i += 2;
} else {
@@ -232,12 +232,13 @@ static int stringprep_erl_control(ErlDrvData drv_data,
}
info = GetUniCharInfo(uc);
- if(info & prohibit) {
- *rbuf = rstring;
- driver_free(str32);
- return 1;
- }
+ //if(info & prohibit) {
+ // *rbuf = rstring;
+ // driver_free(str32);
+ // return 1;
+ //}
+ //printf("Got %x\r\n", uc);
if(!(info & B1Mask))
{
@@ -291,31 +292,60 @@ static int stringprep_erl_control(ErlDrvData drv_data,
return 1;
}
+ //printf("\r\n");
+ //printf("DECOMPOSED:\t");
+ //for(i = 0; i < str32pos; i++)
+ // printf("%4x ", str32[i]);
+ //printf("\r\n");
+
canonical_ordering(str32, str32pos);
- comp_pos = 0;
+ //printf("ORDERED:\t");
+ //for(i = 0; i < str32pos; i++)
+ // printf("%4x ", str32[i]);
+ //printf("\r\n");
+
+ comp_pos = 1;
+ comp_starter_pos = 0;
ch1 = str32[0];
cclass1 = GetUniCharCClass(ch1);
+ cclass_prev = cclass1;
for(i = 1; i < str32pos; i++)
{
ch2 = str32[i];
cclass2 = GetUniCharCClass(ch2);
//printf("Compose: %x + %x = %x\r\n", ch1, ch2, compose(ch1, ch2));
- if(cclass1 == 0 && cclass1 < cclass2 && (ruc = compose(ch1, ch2))) {
+ if(cclass1 == 0 && cclass2 > cclass_prev && (ruc = compose(ch1, ch2))) {
ch1 = ruc;
} else {
- str32[comp_pos] = ch1;
- comp_pos++;
- ch1 = ch2;
+ if(cclass2 == 0) {
+ str32[comp_starter_pos] = ch1;
+ comp_starter_pos = comp_pos++;
+ ch1 = ch2;
+ cclass1 = cclass_prev = 0;
+ } else {
+ str32[comp_pos++] = ch2;
+ cclass_prev = cclass2;
+ }
}
}
- str32[comp_pos] = ch1;
- str32pos = comp_pos+1;
+ str32[comp_starter_pos] = ch1;
+ str32pos = comp_pos;
+ //printf("COMPOSED:\t");
+ //for(i = 0; i < str32pos; i++)
+ // printf("%4x ", str32[i]);
+ //printf("\r\n");
for(i = 0; i < str32pos; i++)
{
ruc = str32[i];
+ info = GetUniCharInfo(ruc);
+ if(info & prohibit) {
+ *rbuf = rstring;
+ driver_free(str32);
+ return 1;
+ }
ADD_UCHAR(ruc);
}